Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

OpenCV Thresholding dengan Python dengan cv2.threshold()

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

Proses penting ini dikenal sebagai Ambang Batas Biner. Sekarang โ€“ ada berbagai cara Anda dapat mengubah ide umum ini, termasuk membalikkan operasi (mengalihkan > tanda tangani dengan < tanda), mengatur pixel_value ke threshold alih-alih nilai maksimum/0 (dikenal sebagai pemotongan), menjaga pixel_value sendiri jika di atas threshold atau jika di bawah threshold.

Semua ini telah dengan mudah diimplementasikan di OpenCV sebagai:

  • cv2.THRESH_BINARY
  • cv2.THRESH_BINARY_INV
  • cv2.THRESH_TRUNC
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

โ€ฆ masing-masing. Ini adalah metode yang relatif "naif" karena cukup sederhana, tidak memperhitungkan konteks dalam gambar, memiliki pengetahuan tentang bentuk apa yang umum, dll. Untuk properti ini โ€“ kita harus menggunakan komputasi yang jauh lebih mahal dan kuat teknik.

Sekarang, bahkan dengan metode โ€œnaifโ€ โ€“ beberapa heuristik dapat diterapkan, untuk menemukan ambang batas yang baik, dan ini termasuk metode Otsu dan metode Segitiga:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Catatan: Thresholding OpenCV adalah teknik dasar, dan sensitif terhadap perubahan pencahayaan dan gradien, heterogenitas warna, dll. Paling baik diterapkan pada gambar yang relatif bersih, setelah mengaburkannya untuk mengurangi noise, tanpa banyak variasi warna pada objek yang ingin Anda segmentasikan.

Cara lain untuk mengatasi beberapa masalah dengan ambang batas dasar dengan nilai ambang tunggal adalah dengan menggunakan ambang batas adaptif yang menerapkan nilai ambang batas pada setiap wilayah kecil dalam sebuah gambar, bukan secara global.

Ambang Batas Sederhana dengan OpenCV

Ambang batas di API Python OpenCV dilakukan melalui cv2.threshold() metode โ€“ yang menerima gambar (array NumPy, diwakili dengan bilangan bulat), ambang batas, nilai maksimum dan metode ambang batas (bagaimana threshold dan maximum_value digunakan):

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

img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


blurred = cv2.GaussianBlur(img, (7, 7), 0)

ret, img_masked = cv2.threshold(blurred, 220, 255, cv2.THRESH_BINARY)

Kode pengembalian hanyalah ambang batas yang diterapkan:

print(f"Threshold: {ret}") 

Di sini, karena ambang batasnya adalah 220 dan kami telah menggunakan THRESH_BINARY metode โ€“ setiap nilai piksel di atas 220 akan meningkat menjadi 255, sedangkan setiap nilai piksel di bawah 220 akan diturunkan menjadi 0, membuat gambar hitam putih, dengan "topeng", menutupi objek latar depan.

Mengapa 220? Mengetahui seperti apa gambar itu memungkinkan Anda membuat perkiraan perkiraan tentang ambang batas yang dapat Anda pilih. Dalam praktiknya, Anda jarang ingin menyetel ambang batas manual, dan kami akan membahas pemilihan ambang batas otomatis sebentar lagi.

Mari kita plot hasilnya! Jendela OpenCV bisa sedikit rumit, jadi kami akan memplot gambar asli, gambar buram, dan hasilnya menggunakan Matplotlib:

fig, ax = plt.subplots(1, 3, figsize=(12, 8))
ax[0].imshow(img)
ax[1].imshow(blurred)
ax[2].imshow(img_masked)

Metode Ambang Batas

Seperti disebutkan sebelumnya, ada berbagai cara Anda dapat menggunakan ambang batas dan nilai maksimum dalam suatu fungsi. Kami telah melihat ambang biner pada awalnya. Mari membuat daftar metode, dan menerapkannya satu per satu, memplot hasilnya:

methods = [cv2.THRESH_BINARY, cv2.THRESH_BINARY_INV, cv2.THRESH_TRUNC, cv2.THRESH_TOZERO, cv2.THRESH_TOZERO_INV]
names = ['Binary Threshold', 'Inverse Binary Threshold', 'Truncated Threshold', 'To-Zero Threshold', 'Inverse To-Zero Threshold']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    blurred = cv2.GaussianBlur(img, (7, 7), 0)
    ret, img_masked = cv2.threshold(blurred, 220, 255, method)

    fig, ax = plt.subplots(1, 3, figsize=(12, 4))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(img)
    ax[1].imshow(blurred)
    ax[2].imshow(img_masked)
    plt.tight_layout()

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

THRESH_BINARY dan THRESH_BINARY_INV terbalik satu sama lain, dan binerisasi gambar antara 0 dan 255, menetapkan mereka ke latar belakang dan latar depan masing-masing, dan sebaliknya.

THRESH_TRUNC binerisasi gambar antara threshold dan 255.

THRESH_TOZERO dan THRESH_TOZERO_INV binerisasi antara 0 dan nilai piksel saat ini (src(x, y)). Mari kita lihat gambar yang dihasilkan:

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

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!

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.
Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.
Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.
Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

Metode ini cukup intuitif โ€“ tetapi, bagaimana kita dapat mengotomatiskan nilai ambang batas yang baik, dan apa arti nilai โ€œambang batas yang baikโ€? Sebagian besar hasil sejauh ini memiliki topeng yang tidak ideal, dengan tanda dan bintik di dalamnya. Hal ini terjadi karena perbedaan permukaan reflektif dari koin โ€“ mereka tidak memiliki warna yang seragam karena perbedaan bagaimana ridge memantulkan cahaya.

Kita bisa, sampai taraf tertentu, melawan ini dengan menemukan ambang batas global yang lebih baik.

Ambang Batas Otomatis/Dioptimalkan dengan OpenCV

OpenCV menggunakan dua metode pencarian ambang batas global yang efektif โ€“ metode Otsu, dan metode Segitiga.

Metode Otsu mengasumsikan bahwa itu berhasil dua modal gambar-gambar. Gambar bi-modal adalah gambar yang histogram warnanya hanya berisi dua puncak (yaitu hanya memiliki dua nilai piksel yang berbeda). Mempertimbangkan bahwa masing-masing puncak termasuk dalam kelas seperti "latar belakang" dan "latar depan" - ambang batas ideal berada tepat di tengah-tengahnya.

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.
Gambar kredit: https://scipy-lectures.org/

Anda dapat membuat beberapa gambar lebih bi-modal dengan gaussian blur, tetapi tidak semuanya.

Alternatif, seringkali algoritma berkinerja lebih baik adalah algoritma segitiga, yang menghitung jarak antara maksimum dan minimum dari histogram tingkat abu-abu dan menarik garis. Titik di mana garis tersebut paling jauh dari sisa histogram dipilih sebagai treshold:

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

Keduanya mengasumsikan gambar skala abu-abu, jadi kita perlu mengonversi gambar input menjadi abu-abu melalui cv2.cvtColor():

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

ret, mask1 = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
ret, mask2 = cv2.threshold(blurred, 0, 255, cv2.THRESH_TRIANGLE)

masked = cv2.bitwise_and(img, img, mask=mask1)

Mari jalankan gambar dengan kedua metode dan visualisasikan hasilnya:

methods = [cv2.THRESH_OTSU, cv2.THRESH_TRIANGLE]
names = ['Otsu Method', 'Triangle Method']

def thresh(img_path, method, index):
    img = cv2.imread(img_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (7, 7), 0)

    ret, img_masked = cv2.threshold(blurred, 0, 255, method)
    print(f"Threshold: {ret}")

    fig, ax = plt.subplots(1, 3, figsize=(12, 5))
    fig.suptitle(names[index], fontsize=18)
    ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    ax[1].imshow(cv2.cvtColor(gray, cv2.COLOR_BGR2RGB))
    ax[2].imshow(cv2.cvtColor(img_masked, cv2.COLOR_BGR2RGB))

for index, method in enumerate(methods):
    thresh('coins.jpeg', method, index)

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.
Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

Di sini, metode segitiga mengungguli metode Otsu, karena gambarnya bukan bi-modal:

import numpy as np

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

histogram_gray, bin_edges_gray = np.histogram(gray, bins=256, range=(0, 255))
histogram_blurred, bin_edges_blurred = np.histogram(blurred, bins=256, range=(0, 255))

fig, ax = plt.subplots(1, 2, figsize=(12, 4))

ax[0].plot(bin_edges_gray[0:-1], histogram_gray)
ax[1].plot(bin_edges_blurred[0:-1], histogram_blurred)

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. Pencarian Vertikal. Ai.

Namun, jelas bagaimana metode segitiga mampu bekerja dengan gambar dan menghasilkan hasil yang lebih memuaskan.

Batasan OpenCV Thresholding

Thresholding dengan OpenCV sederhana, mudah dan efisien. Namun, itu cukup terbatas. Segera setelah Anda memperkenalkan elemen warna-warni, latar belakang yang tidak seragam, dan kondisi pencahayaan yang berubah โ€“ ambang batas global sebagai sebuah konsep menjadi terlalu kaku.

Gambar biasanya terlalu rumit untuk satu ambang batas, dan ini sebagian dapat diatasi melalui ambang batas adaptif, di mana banyak ambang batas lokal diterapkan alih-alih satu ambang batas global. Meskipun juga terbatas, ambang batas adaptif jauh lebih fleksibel daripada ambang batas global.

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 mudah dan cepat, Anda dapat menggunakan OpenCV. 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โ€.

Thresholding OpenCV dalam Python dengan cv2.threshold() Intelijen Data PlatoBlockchain. 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