- 1. Segmentasi dan kontur
- 2. Hierarki dan Mode Pengambilan
- 3. Memperkirakan Kontur dan Menemukan Convex hull mereka
- 4. Convex Hull
- 5. Mencocokkan Kontur dengan bentuk
- 6. Mengidentifikasi Bentuk (lingkaran, persegi panjang, segitiga, persegi, bintang)
- 7. Deteksi Garis
- 8. Deteksi blob
- 9. Menyaring Blob - Menghitung Lingkaran dan Elips
Dalam tutorial sebelumnya, kami telah menggunakan OpenCV untuk pemrosesan gambar dasar dan melakukan beberapa operasi pengeditan gambar lanjutan. Seperti yang kita ketahui, OpenCV adalah Open Source Commuter Vision Library yang memiliki interface C ++, Python dan Java serta mendukung Windows, Linux, Mac OS, iOS dan Android. Sehingga bisa dengan mudah di install di Raspberry Pi dengan lingkungan Python dan Linux. Dan Raspberry Pi dengan OpenCV dan kamera terpasang dapat digunakan untuk membuat banyak aplikasi pemrosesan gambar real-time seperti Deteksi wajah, kunci wajah, pelacakan objek, deteksi pelat nomor mobil, sistem keamanan rumah, dll. Dalam tutorial ini kita akan mempelajari cara melakukannya. segmentasi gambar menggunakan OpenCV. Operasi yang akan kami lakukan tercantum di bawah ini:
- Segmentasi dan kontur
- Hierarki dan mode pengambilan
- Memperkirakan kontur dan menemukan lambung cembungnya
- Conex Hull
- Mencocokkan Kontur
- Mengidentifikasi Bentuk (lingkaran, persegi panjang, segitiga, persegi, bintang)
- Deteksi garis
- Deteksi blob
- Menyaring gumpalan - menghitung lingkaran dan elips
1. Segmentasi dan kontur
Segmentasi gambar adalah proses di mana kami mempartisi gambar ke berbagai wilayah. Sedangkan kontur adalah garis atau kurva kontinu yang mengikat atau menutupi seluruh batas suatu objek dalam suatu citra. Dan, disini kita akan menggunakan teknik segmentasi citra yang disebut kontur untuk mengekstrak bagian-bagian dari suatu citra.
Kontur juga sangat penting dalam
- Deteksi objek
- Analisis bentuk
Dan mereka memiliki bidang aplikasi yang sangat luas dari analisis citra dunia nyata hingga analisis citra medis seperti di MRI
Mari kita ketahui bagaimana mengimplementasikan kontur dalam opencv, dengan mengekstraksi kontur kotak.
impor cv2 impor numpy sebagai np
Mari memuat gambar sederhana dengan 3 kotak hitam
image = cv2.imread ('squares.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Grayscale
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Temukan tepi yang cerdik
edged = cv2.Canny (abu-abu, 30.200) cv2.imshow ('tepi cerdik', tepi) cv2.waitKey (0)
Menemukan kontur
# gunakan salinan gambar Anda, misalnya - edged.copy (), karena menemukan kontur mengubah gambar #kita harus menambahkan _, sebelum kontur sebagai argumen kosong karena peningkatan versi OpenCV _, kontur, hierarki = cv2.findContours (tepi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('tepi licin setelah pembentukan', tepi) cv2.waitKey (0)
Mencetak file kontur untuk mengetahui terdiri dari kontur
print (kontur) print ('Jumlah kontur yang ditemukan =' + str (len (kontur)))
Gambar semua kontur
#use -1 sebagai parameter ke-3 untuk menggambar semua kontur cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Output Konsol -],],], …,],],]], dtype = int32), Himpunan(],],
], …,
],],]], dtype = int32), larik (],],], …,],],]], dtype = int32)]
Jumlah kontur yang ditemukan = 3. Jadi kami telah menemukan total tiga kontur.
Sekarang, dalam kode di atas kami juga telah mencetak file kontur menggunakan , file ini memberi tahu bagaimana kontur ini terlihat, seperti yang dicetak pada output konsol di atas.
Pada keluaran konsol di atas kita memiliki matriks yang terlihat seperti koordinat titik x, y. OpenCV menyimpan kontur dalam daftar daftar. Kami hanya dapat menampilkan output konsol di atas sebagai berikut:
KONTUR 1 KONTUR 2 KONTUR 3
], larik (], larik (],],],],],],],
…,…,…,],],],],],],]], dtype = int32),]], dtype = int32),]], dtype = int32)]
Sekarang, karena kita menggunakan fungsi panjang pada file kontur, kita mendapatkan panjangnya sama dengan 3, artinya ada tiga daftar daftar di file itu, yaitu tiga kontur.
Sekarang, bayangkan CONTOUR 1 adalah elemen pertama dalam larik itu dan daftar itu berisi daftar semua koordinat dan koordinat ini adalah titik di sepanjang kontur yang baru saja kita lihat, sebagai kotak persegi panjang berwarna hijau.
Ada beberapa metode berbeda untuk menyimpan koordinat ini dan ini disebut metode aproksimasi, pada dasarnya metode aproksimasi ada dua jenis
- cv2.CHAIN_APPROX_NONE
- cv2.CHAIN_APPROX_SIMPLE
cv2.CHAIN_APPROX_NONE menyimpan semua titik batas, tetapi tidak perlu semua titik batas, jika titik tersebut membentuk garis lurus, kita hanya memerlukan titik awal dan titik akhir pada garis tersebut.
cv2.CHAIN_APPROX_SIMPLE hanya menyediakan titik awal dan akhir dari kontur pembatas, hasilnya adalah penyimpanan informasi kontur yang jauh lebih efisien.
_, kontur, hierarki = cv2.findContours (tepi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
Pada kode di atas cv2.RETR_EXTERNAL adalah mode pengambilan sedangkan cv2.CHAIN_APPROX_NONE adalah
metode perkiraan.
Jadi kita telah belajar tentang kontur dan metode aproksimasi, sekarang mari kita jelajahi mode hierarki dan pengambilan.
2. Hierarki dan Mode Pengambilan
Mode pengambilan menentukan hierarki dalam kontur seperti sub kontur, atau kontur eksternal atau semua kontur.
Sekarang ada empat mode pengambilan yang diurutkan berdasarkan tipe hierarki.
cv2.RETR_LIST - mengambil semua kontur.
cv2.RETR_EXTERNAL - mengambil kontur eksternal atau luar saja.
cv2.RETR_CCOMP - mengambil semua dalam hierarki 2 tingkat.
cv2.RETR_TREE - mengambil semua dalam hierarki penuh.
Hierarki disimpan dalam format berikut
Sekarang mari kita gambarkan perbedaan antara dua mode pengambilan pertama, cv2.RETR_LIST dan cv2.RETR_EXTERNAL.
impor cv2 impor numpy sebagai np
Mari memuat gambar sederhana dengan 3 kotak hitam
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Grayscale
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Temukan Canny Edges
edged = cv2.Canny (abu-abu, 30.200) cv2.imshow ('tepi cerdik', tepi) cv2.waitKey (0)
Menemukan Kontur
#menggunakan salinan gambar Anda, misalnya - edged.copy (), karena menemukan kontur mengubah gambar #kita harus menambahkan _, sebelum kontur sebagai argumen kosong karena peningkatan versi cv terbuka _, kontur, hierarki = cv2.findContours (tepi, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) cv2.imshow ('tepi licin setelah pembentukan', tepi) cv2.waitKey (0)
Mencetak file kontur untuk mengetahui terdiri dari kontur.
print (kontur) print ('Jumlah kontur yang ditemukan =' + str (len (kontur)))
Gambar semua kontur
#use -1 sebagai parameter ke-3 untuk menggambar semua kontur cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows
impor cv2 impor numpy sebagai np
Mari memuat gambar sederhana dengan 3 kotak hitam
image = cv2.imread ('square donut.jpg') cv2.imshow ('input image', image) cv2.waitKey (0)
Grayscale
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY)
Temukan tepi yang cerdik
edged = cv2.Canny (abu-abu, 30.200) cv2.imshow ('tepi cerdik', tepi) cv2.waitKey (0)
Menemukan kontur
#menggunakan salinan gambar Anda, misalnya - edged.copy (), karena menemukan kontur mengubah gambar #kita harus menambahkan _, sebelum kontur sebagai argumen kosong karena peningkatan versi cv terbuka _, kontur, hierarki = cv2.findContours (tepi, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE) cv2.imshow ('tepi licin setelah pembentukan', tepi) cv2.waitKey (0)
Mencetak file kontur untuk mengetahui terdiri dari kontur.
print (kontur) print ('Jumlah kontur yang ditemukan =' + str (len (kontur)))
Gambar semua kontur
#use -1 sebagai parameter ke-3 untuk menggambar semua kontur cv2.drawContours (image, contours, -1, (0,255,0), 3) cv2.imshow ('contours', image) cv2.waitKey (0) cv2. destroyAllWindows ()
Jadi melalui demonstrasi kode di atas kita dapat dengan jelas melihat perbedaan antara cv2.RETR_LIST dan cv2.RETR_EXTERNNAL , di cv2.RETR_EXTERNNAL hanya kontur luar yang diperhitungkan sementara kontur dalam diabaikan.
Sementara dalam kontur dalam cv2.RETR_LIST juga diperhitungkan.
3. Memperkirakan Kontur dan Menemukan Convex hull mereka
Dalam mendekati kontur, bentuk kontur didekati di atas bentuk kontur lainnya, yang mungkin tidak terlalu mirip dengan bentuk kontur pertama.
Untuk pendekatan kita menggunakan approxPolyDP fungsi OpenCV yang dijelaskan di bawah
cv2.approxPolyDP (kontur, akurasi perkiraan, tertutup)
Parameter:
- Kontur - adalah kontur individu yang ingin kami perkirakan.
- Approximation Accuracy - parameter penting dalam menentukan akurasi aproksimasi, nilai yang kecil memberikan aproksimasi yang tepat, nilai yang besar memberikan informasi yang lebih generik. Aturan jempol yang baik adalah kurang dari 5% keliling kontur.
- Tertutup - nilai Boolean yang menyatakan apakah perkiraan kontur dapat dibuka atau ditutup.
Mari kita coba memperkirakan sosok rumah sederhana
impor numpy sebagai np import cv2
Muat gambar dan simpan salinannya
image = cv2.imread ('house.jpg') orig_image = image.copy () cv2.imshow ('original image', orig_image) cv2.waitKey (0)
Grayscale dan binari gambar
abu-abu = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) ret, thresh = cv2.threshold (abu-abu, 127.255, cv2.THRESH_BINARY_INV)
Temukan Kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Iterasi melalui setiap kontur dan hitung persegi panjang pembatasnya
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)
Iterasi melalui setiap kontur dan hitung perkiraan konturnya
untuk c dalam kontur:
#hitung akurasi sebagai persen akurasi perimeter kontur = 0,03 * cv2.arcLength (c, True) kira-kira = cv2.approxPolyDP (c, akurasi, True) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('Approx polyDP', image) cv2.waitKey (0) cv2.destroyAllWindows ()
4. Convex Hull
Convex hull pada dasarnya adalah tepi luar, diwakili dengan menggambar garis di atas gambar tertentu.
Ini bisa menjadi poligon terkecil yang bisa muat di sekitar objek itu sendiri.
impor 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)
Batasi gambar
ret, thresh = cv2.threshold (abu-abu, 176,255,0)
Temukan kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Sortir kontur berdasarkan area lalu hapus kontur bingkai terbesar
n = len (kontur) -1 kontur = diurutkan (kontur, key = cv2.contourArea, reverse = False)
Iterasi melalui kontur dan gambar lambung cembung
untuk c dalam kontur:
hull = cv2.convexHull (c) cv2.drawContours (image,, 0, (0,255,0), 2) cv2.imshow ('convex hull', image) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Mencocokkan Kontur dengan bentuk
cv2.matchShapes (template kontur, metode kontur, parameter metode)
Output - nilai kecocokan (nilai yang lebih rendah berarti kecocokan yang lebih dekat)
template kontur - Ini adalah kontur referensi kami yang coba kami temukan di gambar baru.
kontur - Kontur individu yang kami periksa.
Metode - Jenis pencocokan kontur (1,2,3).
parameter metode - biarkan 0.0 (tidak digunakan dalam opencv python)
impor cv2 impor numpy sebagai np
Muat template bentuk atau gambar referensi
template = cv2.imread ('star.jpg', 0) cv2.imshow ('template', template) cv2.waitKey (0)
Muat gambar target dengan bentuk yang ingin kita cocokkan
target = cv2.imread ('shapestomatch.jpg') grey = cv2.cvtColor (target, cv2.COLOR_BGR2GRAY)
Batasi kedua gambar terlebih dahulu sebelum menggunakan cv2.findContours
ret, thresh1 = cv2.threshold (template, 127,255,0) ret, thresh2 = cv2.threshold (abu-abu, 127.255,0)
Temukan kontur di template
_, kontur, hierarhy = cv2.findContours (thresh1, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) #kita perlu mengurutkan kontur berdasarkan area sehingga kita dapat menghapus kontur terbesar yang
Garis besar gambar
sort_contours = sortir (contours, key = cv2.contourArea, reverse = True) #kami mengekstrak kontur terbesar kedua yang akan menjadi template kami kontur tempelate_contour = kontur #extraksi kontur dari gambar target kedua _, kontur, hierarki = cv2.findContours (thresh2, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE) untuk c dalam kontur: #iterasi melalui setiap kontur pada gambar target dan gunakan cv2.matchShape untuk membandingkan kecocokan bentuk kontur = cv2.matchShapes (tempelate_contour, c, 1,0.0) print ("match") #jika nilai kecocokan kurang dari 0.15 jika cocok <0.16: terdekat_contour = c else: terdekat_contour = cv2.drawContours (target,, - 1, (0,255,0), 3) cv2.imshow ('output',target) cv2.waitKey (0) cv2.destroyAllWindows ()
Output Konsol -
0.16818605122199104
0.19946910256158912
0.18949760627309664
0.11101058276281539
Ada tiga metode berbeda dengan fungsi matematika yang berbeda, kita dapat bereksperimen dengan masing-masing metode hanya dengan mengganti nilai metode cv2.matchShapes (tempelate_contour, c, 1, 0.0) yang bervariasi dari 1,2 dan 3, untuk setiap nilai Anda akan mendapatkan kecocokan yang berbeda nilai-nilai dalam keluaran konsol.
6. Mengidentifikasi Bentuk (lingkaran, persegi panjang, segitiga, persegi, bintang)
OpenCV juga dapat digunakan untuk mendeteksi berbagai jenis bentuk secara otomatis dari gambar. Dengan menggunakan kode di bawah ini kita akan dapat mendeteksi lingkaran, persegi panjang, segitiga, persegi dan bintang dari gambar.
impor cv2 impor numpy sebagai np
Muat dan kemudian gambar skala abu-abu
image = cv2.imread ('shape.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('mengidentifikasi bentuk', image) cv2.waitKey (0) ret, thresh = cv2.threshold (abu-abu, 127.255,1)
Ekstrak kontur
_, kontur, hierarki = cv2.findContours (thresh.copy (), cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
Untuk cnt dalam kontur:
Dapatkan perkiraan poligon kira-kira = cv2.approxPolyDP (cnt, 0.01 * cv2.arcLength (cnt, True), True) jika len ( perkiraan ) == 3: shape_name = "Triangle" cv2.drawContours (image,, 0, (0,255, 0), - 1)
cari pusat kontur untuk menempatkan teks di tengah
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 (perkiraan) == 4: x, y, w, h = cv2.boundingRect (cnt) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M)
Periksa apakah poligon bersisi empat itu persegi atau persegi panjang
# cv2.boundingRect mengembalikan lebar dan tinggi kiri dalam piksel, mulai dari sudut # kiri atas , untuk persegi kira-kira sama jika abs (wh) <= 3: shape_name = "square" #find contour center untuk menempatkan teks di 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) lainnya: shape_name = "Reactangle" #temukan pusat kontur untuk menempatkan teks di tengah cv2.drawContours (image,, 0, (0,0,255), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len ( perkiraan) == 10: shape_name = 'bintang' cv2.drawContours (image,, 0, (255,255,0), - 1) M = cv2.moments (cnt) cx = int (M / M) cy = int (M / M) cv2.putText (image, shape_name, (cx-50, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,0), 1) elif len ( perkiraan )> = 15: shape_name = 'circle' cv2.drawContours (image,, 0, (0,255,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) cv2.imshow ('mengidentifikasi bentuk', gambar) cv2.waitKey (0) cv2.destroyAllWindows ()
7. Deteksi Garis
Deteksi garis adalah konsep yang sangat penting dalam OpenCV, dan memiliki penggunaan yang menjanjikan di dunia nyata. Mobil otonom menggunakan algoritme deteksi garis untuk mendeteksi jalur dan jalan.
Dalam deteksi baris kita akan berurusan dengan dua algoritma,
- Algoritma Garis Hough
- Algoritma Garis Hough Probalistik.
Anda mungkin ingat representasi garis dari matematika SMA dengan persamaan y = mx + c.
Namun, dalam baris OpenCV diwakili oleh cara lain
Persamaan di atas ρ = xcosӨ + ysincosӨ adalah representasi OpenCV dari garis, dimana ρ adalah jarak tegak lurus garis dari titik asal dan Ө adalah sudut yang dibentuk oleh garis normal ini ke titik asal (diukur dalam radian, dimana 1pi radian / 180 = 1 derajat).
Fungsi OpenCV untuk mendeteksi garis diberikan sebagai
cv2.HoughLines (gambar binarisasi, akurasi ρ, Ө akurasi, ambang), di mana ambang batas adalah suara minimum untuk dianggap sebagai garis.
Sekarang mari kita mendeteksi garis untuk gambar kotak dengan bantuan fungsi garis Hough dari opencv.
import cv2 import numpy as np image = cv2.imread ('box.jpg')
Tepi abu-abu dan licin diekstraksi
abu-abu = cv2.cvtColor (gambar, cv2.COLOR_BGR2GRAY) tepi = cv2.Canny (abu-abu, 100.170, apertureSize = 3)
Jalankan garis Hough menggunakan akurasi rho 1 piksel
Akurasi #theta (np.pi / 180) yaitu 1 derajat # ambang batas diatur ke 240 (jumlah titik pada garis) baris = cv2.HoughLines (tepi, 1, np.pi / 180, 240) #we iterate melalui setiap baris dan ubah ke dalam format #diperlukan oleh cv2.lines (yaitu membutuhkan titik akhir) untuk i dalam rentang (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 ulangi deteksi garis di atas dengan algoritma lain dari garis probabilistik Hough.
Ide di balik garis probabilistik Hough adalah mengambil subset acak dari poin yang cukup untuk deteksi garis.
Fungsi OpenCV untuk probabilistic Hough line direpresentasikan sebagai cv2.HoughLinesP (image binarized, akurasi ρ, Ө akurasi, threshold, minimum line length, max line gap)
Sekarang mari kita mendeteksi garis kotak dengan bantuan garis probabilistik Hough.
impor cv2 impor numpy sebagai np
Tepi abu-abu dan licin Diekstrak
image = cv2.imread ('box.jpg') grey = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) edge = cv2.Canny (grey, 50.150, apertureSize = 3) #lagi kita menggunakan akurasi rho dan theta yang sama # bagaimanapun, kami menetapkan suara minimum (poin di sepanjang garis) 100 # dan panjang garis minimal 5 piksel dan jarak maksimum antara garis 10 piksel baris = cv2.HoughLinesP (tepi, 1, np.pi / 180,100,100,10) untuk i dalam rentang (0, len (garis)): untuk x1, y1, x2, y2 dalam baris: cv2.line (gambar, (x1, y1), (x2, y2), (0,255,0), 3) cv2. imshow ('probalistic hough lines', image) cv2.waitKey (0) cv2.destroyAllWindows
8. Deteksi blob
Blob dapat digambarkan sebagai sekelompok piksel yang terhubung yang semuanya memiliki properti yang sama. Metode untuk menggunakan detektor blob OpenCV dijelaskan melalui diagram alir ini.
Untuk menggambar poin-poin penting kami menggunakan cv2.drawKeypoints yang mengambil argumen berikut.
cv2.drawKeypoints (gambar masukan, keypoints, blank_output_array, color, flags)
di mana di benderanya
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 cukup banyak tidak lain adalah satu per satu matriks nol
Sekarang mari kita lakukan pendeteksian blob pada gambar bunga matahari, di mana gumpalan akan menjadi bagian tengah bunga karena gumpalan tersebut umum di antara semua bunga.
import cv2 import numpy as np image = cv2.imread ('Sunflowers.jpg', cv2.IMREAD_GRAYSCALE)
Siapkan detektor dengan parameter default
detektor = cv2.SimpleBlobDetector_create ()
Deteksi gumpalan
keypoints = detector.detect (gambar)
Gambarlah gumpalan yang terdeteksi sebagai lingkaran merah
# cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS memastikan #size lingkaran sesuai dengan ukuran blob blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,255), cv2.DRAW_MAT_DCHESULT)
Tunjukkan titik kunci
cv2.imshow ('gumpalan', gumpalan) cv2.waitKey (0) cv2.destroyAllWindows ()
Meskipun kodenya berfungsi dengan baik tetapi beberapa gumpalan terlewat karena ukuran bunga yang tidak rata karena bunga di depan lebih besar dibandingkan dengan bunga di bagian akhir.
9. Menyaring Blob - Menghitung Lingkaran dan Elips
Kita dapat menggunakan parameter untuk memfilter gumpalan menurut bentuk, ukuran, dan warnanya. Untuk menggunakan parameter dengan detektor blob kami menggunakan fungsi OpenCV
cv2.SimpleBlobDetector_Params ()
Kita akan melihat pemfilteran gumpalan terutama dengan empat parameter yang tercantum di bawah ini:
Daerah
params.filterByArea = Benar / Salah params.minArea = piksel params.maxArea = piksel
Bentuk bundar
params.filterByCircularity = Benar / Salah params.minCircularity = 1 sempurna, 0 berlawanan
Convexity - Luas gumpalan / luas convex hull
params.filterByConvexity = Benar / Salah params.minConvexity = Luas
Kelembaman
params.filterByInertia = Benar / Salah params.minInertiaRatio = 0,01
Sekarang mari kita coba untuk memfilter gumpalan dengan parameter yang disebutkan di atas
import cv2 import numpy as np image = cv2.imread ('blobs.jpg') cv2.imshow ('original image', image) cv2.waitKey (0)
Inisialisasi detektor menggunakan parameter default
detektor = cv2.SimpleBlobDetector_create ()
Deteksi gumpalan
keypoints = detector.detect (gambar)
Gambarkan gumpalan pada gambar kita sebagai lingkaran merah
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,0,255), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "total tidak ada blob" (len (keypoints)) cv2.putText (blobs, teks, (20.550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100,0,255), 2)
Tampilkan gambar dengan titik kunci blob
cv2.imshow ('blob menggunakan parameter default', blob) cv2.waitKey (0)
Tetapkan parameter pemfilteran kami
#initialize pengaturan parameter menggunakan cv2.SimpleBlobDetector params = cv2.SimpleBlobDetector_Params ()
Tetapkan parameter pemfilteran area
params.filterByArea = Benar params.minArea = 100
Tetapkan parameter pemfilteran sirkularitas
params.filterByCircularity = Benar params.minCircularity = 0,9
Tetapkan parameter pemfilteran konveksitas
params.filterByConvexity = Salah params.minConvexity = 0,2
Setel parameter pemfilteran inersia
params.filterByInertia = Benar params.minInertiaRatio = 0,01
Buat detektor dengan parameter
detektor = cv2.SimpleBlobDetector_create (params)
Deteksi gumpalan
keypoints = detector.detect (gambar)
Gambarkan gumpalan pada gambar sebagai lingkaran merah
blank = np.zeros ((1,1)) blobs = cv2.drawKeypoints (image, keypoints, blank, (0,255,0), cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) number_of_blobs = len (keypoints) text = "jumlah total gumpalan melingkar str (len (keypoints)) cv2.putText (blob, teks, (20.550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,100,255), 2)
Tampilkan gumpalan
cv2.imshow ('memfilter gumpalan melingkar', gumpalan) cv2.waitKey (0) cv2.destroyAllWindows ()
Jadi ini adalah bagaimana segmentasi gambar dapat dilakukan dengan Python-OpenCV. Untuk memahami visi komputer dan OpenCV dengan baik, baca artikel sebelumnya (Memulai Python OpenCV dan Manipulasi Gambar dengan Python OpenCV dan Anda akan dapat membuat sesuatu yang keren dengan Computer Vision.