Python'un scikit-image modülüyle görüntü segmentasyonuna genel bakış

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.

Yavaş Haber · Karakterler | Ulusal bilimsel ve teknolojik başarılarından dolayı dört akademisyen sınav görevlisi olarak değerlendirildi! Çalıştığı IoT işletim sistemi "düşünecek"
önceki
Stüssy tatil dizisi açıklandı! Sıradan Stüssy hala trendlerle dolu!
Sonraki
200.000 orta seviye arabadan en rahat olanları bunlar!
Aaron Kwok, Zhang Jiahui, Zheng Xiuwen ve Zhang Guoli kutu gibidir, Media Asia filmleri büyük hamlelere ihtiyaç duyar!
İade oranınızı artırabilecek bir çanta! BAPE x PORTER 2017 yeni ortak çanta serisi
Dandelion X5 yönlendirici, şirketin uzaktan video gözetimini kolayca yönetmenize yardımcı olur
Testere | Orta olarak çiçeklerle, bağ olarak bahar, lütfen buraya "Şeftali Ormanı Bin Mu" ile karşılaşmak için gelin
Uyuyor musun? Neden kalkıp uykunuzu kategorilere ayırmıyorsunuz?
Fazla mesai yapmak için fazla doygun mu? Verimli ofis ekipmanları sizi kurtarır
"Kara Parti": Nasıl gülüyorsun, bırak ağlıyorsun
Yuncong Technology ve Shanghai Jiaotong Üniversitesi AAAI Seçilmiş Makale Yorumlama: Anlamsal Rol Etiketleme için Yeni Fikirler
Akıllı uzak ofis, kurumsal yönlendiriciler de çok Skr olabilir
"Dilin ucu" ekibi yeni çalışmaları tekrar zorlayacak ve okuduktan hemen sonra kilo vermeyi bırakacak!
Taoshan Ormancılık Bürosu "Lin Zhuanyou" renkli bir dünya turu
To Top