- 1. Segmentasyon ve konturlar
- 2. Hiyerarşi ve Erişim Modu
- 3. Konturları Yaklaşım ve Konveks Kabuklarını Bulma
- 4. Dışbükey Gövde
- 5. Konturu şekillere göre eşleştirme
- 6. Şekilleri Tanımlama (daire, dikdörtgen, üçgen, kare, yıldız)
- 7. Hat Tespiti
- 8. Blob algılama
- 9. Lekeleri Filtreleme - Daireleri ve Elipsleri Sayma
Önceki eğitimlerde, temel görüntü işleme için OpenCV'yi kullandık ve bazı gelişmiş görüntü düzenleme işlemleri yaptık. Bildiğimiz gibi OpenCV, C ++, Python ve Java arayüzlerine sahip, Windows, Linux, Mac OS, iOS ve Android'i destekleyen Açık Kaynak Banliyö Görme Kitaplığıdır. Böylece Python ve Linux ortamı ile Raspberry Pi'ye kolaylıkla kurulabilir. Ve OpenCV ve ekli kameralı Raspberry Pi, Yüz algılama, yüz kilidi, nesne izleme, araç plakası algılama, Ev güvenlik sistemi vb. Gibi birçok gerçek zamanlı görüntü işleme uygulaması oluşturmak için kullanılabilir. Bu eğitimde nasıl yapılacağını öğreneceğiz. OpenCV kullanarak görüntü bölümleme. Yapacağımız işlemler aşağıda listelenmiştir:
- Segmentasyon ve konturlar
- Hiyerarşi ve geri alma modu
- Konturları yaklaştırmak ve dışbükey gövdelerini bulmak
- Conex Hull
- Eşleşen Kontur
- Şekilleri Tanımlama (daire, dikdörtgen, üçgen, kare, yıldız)
- Hat tespiti
- Blob algılama
- Blobları filtreleme - çemberleri ve elipsleri sayma
1. Segmentasyon ve konturlar
Görüntü bölümleme, görüntüleri farklı bölgelere ayırdığımız bir işlemdir. Oysa hatları sürekli çizgiler veya bağlı ya da bir görüntü içinde bir nesnenin tam sınır kapsayacak eğrileridir. Ve burada, bir görüntünün parçalarını çıkarmak için kontur adı verilen görüntü bölütleme tekniğini kullanacağız.
Ayrıca konturlar çok önemlidir
- Nesne algılama
- Şekil analizi
Ve gerçek dünya görüntü analizinden, MRI'lar gibi tıbbi görüntü analizine kadar çok geniş bir uygulama alanına sahiptirler.
Opencv'de karelerin konturlarını çıkararak konturları nasıl uygulayacağımızı öğrenelim.
ithalat cv2 ithalat numpy np olarak
3 siyah kareli basit bir resim yükleyelim
image = cv2.imread ('squares.jpg') cv2.imshow ('giriş resmi', resim) cv2.waitKey (0)
Gri tonlamalı
gray = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY)
Eğimli kenarları bulun
kenarlı = cv2.Canny (gri, 30,200) cv2.imshow ('keskin kenarlar', kenarlı) cv2.waitKey (0)
Kontür bulma
# görüntünüzün bir kopyasını kullanın, örneğin - edged.copy (), çünkü konturları bulmak görüntüyü değiştirir # OpenCV sürümünün yükseltilmesi nedeniyle boş bir argüman olarak konturlardan önce _ eklememiz gerekir _, contours, hierarchy = cv2.findContours (kenarlı, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('konturlamadan sonra keskin kenarlar', kenarlı) cv2.waitKey (0)
Konturların hangi konturlardan oluştuğunu bilmek için kontur dosyasını yazdırma
print (konturlar) print ('Bulunan kontur sayısı =' + str (uzunluk (kontür)))
Tüm konturları çizin
# Tüm konturları çizmek için 3. parametre olarak -1'i kullanın cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Konsol Çıkışı -],],], …,],],]], dtype = int32), dizi(],],
], …,
],],]], dtype = int32), dizi (],],], …,],],]], dtype = int32)]
Bulunan kontur sayısı = 3. Böylece toplam üç kontur bulduk.
Şimdi, yukarıdaki kodda , kullanarak kontur dosyasını da yazdırmıştık , bu dosya, yukarıdaki konsol çıktısında yazdırıldığı gibi bu konturların nasıl göründüğünü anlatıyor.
Yukarıdaki konsol çıktısında, x, y noktalarının koordinatlarına benzeyen bir matrisimiz var. OpenCV, konturları bir liste listesinde saklar. Yukarıdaki konsol çıktısını aşağıdaki gibi basitçe gösterebiliriz:
KONTUR 1 KONTUR 2 KONTUR 3
], dizi (], dizi (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Şimdi, kontur dosyasında uzunluk fonksiyonunu kullandığımızda, 3'e eşit uzunluk elde ederiz, bu, bu dosyada üç liste listesi olduğu anlamına gelir, yani üç kontur.
Şimdi, CONTOUR 1'in bu dizideki ilk eleman olduğunu ve bu listenin tüm koordinatların listesini içerdiğini ve bu koordinatların yeşil dikdörtgen kutular olarak az önce gördüğümüz konturlar boyunca noktalar olduğunu hayal edin.
Bu koordinatları saklamak için farklı yöntemler vardır ve bunlara yaklaşım yöntemleri denir, temelde yaklaşık yöntem iki türdendir
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.
cv2.CHAIN_APPROX_SIMPLE bunun yerine sınırlayıcı konturların yalnızca başlangıç ve bitiş noktalarını sağlar; sonuç, kontur bilgilerinin çok daha verimli depolanmasıdır.
_, konturlar, hiyerarşi = cv2.findContours (kenarlı, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Yukarıdaki kodda cv2.RETR_EXTERNAL geri alma modudur, cv2.CHAIN_APPROX_NONE ise
yaklaşım yöntemi.
Böylece konturları ve yaklaşım yöntemini öğrendik, şimdi hiyerarşi ve geri alma modunu inceleyelim.
2. Hiyerarşi ve Erişim Modu
Erişim modu, alt konturlar veya dış kontür veya tüm konturlar gibi konturlardaki hiyerarşiyi tanımlar.
Artık hiyerarşi türlerine göre sıralanmış dört geri alma modu vardır.
cv2.RETR_LIST - tüm konturları alır.
cv2.RETR_EXTERNAL - yalnızca dış veya dış konturları alır.
cv2.RETR_CCOMP - hepsini 2 seviyeli bir hiyerarşide alır.
cv2.RETR_TREE - tümünü tam bir hiyerarşi içinde alır.
Hiyerarşi aşağıdaki biçimde saklanır
Şimdi ilk iki alım modu, cv2.RETR_LIST ve cv2.RETR_EXTERNAL arasındaki farkı gösterelim.
ithalat cv2 ithalat numpy np olarak
3 siyah kareli basit bir resim yükleyelim
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Gri tonlamalı
gray = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY)
Canny Kenarlarını Bul
kenarlı = cv2.Canny (gri, 30,200) cv2.imshow ('keskin kenarlar', kenarlı) cv2.waitKey (0)
Kontür Bulma
# resminizin bir kopyasını kullanın, örneğin - edged.copy (), çünkü konturları bulmak resmi değiştirir # açık cv sürümünün yükseltilmesi nedeniyle boş bir argüman olarak konturların önüne _ eklememiz gerekir _, contours, hierarchy = cv2.findContours (kenarlı, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('konturlamadan sonra keskin kenarlar', kenarlı) cv2.waitKey (0)
Konturların hangi konturlardan oluştuğunu bilmek için kontur dosyasını yazdırma.
print (konturlar) print ('Bulunan kontur sayısı =' + str (uzunluk (kontür)))
Tüm konturları çizin
# Tüm konturları çizmek için 3. parametre olarak -1'i kullanın cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows
ithalat cv2 ithalat numpy np olarak
3 siyah kareli basit bir resim yükleyelim
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Gri tonlamalı
gray = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY)
Eğimli kenarları bulun
kenarlı = cv2.Canny (gri, 30,200) cv2.imshow ('keskin kenarlar', kenarlı) cv2.waitKey (0)
Kontür bulma
# resminizin bir kopyasını kullanın, örneğin - edged.copy (), çünkü konturları bulmak resmi değiştirir # açık cv sürümünün yükseltilmesi nedeniyle boş bir argüman olarak konturların önüne _ eklememiz gerekir _, contours, hierarchy = cv2.findContours (kenarlı, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('konturlamadan sonra keskin kenarlar', kenarlı) cv2.waitKey (0)
Konturların hangi konturlardan oluştuğunu bilmek için kontur dosyasını yazdırma.
print (konturlar) print ('Bulunan kontur sayısı =' + str (uzunluk (kontür)))
Tüm konturları çizin
# Tüm konturları çizmek için 3. parametre olarak -1'i kullanın cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Dolayısıyla, yukarıdaki kodların gösterilmesiyle cv2.RETR_LIST ve cv2.RETR_EXTERNNAL arasındaki farkı açıkça görebildik, cv2.RETR_EXTERNNAL'de iç konturlar göz ardı edilirken yalnızca dış konturlar dikkate alınır.
İken cv2.RETR_LIST iç kenarları da dikkate atılıyor.
3. Konturları Yaklaşım ve Konveks Kabuklarını Bulma
Konturlara yaklaştırmada, bir kontur şekli, birinci kontur şekline çok fazla benzemeyen başka bir kontur şekline yaklaştırılır.
Uyumu için kullandığımız approxPolyDP aşağıda açıklanmıştır opencv işlevini
cv2.approxPolyDP (kontur, yaklaşım doğruluğu, kapalı)
Parametreler:
- Kontur - yaklaştırmak istediğimiz bireysel kontur.
- Yaklaşım Doğruluğu - yaklaşımın doğruluğunu belirlemede önemli parametre, küçük değer kesin yaklaşım verir, büyük değerler daha genel bilgi verir. İyi bir kural, kontur çevresinin% 5'inden daha azdır.
- Kapalı - yaklaşık konturun açık veya kapalı olabileceğini belirten bir Boolean değeri.
Basit bir ev figürüne yaklaşmaya çalışalım
ithal numpy np olarak ithalat cv2
Resmi yükleyin ve bir kopyasını saklayın
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('orijinal resim', orig_image) cv2.waitKey (0)
Gri tonlama ve görüntüyü ikileme
gri = cv2.cvtColor (resim, cv2.COLOR_BGR2GRAY) ret, eşik = cv2.threshold (gri, 127,255, cv2.THRESH_BINARY_INV)
Kontür Bul
_, konturlar, hiyerarşi = cv2.findContours (eşik kopyası (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Her konturu yineleyin ve sınırlayıcı dikdörtgenlerini hesaplayın
konturlarda c için: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Sınırlayıcı rect', orig_image) cv2.waitKey (0)
Her konturu yineleyin ve yaklaşık konturu hesaplayın
konturlarda c için:
# kontur çevre doğruluğunun yüzdesi olarak doğruluğu hesapla = 0,03 * cv2.arcLength (c, True) yaklaşık = cv2.approxPolyDP (c, doğruluk, True) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('Yaklaşık polyDP', image) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Dışbükey Gövde
Dışbükey gövde, temelde, belirli bir şekil üzerinde çizgiler çizilerek temsil edilen dış kenarlardır.
Nesnenin etrafına sığabilen en küçük çokgen olabilir.
cv2 içe aktar np image = cv2.imread ('star.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('orijinal resim', resim) cv2.waitKey (0)
Görüntüyü eşik yap
ret, eşik = cv2.threshold (gri, 176,255,0)
Kontür bul
_, konturlar, hiyerarşi = cv2.findContours (eşik kopyası (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Konturları alana göre sıralayın ve ardından en büyük çerçeve konturunu kaldırın
n = uzunluk (kontür) -1 kontur = sıralı (kontür, anahtar = cv2.contourArea, ters = Yanlış)
Konturları tekrarlayın ve dışbükey gövde çizin
konturlarda c için:
hull = cv2.convexHull (c) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('convex hull', image) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Konturu şekillere göre eşleştirme
cv2.matchShapes (kontur şablonu, kontur yöntemi, yöntem parametresi)
Çıktı - eşleşme değeri (daha düşük değer, daha yakın eşleşme anlamına gelir)
kontur şablonu - Bu, yeni bir görüntüde bulmaya çalıştığımız referans konturumuzdur.
kontur - Kontrol ettiğimiz bireysel kontur.
Yöntem - Kontur eşleştirme türü (1,2,3).
method parametresi - 0,0 olarak bırakın (python opencv'de kullanılmaz)
ithalat cv2 ithalat numpy np olarak
Şekil şablonunu veya referans görüntüyü yükleyin
şablon = cv2.imread ('yıldız.jpg', 0) cv2.imshow ('şablon', şablon) cv2.waitKey (0)
Hedef resmi eşleştirmeye çalıştığımız şekillerle yükleyin
target = cv2.imread ('stylestomatch.jpg') gray = cv2.cvtColor (hedef, cv2.COLOR_BGR2GRAY)
Cv2.findContours'u kullanmadan önce her iki görüntüyü de eşik yapın
ret, eşik1 = cv2.threshold (şablon, 127,255,0) ret, eşik2 = cv2.threshold (gri, 127,255,0)
Şablonda konturları bulun
_, contours, hierarhy = cv2.findContours (eşik1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) # konturları alana göre sıralamamız gerekir, böylece en büyük konturu kaldırabiliriz.
Resim taslağı
sıralanmış_contours = sıralı (konturlar, anahtar = cv2.contourArea, ters = Doğru) # şablon konturumuz olacak ikinci en büyük konturu çıkarıyoruz tempelate_contour = konturlar # konturları ikinci hedef görüntüden çıkarın _, konturlar, hiyerarşi = cv2.findContours c in contours için (eşik2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) : # hedef görüntüdeki her kontur boyunca okuma yapın ve kontur şekli eşleşmesini karşılaştırmak için cv2.matchShape kullanın = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") # eşleşme değeri 0,15'ten küçükse <0,16: near_contour = c else: near_contour = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output',hedef) cv2.waitKey (0) cv2.destroyAllWindows ()
Konsol Çıkışı -
0,16818605122199104
0,19946910256158912
0,18949760627309664
0,11101058276281539
Farklı matematik fonksiyonuna sahip üç farklı metot vardır, sadece cv2.matchShapes (tempelate_contour, c, 1, 0.0) metodu değerlerini 1,2 ve 3 arasında değiştirerek her metodu deneyebiliriz, her değer için farklı eşleşme elde edersiniz konsol çıktısındaki değerler.
6. Şekilleri Tanımlama (daire, dikdörtgen, üçgen, kare, yıldız)
OpenCV, görüntüden farklı şekil türlerini otomatik olarak algılamak için de kullanılabilir. Aşağıdaki kodu kullanarak görüntüden daire, dikdörtgen, üçgen, kare ve yıldızları tespit edebileceğiz.
ithalat cv2 ithalat numpy np olarak
Resimleri yükleyin ve ardından gri tonlamalı
image = cv2.imread ('şekiller.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('şekilleri tanımlama', resim) cv2.waitKey (0) ret, eşik = cv2.threshold (gri, 127,255,1)
Konturları ayıklayın
_, konturlar, hiyerarşi = cv2.findContours (eşik kopyası (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Konturlarda cnt için:
Yaklaşık çokgenleri alın yaklaşık = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True) eğer len (yaklaşık) == 3: shape_name = "Üçgen" cv2.drawContours (resim,, 0, (0,255, 0), - 1)
metni merkeze yerleştirmek için kontur merkezini bulun
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (resim, şekil_adı, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (yaklaşık) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Dört kenarlı çokgenin kare mi yoksa dikdörtgen mi olduğunu kontrol edin
# cv2.boundingRect Sol üstteki #sol köşeden başlayarak sol genişliği ve yüksekliği piksel cinsinden döndür, kare için abs (wh) <= 3: shape_name = "kare" # ise metnin yerleştirileceği kontur merkezini bul center cv2.drawContours (image,, 0, (0,125,255), - 1) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) else: shape_name = "Reactangle" # metni merkeze yerleştirmek için kontur merkezini bul cv2.drawContours (image,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (resim, şekil_adı, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (yaklaşık) == 10: şekil_adı = 'star' cv2.drawContours (resim,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (resim, şekil_adı, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (yaklaşık)> = 15: şekil_adı = 'daire' cv2.drawContours (resim,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (resim, şekil_adı, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('şekilleri tanımlama', görüntü) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Hat Tespiti
Hat tespiti, OpenCV'de çok önemli bir kavramdır ve gerçek dünyada umut verici bir kullanımı vardır. Otonom arabalar, şeritlerin ve yolların tespiti için hat algılama algoritmalarını kullanır.
Hat tespitinde iki algoritma ile ilgileneceğiz,
- Hough Hattı Algoritması
- Probalistic Hough Line Algoritması.
Lise matematiğinden doğrunun temsilini y = mx + c denklemi ile hatırlamış olabilirsiniz .
Ancak OpenCV'de satır başka bir şekilde temsil edilir
Ρ = xcosӨ + ysincosӨ üzerindeki denklem, çizginin OpenCV temsilidir; burada ρ, çizginin orijine olan dik mesafesidir ve Ө, bu çizginin orijine olan normalinin oluşturduğu açıdır (radyan cinsinden ölçülür, burada 1pi radyan / 180 = 1 derece).
Hat tespiti için OpenCV işlevi şu şekilde verilir:
cv2.HoughLines (ikili görüntü, ρ doğruluk, Ө doğruluk, eşik), burada eşik, bir çizgi olarak kabul edilmesi için minimum oydur .
Şimdi opencv'nin Hough line fonksiyonu yardımıyla bir kutu görüntüsü için çizgileri tespit edelim.
cv2 içe aktar np image = cv2.imread ('box.jpg') olarak numpy içe aktar
Gri tonlamalı ve keskin kenarlar çıkarıldı
gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) kenarlar = cv2.Canny (gri, 100,170, apertureSize = 3)
1 piksellik rho doğruluğu kullanarak Hough çizgilerini çalıştırın
1 derece olan (np.pi / 180) 'in #theta doğruluğu # çizgi eşiği 240'a ayarlandı (çizgi üzerindeki nokta sayısı) satırlar = cv2.HoughLines (kenarlar, 1, np.pi / 180, 240) #we iterate her satır üzerinden ve # formata dönüştürmek için cv2.lines için gerekli (yani uç noktalar gerektirir) , aralıktaki i için (0, uzunluk (çizgiler)): rho, satırlarda teta için: a = np.cos (theta) b = np.sin (theta) x0 = a * rho y0 = b * rho x1 = int (x0 + 1000 * (- b)) y1 = int (y0 + 1000 * (a)) x2 = int (x0-1000 * (-b)) y2 = int (y0-1000 * (a)) cv2.line (resim, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('düz çizgiler', resim) cv2.waitKey (0) cv2.destroyAllWindows ()
Şimdi diğer olasılıksal Hough çizgisi algoritması ile çizgi üstü algılamayı tekrarlayalım.
Olasılıklı Hough çizgisinin arkasındaki fikir, hat tespiti için yeterli olan rastgele bir nokta alt kümesini almaktır.
Olasılıklı Hough hattı için OpenCV işlevi, cv2.HoughLinesP olarak temsil edilir (ikili görüntü, ρ doğruluk, Ө doğruluk, eşik, minimum satır uzunluğu, maksimum satır aralığı)
Şimdi olasılıklı Hough çizgileri yardımıyla kutu çizgilerini tespit edelim.
ithalat cv2 ithalat numpy np olarak
Gri tonlamalı ve keskin kenarlar Çıkarıldı
image = cv2.imread ('box.jpg') gray = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (gray, 50,150, apertureSize = 3) # yine aynı rho ve theta doğruluklarını kullanıyoruz #however, bir asgari oy 100 (hattı boyunca hasta) belirlemek #and dakika hattı 5 piksel uzunluğunda ve 10 piksel çizgileri arasındaki maksimum aralık hatları = cv2.HoughLinesP (kenarları, 1, np.pi / 180,100,100,10) i için aralıkta (0, uzunluk (satır)): x1, y1, x2, y2 için satırlarda: cv2.line (görüntü, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. Blob algılama
Bloblar, tümü ortak bir özelliği paylaşan bir grup bağlantılı piksel olarak tanımlanabilir. OpenCV blob algılayıcısını kullanma yöntemi bu akış şemasında açıklanmıştır.
Kilit noktaları çizmek için aşağıdaki argümanları alan cv2.drawKeypoints kullanırız.
cv2.drawKeypoints (girdi görüntüsü, anahtar noktalar, blank_output_array, renk, bayraklar)
bayraklarda nerede olabilir
cv2.DRAW_MATCHES_FLAGS_DEFAULT
cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS
cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG
cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS
ve buradaki boşluk hemen hemen hiçbir şeydir, ancak tek tek sıfır matrisinden başka bir şey değildir
Şimdi, tüm çiçekler arasında ortak olduğu için lekelerin çiçeğin merkezi kısımları olacağı bir ayçiçeği görüntüsü üzerinde damla tespitini gerçekleştirelim.
cv2 içe aktar numpy np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE) olarak içe aktar
Dedektörü varsayılan parametrelerle ayarlayın
detektör = cv2.SimpleBlobDetector_create ()
Blobları algıla
keypoints = detektör.detect (resim)
Algılanan blobları kırmızı daireler olarak çizin
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS dairenin # boyutunun boş blob boyutuna karşılık geldiğinden emin olun = np.zeros ((1,1)) blobs = cv2.drawKeypoints (resim, anahtar noktalar, boş, (0,255,255), cv2_FAGLEFA_MATCHES
Anahtar noktaları göster
cv2.imshow ('blob'lar', blob'lar) cv2.waitKey (0) cv2.destroyAllWindows ()
Kod iyi çalışsa da, öndeki çiçekler sondaki çiçeklerle karşılaştırıldığında büyük olduğu için çiçeklerin eşit olmayan boyutları nedeniyle bazı lekeler gözden kaçıyor.
9. Lekeleri Filtreleme - Daireleri ve Elipsleri Sayma
Blobları şekillerine, boyutlarına ve renklerine göre filtrelemek için parametreleri kullanabiliriz. Blob algılayıcısıyla parametreleri kullanmak için OpenCV'nin işlevini kullanıyoruz
cv2.SimpleBlobDetector_Params ()
Blobları esas olarak aşağıda listelenen bu dört parametreye göre filtrelediğini göreceğiz:
Alan
params.filterByArea = Doğru / Yanlış params.minArea = pikseller params.maxArea = piksel
Dairesellik
params.filterByCircularity = Doğru / Yanlış params.minCircularity = 1 mükemmel, 0 zıt
Konvekslik - Blob alanı / dışbükey gövde alanı
params.filterByConvexity = Doğru / Yanlış params.minConvexity = Alan
Eylemsizlik
params.filterByInertia = Doğru / Yanlış params.minInertiaRatio = 0.01
Şimdi blobları yukarıda belirtilen parametrelere göre filtrelemeyi deneyelim
cv2 içe aktar np image = cv2.imread ('blobs.jpg') cv2.imshow ('orijinal resim', resim) cv2.waitKey (0) olarak içe aktar
Varsayılan parametreleri kullanarak dedektörü başlatın
detektör = cv2.SimpleBlobDetector_create ()
Blobları algıla
keypoints = detektör.detect (resim)
Resmimizin üzerine kırmızı daireler olarak lekeler çizin
blank = np.zeros ((1,1)) blob = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "toplam blob sayısı" + str (len (anahtar noktalar)) cv2.putText (bloblar, metin, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Blob anahtar noktaları ile görüntüyü görüntüle
cv2.imshow ('varsayılan parametreleri kullanan blob', blobs) cv2.waitKey (0)
Filtreleme parametrelerimizi ayarlayın
#initialize parametre ayarını kullanarak cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Alan filtreleme parametrelerini ayarlayın
params.filterByArea = Gerçek params.minArea = 100
Döngüsellik filtreleme parametrelerini ayarlayın
params.filterByCircularity = Gerçek params.minCircularity = 0.9
Dışbükeylik filtreleme parametresini ayarlayın
params.filterByConvexity = Yanlış params.minConvexity = 0.2
Eylemsizlik filtreleme parametresini ayarlayın
params.filterByInertia = Gerçek params.minInertiaRatio = 0.01
Parametreli dedektör oluştur
detektör = cv2.SimpleBlobDetector_create (parametreler)
Blobları algıla
keypoints = detektör.detect (resim)
Görüntülerin üzerine kırmızı daireler halinde lekeler çizin
blank = np.zeros ((1,1)) blob = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (anahtar noktalar) text = "toplam dairesel damla sayısı" + str (len (anahtar noktalar)) cv2.putText (bloblar, metin, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Blobları göster
cv2.imshow ('dairesel blobları filtreleme', blob'lar) cv2.waitKey (0) cv2.destroyAllWindows ()
Python-OpenCV'de Görüntü segmentasyonu bu şekilde yapılabilir. Bilgisayar görüşünü ve OpenCV'yi iyi anlamak için önceki makalelere göz atın (Python OpenCV ve Python OpenCV'de Görüntü Manipülasyonları ile başlayın ve Computer Vision ile harika bir şeyler yapabilirsiniz.