Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

OpenCV Adaptive Thresholding dengan Python dengan cv2.adaptiveThreshold()

Pengantar

Thresholding adalah teknik sederhana dan efisien untuk melakukan segmentasi dasar dalam sebuah gambar, dan untuk binerisasi (mengubahnya menjadi gambar biner) di mana piksel 0 or 1 (Atau 255 jika Anda menggunakan bilangan bulat untuk mewakilinya).

Biasanya, Anda dapat menggunakan ambang batas untuk melakukan segmentasi latar belakang-depan sederhana dalam gambar, dan itu bermuara pada varian teknik sederhana untuk setiap piksel:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

Thresholding sederhana memiliki masalah mencolok dan membutuhkan input yang cukup murni, yang membuatnya tidak terlalu praktis untuk banyak kasus penggunaan. Pelaku utama adalah ambang batas global yang diterapkan ke seluruh gambar, sedangkan gambar jarang cukup seragam untuk ambang batas selimut berfungsi, kecuali jika itu buatan.

Ambang batas global akan bekerja dengan baik untuk memisahkan karakter dalam buku hitam putih, pada halaman yang dipindai. Ambang batas global kemungkinan besar akan gagal pada gambar ponsel dari halaman yang sama, karena kondisi pencahayaan dapat bervariasi antar bagian halaman, membuat titik batas global terlalu sensitif terhadap data nyata.

Untuk mengatasi ini โ€“ kita dapat mempekerjakan lokal ambang batas, menggunakan teknik yang dikenal sebagai ambang batas adaptif. Alih-alih memperlakukan semua bagian gambar dengan aturan yang sama, kita dapat mengubah ambang batas untuk masing-masing area lokal yang tampaknya cocok untuk itu. Hal ini membuat ambang batas sebagian tidak berubah terhadap perubahan pencahayaan, kebisingan, dan faktor lainnya. Meskipun jauh lebih berguna daripada ambang batas global, ambang batas itu sendiri adalah teknik yang terbatas dan kaku, dan paling baik diterapkan untuk membantu pra-pemrosesan gambar (terutama ketika harus mengidentifikasi gambar yang akan dibuang), daripada segmentasi.

Untuk aplikasi yang lebih rumit yang memerlukan konteks, Anda sebaiknya menggunakan teknik yang lebih canggih, termasuk pembelajaran mendalam, yang telah mendorong kemajuan terbaru dalam visi komputer.

Ambang Batas Adaptif dengan OpenCV

Mari memuat gambar dengan kondisi pencahayaan variabel, di mana satu bagian gambar lebih fokus daripada yang lain, dengan gambar diambil dari sudut. Gambar yang saya ambil dari Harold McGee's โ€œTentang Makanan dan Memasakโ€ akan melayani dengan baik!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

Sekarang, dengan menggunakan thresholding biasa, kita dapat mencoba untuk memisahkan huruf dari latar belakang, karena ada perbedaan warna yang jelas di antara mereka. Semua warna kertas akan diperlakukan sebagai latar belakang. Karena kita tidak benar-benar tahu apa ambang batas yang seharusnya โ€“ mari kita terapkan metode Otsu untuk menemukan nilai yang baik, mengantisipasi bahwa gambar agak bi-modal (kebanyakan didominasi oleh dua warna):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

Mari kita lihat hasilnya:

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Aduh. Bagian kiri teks sebagian besar memudar, bayangan di sekitar selokan benar-benar memakan sebagian gambar, dan teksnya terlalu jenuh! Ini adalah gambar "di alam liar", dan aturan menyeluruh seperti ambang batas global tidak berfungsi dengan baik. Apa yang harus menjadi ambang batas? Itu tergantung pada bagian gambar!

Grafik cv2.adaptiveThreshold() metode memungkinkan kita untuk melakukan hal ini:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

Grafik adaptive_method bisa menjadi cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_C, Di mana C adalah argumen terakhir yang Anda tetapkan. Kedua metode ini menghitung ambang batas menurut tetangga dari piksel yang bersangkutan, di mana block_size menentukan jumlah tetangga yang akan dipertimbangkan (luas lingkungan).

ADAPTIVE_THRESH_MEAN_C mengambil rata-rata tetangga dan memotong C, Sementara ADAPTIVE_THRESH_GAUSSIAN_C mengambil jumlah tertimbang gaussian dari tetangga dan mengurangi C.

Lihat panduan praktis dan praktis kami untuk mempelajari Git, dengan praktik terbaik, standar yang diterima industri, dan termasuk lembar contekan. Hentikan perintah Googling Git dan sebenarnya belajar itu!

Ini juga memungkinkan Anda untuk mengatur strategi binarisasi, tetapi terbatas pada THRESH_BINARY dan THRESH_BINARY_INV, dan mengubah di antara keduanya akan secara efektif mengubah apa yang "latar belakang" dan apa yang "latar depan".

Metode ini hanya mengembalikan topeng untuk gambar โ€“ bukan kode pengembalian dan topeng. Mari kita coba mengelompokkan karakter dalam gambar yang sama seperti sebelumnya, menggunakan ambang batas adaptif:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

Ini menghasilkan gambar yang jauh lebih jelas:

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Catatan: Grafik block_size argumen harus berupa angka yang tidak rata.

Dengan cara yang hampir sama, kita dapat menerapkan gaussian thresholding:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

Yang juga menghasilkan gambar yang cukup memuaskan pada akhirnya:

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Baik ukuran blok (area tetangga) dan C adalah hyperparameters untuk menyetel di sini. Cobalah nilai yang berbeda dan pilih salah satu yang paling sesuai untuk gambar Anda. Secara umum, gaussian thresholding kurang sensitif terhadap noise dan akan menghasilkan gambar yang sedikit lebih suram dan bersih, tetapi ini bervariasi dan tergantung pada input.

Batasan Ambang Adaptif

Dengan ambang batas adaptif, kami dapat menghindari batasan ambang batas yang menyeluruh, tetapi masih relatif kaku dan tidak berfungsi dengan baik untuk input berwarna. Misalnya, jika kita memuat gambar gunting dan kit kecil dengan warna berbeda, bahkan ambang batas adaptif akan memiliki masalah yang benar-benar menyegmentasikannya dengan benar, dengan fitur gelap tertentu yang diuraikan, tetapi tanpa seluruh objek dipertimbangkan:

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Jika kita mengubah ukuran blok dan C, kita dapat membuatnya menganggap tambalan yang lebih besar sebagai bagian dari objek yang sama, tetapi kemudian mengalami masalah dengan membuat ukuran tetangga terlalu mendunia, kembali ke masalah menyeluruh yang sama dengan ambang batas global:

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Kesimpulan

Dalam beberapa tahun terakhir, segmentasi biner (seperti yang kami lakukan di sini) dan segmentasi multi-label (di mana Anda dapat memiliki jumlah kelas yang dikodekan secara acak) telah berhasil dimodelkan dengan jaringan pembelajaran mendalam, yang jauh lebih kuat dan fleksibel. Selain itu, mereka dapat mengkodekan konteks global dan lokal ke dalam gambar yang mereka segmentasikan. Kelemahannya adalah โ€“ Anda memerlukan data untuk melatih mereka, serta waktu dan keahlian.

Untuk ambang batas yang sederhana dan cepat, Anda dapat menggunakan OpenCV, dan melawan beberapa keterbatasan menggunakan ambang batas adaptif daripada strategi ambang batas global. Untuk segmentasi tingkat produksi yang akurat, Anda sebaiknya menggunakan jaringan saraf.

Melangkah Lebih Jauh โ€“ Pembelajaran Mendalam Praktis untuk Visi Komputer

Sifat ingin tahu Anda membuat Anda ingin melangkah lebih jauh? Kami merekomendasikan untuk memeriksa kami Kelas: โ€œPembelajaran Mendalam Praktis untuk Visi Komputer dengan Pythonโ€.

Ambang Batas Adaptif OpenCV dengan Python dengan cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence. Pencarian Vertikal. Ai.

Kursus Computer Vision lainnya?

Kami tidak akan melakukan klasifikasi digit MNIST atau mode MNIST. Mereka melayani bagian mereka sejak lama. Terlalu banyak sumber belajar yang berfokus pada kumpulan data dasar dan arsitektur dasar sebelum membiarkan arsitektur kotak hitam tingkat lanjut memikul beban kinerja.

Kami ingin fokus pada demistifikasi, kepraktisan, pemahaman, intuisi dan proyek nyata. Mau belajar bagaimana Anda dapat membuat perbedaan? Kami akan membawa Anda dalam perjalanan dari cara otak kami memproses gambar hingga menulis pengklasifikasi pembelajaran mendalam tingkat penelitian untuk kanker payudara hingga jaringan pembelajaran mendalam yang "berhalusinasi", mengajari Anda prinsip dan teori melalui kerja praktik, membekali Anda dengan pengetahuan dan alat untuk menjadi ahli dalam menerapkan pembelajaran mendalam untuk memecahkan visi komputer.

Apa yang ada di dalam?

  • Prinsip pertama visi dan bagaimana komputer dapat diajarkan untuk "melihat"
  • Berbagai tugas dan aplikasi visi komputer
  • Alat perdagangan yang akan membuat pekerjaan Anda lebih mudah
  • Menemukan, membuat, dan memanfaatkan kumpulan data untuk visi komputer
  • Teori dan penerapan Jaringan Saraf Konvolusi
  • Menangani pergeseran domain, kejadian bersama, dan bias lainnya dalam kumpulan data
  • Transfer Belajar dan memanfaatkan waktu pelatihan dan sumber daya komputasi orang lain untuk keuntungan Anda
  • Membangun dan melatih pengklasifikasi kanker payudara yang canggih
  • Bagaimana menerapkan dosis skeptisisme yang sehat untuk mengarusutamakan gagasan dan memahami implikasi dari teknik yang diadopsi secara luas
  • Memvisualisasikan "ruang konsep" ConvNet menggunakan t-SNE dan PCA
  • Studi kasus tentang bagaimana perusahaan menggunakan teknik visi komputer untuk mencapai hasil yang lebih baik
  • Evaluasi model yang tepat, visualisasi ruang laten dan mengidentifikasi perhatian model
  • Melakukan penelitian domain, memproses kumpulan data Anda sendiri, dan membuat pengujian model
  • Arsitektur mutakhir, perkembangan ide, apa yang membuatnya unik dan bagaimana menerapkannya
  • KerasCV โ€“ perpustakaan WIP untuk menciptakan saluran pipa dan model yang canggih
  • Cara mengurai dan membaca makalah dan menerapkannya sendiri
  • Memilih model tergantung pada aplikasi Anda
  • Membuat pipeline machine learning ujung ke ujung
  • Lanskap dan intuisi pada deteksi objek dengan R-CNN, RetinaNet, SSD, dan YOLO yang Lebih Cepat
  • Instance dan segmentasi semantik
  • Pengenalan Objek Real-Time dengan YOLOv5
  • Melatih Detektor Objek YOLOv5
  • Bekerja dengan Transformers menggunakan KerasNLP (perpustakaan WIP kekuatan industri)
  • Mengintegrasikan Transformer dengan ConvNets untuk menghasilkan keterangan gambar
  • Deepdream
  • Optimalisasi model Deep Learning untuk visi komputer

Stempel Waktu:

Lebih dari penyalahgunaan