- 1. Segmentasi dan kontur
- 2. Mod Hierarki dan Pengambilan
- 3. Mengira Kontur dan Mencari lambung Cembung mereka
- 4. Lengkung Cembung
- 5. Memadankan Kontur mengikut bentuk
- 6. Mengenal Bentuk (bulatan, segi empat tepat, segitiga, segi empat sama, bintang)
- 7. Pengesanan Talian
- 8. Pengesanan gumpalan
- 9. Menyaring Gumpalan - Membilang Bulatan dan Elips
Dalam tutorial sebelumnya, kami telah menggunakan OpenCV untuk pemprosesan gambar asas dan melakukan beberapa operasi penyuntingan gambar terlebih dahulu. Seperti yang kita ketahui, OpenCV adalah Open Source Commuter Vision Library yang mempunyai antara muka C ++, Python dan Java dan menyokong Windows, Linux, Mac OS, iOS dan Android. Oleh itu, ia dapat dipasang dengan mudah di Raspberry Pi dengan persekitaran Python dan Linux. Dan Raspberry Pi dengan OpenCV dan kamera terpasang dapat digunakan untuk membuat banyak aplikasi pemprosesan gambar masa nyata seperti Pengesanan wajah, kunci muka, penjejakan objek, pengesanan plat nombor kereta, sistem keselamatan Rumah dan lain-lain. Dalam tutorial ini kita akan mengetahui bahawa segmentasi gambar menggunakan OpenCV. Operasi yang akan kami lakukan disenaraikan di bawah:
- Segmentasi dan kontur
- Mod hierarki dan pengambilan
- Mengira kontur dan mencari lambung cembung mereka
- Conex Hull
- Kontur yang sepadan
- Mengenal Bentuk (bulatan, segi empat tepat, segitiga, persegi, bintang)
- Pengesanan talian
- Pengesanan gumpalan
- Menyaring gumpalan - membilang bulatan dan elips
1. Segmentasi dan kontur
Segmentasi gambar adalah proses di mana kita membahagikan gambar ke kawasan yang berbeza. Manakala konturnya adalah garis atau lengkung berterusan yang mengikat atau menutup batas penuh objek dalam gambar. Dan, di sini kita akan menggunakan teknik segmentasi gambar yang disebut kontur untuk mengekstrak bahagian-bahagian gambar.
Kontur juga sangat penting dalam
- Pengesanan objek
- Analisis bentuk
Dan mereka memiliki bidang aplikasi yang sangat luas dari analisis gambar dunia nyata hingga analisis imej perubatan seperti di MRI
Mari ketahui bagaimana menerapkan kontur di opencv, dengan mengekstrak kontur kotak.
import cv2 import numpy sebagai np
Mari memuatkan gambar ringkas dengan 3 kotak hitam
image = cv2.imread ('squares.jpg') cv2.imshow ('input image', gambar) cv2.waitKey (0)
Skala kelabu
kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Cari bahagian tepi yang licin
edged = cv2.Canny (grey, 30,200) cv2.imshow ('canny edges', edged) cv2.waitKey (0)
Mencari kontur
#gunakan salinan gambar anda, misalnya - edged.copy (), kerana mencari kontur mengubah gambar # kita harus menambahkan _, sebelum kontur sebagai argumen kosong kerana peningkatan versi OpenCV _, kontur, hierarki = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny edge after contouring', edged) cv2.waitKey (0)
Mencetak fail kontur untuk mengetahui bentuk kontur
cetak (kontur) cetak ('Bilangan kontur dijumpai =' + str (len (kontur)))
Lukiskan semua kontur
#use -1 sebagai parameter ke-3 untuk melukis semua kontur cv2.drawContours (gambar, kontur, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. hancurkanAllWindows ()
Keluaran Konsol -],],], …,],],]], dtype = int32), susunan (],],
], …,
],],]], dtype = int32), array (],],], …,],],]], dtype = int32)]
Bilangan kontur yang dijumpai = 3. Oleh itu, kita telah menemui tiga kontur.
Sekarang, dalam kod di atas kami juga telah mencetak file kontur menggunakan , fail ini memberitahu bagaimana bentuk kontur ini, seperti yang dicetak pada output konsol di atas.
Dalam output konsol di atas kita mempunyai matriks yang kelihatan seperti koordinat titik x, y. OpenCV menyimpan kontur dalam senarai senarai. Kami hanya dapat menunjukkan output konsol di atas seperti berikut:
CONTOUR 1 CONTOUR 2 CONTOUR 3
], tatasusunan (], susunan (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Sekarang, ketika kita menggunakan fungsi panjang pada file kontur, kita mendapatkan panjangnya sama dengan 3, itu berarti ada tiga senarai senarai dalam fail itu, iaitu tiga kontur.
Sekarang, bayangkan CONTOUR 1 adalah elemen pertama dalam susunan itu dan senarai itu mengandungi senarai semua koordinat dan koordinat ini adalah titik sepanjang kontur yang baru kita lihat, sebagai kotak segi empat hijau.
Terdapat kaedah yang berbeza untuk menyimpan koordinat ini dan ini disebut kaedah penghampiran, pada asasnya kaedah penghampiran terdiri daripada dua jenis
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE menyimpan semua titik sempadan, tetapi kita tidak semestinya memerlukan semua titik sempadan, jika titik membentuk garis lurus, kita hanya memerlukan titik permulaan dan titik akhir pada garis itu.
cv2.CHAIN_APPROX_SIMPLE sebaliknya hanya memberikan titik permulaan dan akhir dari kontur bersempadan, hasilnya adalah penyimpanan maklumat kontur yang jauh lebih cekap.
_, kontur, hierarki = cv2.findContours (bermata, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Dalam kod di atas cv2.RETR_EXTERNAL adalah mod pengambilan sementara cv2.CHAIN_APPROX_NONE adalah
kaedah penghampiran.
Oleh itu, kami telah mengetahui kaedah kontur dan pendekatan, sekarang mari kita meneroka mod hierarki dan pengambilan.
2. Mod Hierarki dan Pengambilan
Mod pengambilan menentukan hirarki dalam kontur seperti subkontur, atau kontur luaran atau semua kontur.
Kini terdapat empat mod pengambilan yang disusun berdasarkan jenis hierarki.
cv2.RETR_LIST - mengambil semua kontur.
cv2.RETR_EXTERNAL - mengambil kontur luaran atau luaran sahaja.
cv2.RETR_CCOMP - mengambil semua dalam hierarki 2 peringkat.
cv2.RETR_TREE - mengambil semua dalam hierarki penuh.
Hierarki disimpan dalam format berikut
Sekarang mari kita gambarkan perbezaan antara dua mod pengambilan pertama, cv2.RETR_LIST dan cv2.RETR_EXTERNAL.
import cv2 import numpy sebagai np
Mari memuatkan gambar sederhana dengan 3 kotak hitam
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', gambar) cv2.waitKey (0)
Skala kelabu
kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Cari Canny Edges
edged = cv2.Canny (grey, 30,200) cv2.imshow ('canny edges', edged) cv2.waitKey (0)
Mencari Kontur
#gunakan salinan gambar anda, mis. - edged.copy (), kerana mencari kontur mengubah gambar # kita harus menambah _, sebelum kontur sebagai argumen kosong kerana peningkatan versi cv terbuka _, kontur, hierarki = cv2.findContours (edged, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny edge after contouring', edged) cv2.waitKey (0)
Mencetak fail kontur untuk mengetahui bentuk kontur.
cetak (kontur) cetak ('Bilangan kontur dijumpai =' + str (len (kontur)))
Lukiskan semua kontur
#use -1 sebagai parameter ke-3 untuk melukis semua kontur cv2.drawContours (gambar, kontur, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. memusnahkanAllWindows
import cv2 import numpy sebagai np
Mari memuatkan gambar sederhana dengan 3 kotak hitam
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', gambar) cv2.waitKey (0)
Skala kelabu
kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Cari bahagian tepi yang licin
edged = cv2.Canny (grey, 30,200) cv2.imshow ('canny edges', edged) cv2.waitKey (0)
Mencari kontur
#gunakan salinan gambar anda, mis. - edged.copy (), kerana mencari kontur mengubah gambar #kita harus menambahkan _, sebelum kontur sebagai argumen kosong kerana peningkatan versi cv terbuka _, kontur, hierarki = cv2.findContours (edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('canny edge after contouring', edged) cv2.waitKey (0)
Mencetak fail kontur untuk mengetahui bentuk kontur.
cetak (kontur) cetak ('Bilangan kontur dijumpai =' + str (len (kontur)))
Lukiskan semua kontur
#use -1 sebagai parameter ke-3 untuk melukis semua kontur cv2.drawContours (gambar, kontur, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. hancurkanAllWindows ()
Oleh itu, melalui demonstrasi kod di atas, kita dapat melihat dengan jelas perbezaan antara cv2.RETR_LIST dan cv2.RETR_EXTERNNAL , dalam cv2.RETR_EXTERNNAL hanya kontur luar yang diambil kira sementara kontur dalaman tidak dihiraukan.
Semasa dalam cv2.RETR_LIST kontur dalaman juga diambil kira.
3. Mengira Kontur dan Mencari lambung Cembung mereka
Dalam menghampiri kontur, bentuk kontur didekati bentuk kontur yang lain, yang mungkin tidak serupa dengan bentuk kontur pertama.
Untuk anggaran kami menggunakan approxPolyDP fungsi opencv yang dijelaskan di bawah
cv2.approxPolyDP (kontur, ketepatan anggaran, ditutup)
Parameter:
- Kontur - adalah kontur individu yang ingin kita perkirakan.
- Ketepatan Pendekatan - parameter penting dalam menentukan ketepatan penghampiran, nilai kecil memberikan penghampiran tepat, nilai besar memberikan maklumat yang lebih generik. Peraturan ibu jari yang baik adalah kurang daripada 5% perimeter kontur.
- Closed - nilai Boolean yang menyatakan sama ada kontur anggaran boleh dibuka atau ditutup.
Mari cuba kira bentuk rumah yang sederhana
import numpy sebagai np import cv2
Muatkan gambar dan simpan salinannya
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('gambar asal', orig_image) cv2.waitKey (0)
Skala kelabu dan binari gambar
kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY) ret, ambang = cv2.threshold (kelabu, 127,255, cv2.THRESH_BINARY_INV)
Cari Kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Ulangi setiap kontur dan hitung segi empat tepat pembatas mereka
untuk c dalam kontur: x, y, w, h = cv2.boundingRect (c) cv2.rectangle (orig_image, (x, y), (x + w, y + h), (0,0,255), 2) cv2.imshow ('Bounding rect', orig_image) cv2.waitKey (0)
Ulangi setiap kontur dan hitung kira-kira kontur
untuk c dalam kontur:
#kira ketepatan sebagai peratus ketepatan perimeter kontur = 0,03 * cv2.arcLength (c, True) lebih kurang = cv2.approxPolyDP (c, ketepatan, Benar) cv2.drawContours (gambar,, 0, (0,255,0), 2) cv2.imshow ('Approx polyDP', image) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Lengkung Cembung
Lengkung cembung pada dasarnya adalah tepi luar, yang dilambangkan dengan melukis garis di atas angka tertentu.
Ia boleh menjadi poligon terkecil yang dapat dipasang di sekitar objek itu sendiri.
import cv2 import numpy sebagai np image = cv2.imread ('star.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('original image', image) cv2.waitKey (0)
Ambang gambar
ret, ambang = cv2.threshold (kelabu, 176,255,0)
Cari kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Isih kontur mengikut kawasan dan kemudian keluarkan kontur bingkai terbesar
n = len (kontur) -1 kontur = disusun (kontur, kunci = cv2.contourArea, terbalik = Salah)
Ulangi melalui kontur dan lukis lambung cembung
untuk c dalam kontur:
hull = cv2.convexHull (c) cv2.drawContours (gambar,, 0, (0,255,0), 2) cv2.imshow ('cembung lambung', gambar) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Memadankan Kontur mengikut bentuk
cv2.matchShapes (templat kontur, kaedah kontur, parameter kaedah)
Keluaran - nilai padanan (nilai yang lebih rendah bermaksud padanan yang lebih dekat)
templat kontur - Ini adalah kontur rujukan kami yang ingin kami cari dalam imej baru.
kontur - Kontur individu yang kami periksa.
Kaedah - Jenis pencocokan kontur (1,2,3).
parameter kaedah - biarkan sahaja sebagai 0,0 (tidak digunakan dalam python opencv)
import cv2 import numpy sebagai np
Muatkan templat bentuk atau gambar rujukan
templat = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Muatkan gambar sasaran dengan bentuk yang ingin kami padankan
target = cv2.imread ('shapestomatch.jpg') kelabu = cv2.cvtColor (sasaran, cv2.COLOR_BGR2GRAY)
Ambil kedua-dua gambar terlebih dahulu sebelum menggunakan cv2.findContours
ret, thresh1 = cv2.threshold (templat, 127,255,0) ret, thresh2 = cv2.threshold (kelabu, 127,255,0)
Cari kontur dalam templat
_, kontur, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) #kita perlu menyusun kontur mengikut kawasan supaya kita dapat membuang kontur terbesar yang
Garis besar gambar
sorted_contours = sorted (contours, key = cv2.contourArea, reverse = True) #kami mengekstrak kontur terbesar kedua yang akan menjadi templat tempelate_contour = contours #kontur kontur dari gambar sasaran kedua _, kontur, hierarki = cv2.findContours (ambang2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) untuk c dalam kontur: #tulis melalui setiap kontur pada gambar sasaran dan gunakan cv2.matchShape untuk membandingkan pencocokan bentuk kontur = cv2.matchShapes (tempelate_contour, c, 1,0.0) cetakan ("match") #jika nilai perlawanan kurang dari 0.15 jika padanan <0.16: terdekat_contour = c else: terdekat_contour = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output', sasaran) cv2.waitKey (0) cv2.destroyAllWindows ()
Keluaran Konsol -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
Terdapat tiga kaedah yang berbeza dengan fungsi matematik yang berbeza, kita dapat bereksperimen dengan setiap kaedah dengan hanya mengganti nilai kaedah cv2.matchShapes (tempelate_contour, c, 1, 0.0) yang bervariasi dari 1,2 dan 3, untuk setiap nilai Anda akan mendapat pencocokan yang berbeda nilai dalam output konsol.
6. Mengenal Bentuk (bulatan, segi empat tepat, segitiga, segi empat sama, bintang)
OpenCV juga dapat digunakan untuk mengesan berbagai jenis bentuk secara automatik dari gambar. Dengan menggunakan kod di bawah ini kita dapat mengesan bulatan, segi empat tepat, segitiga, segi empat sama dan bintang dari gambar.
import cv2 import numpy sebagai np
Muat dan kemudian gambar skala kelabu
image = cv2.imread ('shape.jpg') kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY) cv2.imshow ('mengenal pasti bentuk', gambar) cv2.waitKey (0) ret, ambang = cv2.threshold (kelabu, 127,255,1)
Ekstrak kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Untuk cnt dalam kontur:
Dapatkan anggaran poligon lebih kurang = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True) jika len (lebih kurang) == 3: shape_name = "Segitiga" cv2.drawContours (gambar,, 0, (0,255, 0), - 1)
cari pusat kontur untuk meletakkan teks di tengah
M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (gambar, bentuk_nama, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0, 0), 1) elif len (lebih kurang) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Periksa apakah poligon empat sisi itu segi empat sama atau segi empat tepat
# cv2.boundingRect mengembalikan lebar dan tinggi kiri dalam piksel, bermula dari sudut kiri # atas, untuk segi empat sama akan sama jika abs (wh) <= 3: shape_name = "square" #cari pusat kontur untuk meletakkan teks di tengah cv2.drawContours (gambar,, 0, (0,125,255), - 1) cv2.putText (gambar, nama_bentuk, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) yang lain: shape_name = "Reactangle" #cari pusat kontur untuk meletakkan teks di tengah cv2.drawContours (gambar,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (gambar, nama_bentuk, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (lebih kurang) == 10: shape_name = 'bintang' cv2.drawContours (gambar,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (gambar, nama_bentuk, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len (lebih kurang)> = 15: shape_name = 'circle' cv2.drawContours (gambar,, 0, (0,255,255), -1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (gambar, bentuk_nama, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) cv2.imshow ('mengenal pasti bentuk', gambar) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Pengesanan Talian
Pengesanan talian adalah konsep yang sangat penting dalam OpenCV, dan mempunyai penggunaan yang menjanjikan di dunia nyata. Kereta autonomi menggunakan algoritma pengesanan garis untuk mengesan lorong dan jalan raya.
Dalam pengesanan selari, kita akan menangani dua algoritma,
- Algoritma Garis Hough
- Algoritma Garis Hough Probalistik.
Anda mungkin ingat perwakilan garis dari matematik sekolah menengah dengan persamaan, y = mx + c.
Walau bagaimanapun, dalam baris OpenCV diwakili dengan cara lain
Persamaan di atas ρ = xcosӨ + ysincosӨ adalah perwakilan OpenCV garis, di mana ρ adalah jarak garis tegak lurus dari asal dan Ө adalah sudut yang dibentuk oleh normal garis ini ke asal (diukur dalam radian, di mana radian 1pi / 180 = 1 darjah).
Fungsi OpenCV untuk pengesanan garis diberikan sebagai
cv2.HoughLines (gambar binarized, ketepatan ρ, ketepatan,, ambang), di mana ambang adalah suara minimum untuk dianggap sebagai garis.
Sekarang mari kita mengesan garis untuk gambar kotak dengan bantuan fungsi garis Hough dari opencv.
import cv2 import numpy sebagai np image = cv2.imread ('box.jpg')
Skala kelabu dan tepi cerat diekstrak
kelabu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY) tepi = cv2.Canny (kelabu, 100,170, apertureSize = 3)
Jalankan garis Hough menggunakan ketepatan rho 1 piksel
#ketepatan theta (np.pi / 180) yang 1 darjah # garis ambang ditetapkan ke garis 240 (bilangan titik dalam talian) = cv2. Garis Hough (tepi, 1, np.pi / 180, 240) #kita berulang melalui setiap baris dan menukar ke dalam format #diperlukan oleh cv2.lines (iaitu memerlukan titik akhir) untuk i dalam jarak (0, len (baris)): untuk rho, theta dalam baris: 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 (gambar, (x1, y1), (x2, y2), (0,255,0), 2) cv2.imshow ('garis kasar'), gambar) cv2.waitKey (0) cv2.destroyAllWindows ()
Sekarang mari kita ulangi pengesanan garis di atas dengan algoritma garis probabilistik Hough yang lain.
Idea di sebalik garis probabilistik Hough adalah mengambil subset titik rawak yang cukup untuk pengesanan garis.
Fungsi OpenCV untuk garis probabilistik Hough ditunjukkan sebagai cv2.HoughLinesP (gambar binarized, ketepatan ρ, ketepatan Ө, ambang, panjang garis minimum, jurang garis maksimum)
Sekarang mari kita mengesan garis kotak dengan bantuan garis Hough probabilistik.
import cv2 import numpy sebagai np
Skala kelabu dan tepi cerat Diekstrak
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (grey, 50,150, apertureSize = 3) #again kami menggunakan ketepatan rho dan theta yang sama # bagaimanapun, kami menentukan undian minimum (pts sepanjang garis) 100 # dan panjang garis min 5 piksel dan jurang maksimum antara garis 10 piksel garis = cv2.HoughLinesP (tepi, 1, np.pi / 180,100,100,10) untuk i dalam julat (0, len (baris)): untuk garis x1, y1, x2, y2: cv2.line (gambar, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('garis probalistik hough', gambar) cv2.waitKey (0) cv2.destroyAllWindows
8. Pengesanan gumpalan
Gumpalan boleh digambarkan sebagai sekumpulan piksel bersambung yang semuanya berkongsi harta bersama. Kaedah untuk menggunakan pengesan gumpalan OpenCV dijelaskan melalui carta alir ini.
Untuk menggambar titik-titik penting kami menggunakan cv2.drawKeypoints yang mengambil argumen berikut.
cv2.drawKeypoints (gambar input, titik kekunci, blank_output_array, warna, bendera)
di mana bendera boleh
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
dan kosong di sini tidak lebih dari satu demi satu matriks sifar
Sekarang mari kita lakukan pengesanan gumpalan pada gambar bunga matahari, di mana gumpalan itu akan menjadi bahagian tengah bunga kerana ia biasa di antara semua bunga.
import cv2 import numpy sebagai np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Sediakan pengesan dengan parameter lalai
pengesan = cv2.SimpleBlobDetector_create ()
Mengesan gumpalan
keypoints = detector.detect (gambar)
Lukiskan gumpalan yang dikesan sebagai bulatan merah
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS memastikan # ukuran bulatan sesuai dengan ukuran gumpalan kosong = np.zeros ((1,1)) gumpalan = cv2.drawKeypoints (gambar, papan kekunci, kosong, (0,255,255), cv2_FD
Tunjukkan titik kekunci
cv2.imshow ('gumpalan', gumpalan) cv2.waitKey (0) cv2.destroyAllWindows ()
Walaupun kodnya berfungsi dengan baik tetapi sebilangan gumpalan terlewat kerana ukuran bunga yang tidak rata kerana bunga di bahagian depannya besar berbanding dengan bunga di hujungnya.
9. Menyaring Gumpalan - Membilang Bulatan dan Elips
Kita dapat menggunakan parameter untuk menyaring gumpalan sesuai dengan bentuk, ukuran dan warnanya. Untuk menggunakan parameter dengan detektor blob, kami menggunakan fungsi OpenCV
cv2.SimpleBlobDetector_Params ()
Kami akan melihat penyaringan gumpalan dengan terutamanya empat parameter yang disenaraikan di bawah:
Kawasan
params.filterByArea = Params Benar / Salah.minArea = piksel params.maxArea = piksel
Pekeliling
params.filterByCircularity = True / False params.minCircularity = 1 menjadi sempurna, 0 yang bertentangan
Cembung - Kawasan gumpalan / kawasan lambung cembung
params.filterByConvexity = Params Benar / Salah.minConvexity = Luas
Inersia
params.filterByInertia = Params Benar / Salah.minInertiaRatio = 0.01
Sekarang mari kita cuba menapis gumpalan dengan parameter yang disebutkan di atas
import cv2 import numpy sebagai np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Memulakan pengesan menggunakan parameter lalai
pengesan = cv2.SimpleBlobDetector_create ()
Mengesan gumpalan
keypoints = detector.detect (gambar)
Lukis gumpalan pada gambar kita sebagai bulatan merah
kosong = np.zeros ((1,1)) gumpalan = cv2.drawKetunjuk (gambar, titik kekunci, kosong, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) bilangan_of_blobs = len (papan kekunci) teks = "jumlah no (len ( titik kekunci)) cv2.putText (gumpalan, teks, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Paparkan gambar dengan titik kekunci gumpalan
cv2.imshow ('gumpalan menggunakan parameter lalai', gumpalan) cv2.waitKey (0)
Tetapkan parameter penapisan kami
#inisialisasi tetapan parameter menggunakan parameter cv2.SimpleBlobDetector = cv2.SimpleBlobDetector_Params ()
Tetapkan parameter penapisan kawasan
params.filterByArea = Params benar.minArea = 100
Tetapkan parameter penapisan pekeliling
params.filterByCircularity = True params.minCircularity = 0.9
Tetapkan parameter penyaringan cembung
params.filterByConvexity = Palsu params.minConvexity = 0.2
Tetapkan parameter penapisan inersia
params.filterByInertia = True params.minInertiaRatio = 0.01
Buat pengesan dengan parameter
pengesan = cv2.SimpleBlobDetector_create (params)
Mengesan gumpalan
keypoints = detector.detect (gambar)
Lukis gumpalan pada gambar sebagai bulatan merah
kosong = np.zeros ((1,1)) gumpalan = cv2.drawKetunjuk (gambar, titik kekunci, kosong, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) bilangan_of_blobs = len (papan kekunci) teks bulat = "jumlah no str (len ( titik kekunci)) cv2.putText (gumpalan, teks, (20,550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Tunjukkan gumpalan
cv2.imshow ('menyaring gumpalan bulat', gumpalan) cv2.waitKey (0) cv2.destroyAllWindows ()
Jadi ini adalah bagaimana segmentasi Imej dapat dilakukan di Python-OpenCV. Untuk mendapatkan penglihatan yang baik mengenai penglihatan komputer dan OpenCV, baca artikel sebelumnya (Bermula dengan Python OpenCV dan Manipulasi Imej di Python OpenCV dan anda akan dapat membuat sesuatu yang menarik dengan Computer Vision.