Lei Feng.com Yapay Zeka Teknolojisi İnceleme Basın, her geçen yıl yapay zeka teknolojisinin popülaritesiyle, bilgisayar görüşü alanında giderek daha fazla insan ilgili araştırmalara dahil oluyor. Görüntü bölümleme, görüntü işlemede çok önemli bir adımdır ve bir görüntüyü benzersiz özelliklere sahip bir dizi belirli bölgeye bölen ve ilgili nesneleri çıkaran bir teknolojidir.
Son zamanlarda, mühendis Parul Pandey, python'un scikit-görüntü kitaplığıyla görüntü bölümleme yöntemini tanıttığı bir blog yazısı yayınladı. Spesifik olarak, scikit görüntüsünün kurulumunu, görüntü içe aktarmayı ve denetimli ve denetimsiz algoritmaları kullanarak görüntü bölümleme yöntemlerini içerir. Leifeng.com AI Technology Review aşağıdaki gibi derlenmiş ve düzenlenmiştir.
Er ya da geç, görüntüler dahil her şey dijitaldir.
"Terminatör" ü izlemiş olanlar kesinlikle bunun o dönemin en büyük bilim kurgu filmi olduğunu düşüneceklerdir. Bu filmde James Cameron, izleyicinin Terminatör olarak bilinen cyborg'un gözlerinin arkasına saklanmasını mümkün kılan ilginç bir görsel efekt kavramı sunuyor. Bu etkiye "sonlandırıcı vizyon" denir ve kişiyi arka plandan bir ölçüde ayırır. O zamanlar bu bir fantezi gibi geliyordu, ancak bugün görüntü bölümleme birçok görüntü işleme teknolojisinin önemli bir parçası haline geldi.
Resim parçalama
Photoshop veya benzeri grafik editörlerinin bir kişiyi bir resimden diğerine götürmek için sonsuz olanaklar sunduğunu hepimiz biliyoruz. Ancak bunu yapmak için öncelikle görüntü bölümleme teknolojisinin kullanılmasını gerektiren kaynak görüntüdeki kişinin konumunu belirlemeniz gerekir. Görüntü analizi için yazılmış birçok kütüphane var. Bu yazıda, python tabanlı görüntü işleme kitaplığı scikit-image'ı ayrıntılı olarak tartışacağız.
Tam koda, bu makaleyle ilişkili Github deposundan da erişilebilir.
Scikit resmi
SciKit Image, görüntü işlemeye adanmış bir python paketidir.
Kurulum
Scikit-image'ı aşağıdaki gibi kurabilirsiniz:
pip install -U scikit-image (Linux ve OSX)
pip install scikit-image (Windows)
# Conda tabanlı dağıtımlar için
conda scikit imajını yükle
Python'da görüntü işlemeye genel bakış
Görüntü bölütleme teknolojisini kullanmadan önce, scikit görüntüsünü ve görüntüleri nasıl işlediğini anlamak gerekir.
Gri tonlamalı görüntüleri skimage kitaplığından içe aktarın
Önemsiz veri modülü, genellikle jpeg veya png biçiminde saklanan bazı yerleşik örnek veri kümeleri içerir.
skimage içe aktarma verilerinden
numpy'yi np olarak içe aktar
matplotlib.pyplot dosyasını plt olarak içe aktar
image = data.binary_blobs
plt.imshow (resim, cmap = 'gri')
Renkli görüntüleri skimage kitaplığından içe aktarın
skimage içe aktarma verilerinden
numpy'yi np olarak içe aktar
matplotlib.pyplot dosyasını plt olarak içe aktar
image = data.astronaut
plt.imshow (resim)
Dış kaynaklardan görüntüleri içe aktarın
# G / Ç modülü, görüntüyü içe aktarmak için kullanılır
skimage içe aktarma verilerinden
numpy'yi np olarak içe aktar
matplotlib.pyplot dosyasını plt olarak içe aktar
skimage import io'dan
image = io.imread ('skimage_logo.png')
plt.imshow (resim);
Birden çok görüntü yükleyin
images = io.ImageCollection ('../ resimler / *. png: ../ resimler / *. jpg')
print ('Tür:', yazın (resimler))
images.files
Çıkış: Tür:
Resmi Kaydet
# Dosyayı'logo.png 'olarak kaydetme
io.imsave ('logo.png', logo)
Resim parçalama
Artık scikit-image'ı anladığımıza göre, görüntü segmentasyonu hakkında daha fazla bilgi edinelim. Görüntü bölümleme, esasen, görüntünün temsilini daha anlamlı ve analiz etmesi daha kolay olan bir şeye basitleştirmek veya değiştirmek için dijital bir görüntüyü birden çok bölüme ayırma işlemidir.
Bu makalede, segmentasyon sürecini ele almak için denetlenen ve denetimsiz algoritmaları birleştiriyoruz.
Scikit görüntü kitaplığında bulunan bazı bölümleme algoritmaları
Denetimli segmentasyon algoritması : İnsan girdisinden gelebilecek bazı ön bilgiler, algoritmayı yönlendirmek için kullanılır.
Denetimsiz segmentasyon algoritması : Ön bilgi gerekmez. Bu algoritmalar, görüntüyü otomatik olarak anlamlı alanlara ayırmaya çalışır. Kullanıcılar yine de istenen çıktıyı elde etmek için bazı ayarları değiştirebilirler.
En basit eşik segmentasyon algoritması ile başlayalım.
Eşik algoritması
Belirli bir eşiğin üstündeki veya altındaki pikselleri seçerek nesneyi arka plandan ayırmanın en kolay yolu budur. Pekin segmentasyonunda bu genellikle çok kullanışlı bir yöntemdir. Daha fazla bilgi için lütfen şu adrese bakın:
Bunu scikit-image veri kümesindeki bir ders kitabı görüntüsü üzerinde deneyelim.
Temel giriş
numpy'yi np olarak içe aktar
matplotlib.pyplot dosyasını plt olarak içe aktar
skimage.data verilerini veri olarak içe aktar
skimage.segmentation'ı segment olarak içe aktar
skimage.filtreleri filtre olarak içe aktar
skimage.draw'ı içe aktar
skimage.color'u renk olarak içe aktar
Bir görüntü çizmek için basit işlev:
def image_show (resim, nrows = 1, ncols = 1, cmap = 'gri'):
incir, ax = plt.subplots (nrows = nrows, ncols = ncols, figsize = (14, 14))
ax.imshow (resim, cmap = 'gri')
ax.axis ('kapalı')
dönüş incir, balta
görüntü
text = data.page
image_show (metin)
Bu görüntü biraz karanlık, ancak yine de herhangi bir gelişmiş algoritma kullanmadan resmi makul şekilde bölümlere ayırabilen bir değer seçebiliriz. Bu segmentasyon eşiğini elde etmek için bir histogram kullanacağız.
Histogram, bir görüntüdeki farklı yoğunluk değerlerine sahip piksellerin sayısını gösteren bir grafiktir. Basitçe ifade etmek gerekirse, histogram, X ekseninin görüntüdeki tüm piksel değerlerini ve Y ekseninin bu değerlerin frekansını gösterdiği bir grafiktir.
incir, balta = plt. alt çanaklar (1, 1)
ax.hist (text.ravel, bin = 32, aralık =)
ax.set_xlim (0, 256);
Örneğimiz 8 bitlik bir görüntüdür, dolayısıyla X ekseninde toplam 256 olası değer vardır. Resimde 0 siyah, 255 beyaz anlamına gelir.Bazı piksel değerlerinin yoğunlaştığını gözlemliyoruz. Bu büyük olasılıkla metnimizin açık renkli arka planından kaynaklanırken, diğer bölümler biraz belirsizdir. İdeal bir segmentasyon histogramının iki tepe noktası olmalıdır ve iki tepe arasında çok uzak olmalıdır, böylece eşik olarak iki tepe arasında bir sayı seçebiliriz. Şimdi basit bir eşik yöntemine göre görüntüyü bölümlere ayırmaya çalışalım.
Denetlenen eşik
Eşik bizim tarafımızdan seçildiği için, buna denetim eşiği diyoruz.
text_segmented = text > (histogramdan elde edilen değer, yani 50,70,120)
image_show (text_segmented);
Metin > 50
Metin > 70
Metin > 120
Sol taraftaki gölge sorun yaratacağı için istediğimiz sonucu alamadık, hadi denetimsiz eşiği deneyelim.
Denetimsiz eşik
scikit-image birçok otomatik eşik ayarlama yöntemine sahiptir ve en iyi eşiği seçerken manuel giriş gerekmez. Yaygın olarak kullanılan yöntemler otsu, li, local ve benzerleridir.
text_threshold = filters.threshold_ # Tüm yöntemleri almak için imleç alt çizgiden sonra olacak şekilde sekmeye basın.
image_show (metin
otsu algoritması bölütleme etki diyagramı
li algoritması bölütleme etki diyagramı
Yerel algoritmada blok boyutunu da belirlememiz gerekir. ofset, daha iyi sonuçlar için görüntüyü ayarlamaya yardımcı olur.
text_threshold = filters.threshold_local (text, block_size = 51, offset = 10)
image_show (metin > text_threshold);
yerel eşik yöntemi bölütleme etkisi haritası
Bu iyi bir yöntemdir, gürültüyü büyük ölçüde ortadan kaldırır.
Denetimli segmentasyon
Eşik bölümleme çok temel bir bölümleme yöntemidir, ancak yüksek kontrastlı görüntülerde çok iyi çalışmaz, bu nedenle daha gelişmiş algoritmalar kullanmamız gerekir.
Bu bölümde, ücretsiz bir örnek görüntü kullanacağız ve denetimli bölümleme teknolojisini kullanarak görüntüdeki insan kafasını bölümlere ayırmaya çalışacağız.
# görüntüyü içe aktarın
skimage import io'dan
image = io.imread ('girl.jpg')
plt.imshow (resim);
Kaynak resim
Küçük ipucu: Görüntünün herhangi bir bölümlemesinden önce, onu denoize etmek için bazı filtreler kullanmak en iyisidir.
Bununla birlikte, örneğimizde, görüntüdeki gürültü çok küçük olduğundan doğrudan onunla ilgileniyoruz. Yapacağımız bir sonraki şey, görüntüyü gri tonlamaya dönüştürmek için rgb2gray kullanmaktır.
image_gray = color.rgb2gray (resim)
image_show (resim_gri);
Tamamen farklı prensiplere sahip iki segmentasyon yöntemi kullanacağız.
Aktif Kontur segmentasyonu
Aktif kontur segmentasyonu, ilgilenilen alanın etrafında başlatmak için kullanıcı tanımlı bir kontur veya çizgi kullanır ve ardından kontur yavaşça küçülür.
Örnek resmimiz için, ana hatları başlatmak için insan kafasının etrafına bir daire çizelim.
def circle_points (çözünürlük, merkez, yarıçap):
"" "Bir görüntü üzerinde bir daire tanımlayan noktalar oluşturun. Merkez, dairenin merkezini ifade eder" ""
radyan = np.linspace (0, 2 * np.pi, çözünürlük)
c = merkez + yarıçap * np.cos (radyan) #polar koordinatlar
r = merkez + yarıçap * np.sin (radyan)
dönüş np.array (). T
# Son noktayı hariç tut çünkü kapalı bir yolda yinelenen noktalar olmamalıdır
puan = circle_points (200 ,, 80)
Halkanın kenar noktasının x koordinatı ve y koordinatı yukarıda hesaplanmıştır. Çözünürlük değerini 200 olarak ayarladık, ardından bu tür 200 puan hesaplanacak.
incir, balta = image_show (resim)
ax.plot (puanlar, noktalar, '- r', lw = 3)
Ardından, algoritma, yüzün kenarına kapalı bir eğri uydurarak yüzü görüntünün geri kalanından ayırır.
yılan = seg.active_contour (image_gray, puanlar)
incir, balta = image_show (resim)
ax.plot (puanlar, noktalar, '- r', lw = 3)
ax.plot (yılan, yılan, '- b', lw = 3);
Alfa ve beta parametrelerini ayarlayabiliriz. Alfa değeri ne kadar yüksekse, kontur o kadar hızlı küçülür ve beta ne kadar büyük olursa, küçülme o kadar yavaş olur.
yılan = seg.active_contour (image_gray, points, alpha = 0.06, beta = 0.3)
incir, balta = image_show (resim)
ax.plot (puanlar, noktalar, '- r', lw = 3)
ax.plot (yılan, yılan, '- b', lw = 3);
Rastgele yürüteç ayrımı
Bu yöntemde, kullanıcı etkileşimli olarak etiketler adı verilen az sayıda pikseli işaretler. Ardından, işaretlenmemiş her pikselin rastgele bir yürüteç yayınladığını varsayalım ve ardından rastgele yürüteçin işaretlenmemiş her pikselden başlayarak önceden işaretlenmiş bir piksele ulaşma olasılığı belirlenebilir. Her piksel hesaplanan en büyük olasılık değerine sahip etikete atanarak, yüksek kaliteli bölümlenmiş bir görüntü elde edilebilir.
Daha fazla ilgili bilgi için lütfen referansı okuyun: https://ieeexplore.ieee.org/document/1704833.
Burada önceki örnekteki çekirdek değerini yeniden kullanacağız. Basit olması için daireleri kullanmaya devam edelim.
image_labels = np.zeros (image_gray.shape, dtype = np.uint8)
Rastgele Walker algoritması, girdi olarak bir etiket görüntüsü gerektirir. Böylece kişinin tüm yüzünü çevreleyen daha büyük bir daireye ve yüzün ortasına yakın küçük bir daireye sahip olacağız.
indices = draw.circle_perimeter (80, 250,20) # buradan
image_labels = 1
image_labels = 2
image_show (resim_etiketleri);
Şimdi rastgele bir yürüteç kullanalım ve neler olduğunu gözlemleyelim.
image_segmented = seg.random_walker (image_gray, image_labels)
# Sonuçlarımızı kontrol edin
incir, balta = image_show (image_gray)
ax.imshow (image_segmented == 1, alpha = 0.3);
Yüzün kenarlarını beklediğimiz gibi göstermiyor. Bu sorunu çözmek için beta parametresini istenen sonuç elde edilene kadar ayarlayabiliriz. Birkaç denemeden sonra, beta değeri 3000 olduğunda segmentasyon etkisinin iyi olduğunu görebiliriz.
image_segmented = seg.random_walker (image_gray, image_labels, beta = 3000)
# Sonuçlarımızı kontrol edin
incir, balta = image_show (image_gray)
ax.imshow (image_segmented == 1, alpha = 0.3);
Yukarıdakiler denetimli bölümlemedir Bu algoritmada, belirli girdileri sağlamalı ve ayrıca belirli parametreleri ayarlamalıyız. Ancak, her zaman insanların önce bir resme bakmasına ve ardından neyi girip nereden başlayacağına karar vermesine izin veremeyiz. Neyse ki bu durum için denetimsiz bölümleme tekniklerini kullanabiliriz.
Denetimsiz segmentasyon
Denetimsiz bölümleme, görüntü hakkında önceden bilgi sahibi olmayı gerektirmez. Bir görüntü çok büyük olduğunda, tüm pikselleri aynı anda dikkate almak imkansızdır. Bu nedenle, bu durumda denetimsiz bölümleme, görüntüyü birkaç alt bölgeye ayırabilir ve milyonlarca pikseli değiştirmek için onlarca ila yüzlerce bölgeyi kullanabilirsiniz. İşte iki denetimsiz segmentasyon algoritması:
SLIC (Basit Doğrusal Yinelemeli Kümeleme)
SLIC algoritması aslında k-araçları adı verilen bir makine öğrenme algoritması kullanır. Görüntünün tüm piksel değerlerini alır ve bunları belirli sayıda alt bölgeye ayırmaya çalışır.
Daha fazla ilgili içerik için lütfen ilgili materyalleri okuyun: https://ieeexplore.ieee.org/document/6205760.
SLIC renkli resimleri işler, bu nedenle biz orijinal resmi kullanacağız.
image_slic = seg.slic (resim, n_segments = 155)
Tek yaptığımız, görüntünün her bir alt görüntüsünü veya alt bölge pikselini, bölgenin piksellerinin ortalama değerine ayarlamaktır.
# label2rgb, her bir ayrı etiketi ortalama iç mekan rengiyle değiştirir
image_show (color.label2rgb (image_slic, image, tür = 'ortalama'));
Bu görüntüyü 512 * 512 = 262000 pikselden 155 alana düşürdük.
Felzenszwalb algoritması
Algoritma ayrıca bir makine öğrenimi algoritması, minimum yayılma ağacı kümeleme algoritması kullanır. Felzenszwaib algoritması, görüntünün kaç kümeye bölüneceğini bize söylemez. Çalışacak ve bunun için olabildiğince çok küme oluşturacaktır. İlgili referans belgeleri burada bulunabilir.
image_felzenszwalb = seg.felzenszwalb (resim)
image_show (image_felzenszwalb);
Birçok alan var, bağımsız alanların sayısını sayıyoruz.
np.unique (image_felzenszwalb) .size
3368
Şimdi SLIC algoritmasında yaptığımız gibi bölgesel piksellerin ortalamasını kullanarak onları yeniden renklendirelim.
image_felzenszwalb_colored = color.label2rgb (image_felzenszwalb, resim, tür = 'ortalama')
image_show (image_felzenszwalb_colored);
Şimdi görüntüyü uygun küçük alanlara böldük. Görüntüyü daha az alana bölmek istersek, ölçek parametresini değiştirebilir veya bunları birleştirmeye devam edebiliriz. Bu yönteme bazen aşırı segmentasyon denir.
Bu daha çok bölünmüş bir görüntüye benziyor, bu da esasen renk sayısını azaltıyor. Bunları yeniden birleştirmek için bölgesel bir bitiş grafiği (RAG) kullanabilirsiniz, ancak bu, bu makalenin kapsamı dışındadır.
sonuç olarak
Görüntü bölümleme, görüntü işlemede çok önemli bir adımdır. Bilgisayarla görmeden tıbbi görüntülere, ulaşım ve video gözetlemeden diğer alanlara kadar geniş bir uygulama yelpazesine sahip sıcak bir araştırma alanıdır. Python scikit-image, görüntü işleme için çok sayıda algoritmaya sahip çok güçlü bir kütüphane sağlar. Ücretsizdir, herhangi bir kısıtlama yoktur ve arkasında aktif bir topluluk vardır. Kitaplık ve kullanım senaryoları hakkında daha fazla bilgi edinmek için belgelerine bakabilirsiniz.
aracılığıyla: https://towardsdatascience.com/image-segmentation-using-pythons-scikit-image-module-533a61ecc980
Lei Feng.com AI Technology Review tarafından derlenmiştir.