cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Python'da cv2.threshold() ile OpenCV Thresholding

Giriş

Eşikleme, bir görüntüde temel bölütlemeyi gerçekleştirmek ve piksellerin ya 0 or 1 (Ya da 255 onları temsil etmek için tamsayılar kullanıyorsanız).

Tipik olarak, bir görüntüde basit arka plan-ön plan segmentasyonu gerçekleştirmek için eşiklemeyi kullanabilirsiniz ve bu, her piksel için basit bir teknikteki varyantlara indirgenir:

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

Bu temel süreç olarak bilinir İkili Eşik. Şimdi – bu genel fikri düzeltmenin çeşitli yolları var, buna işlemleri tersine çevirmek de dahil. > ile imzala < işareti), ayar pixel_value için threshold maksimum değer/0 yerine (kesme olarak bilinir), pixel_value kendisinin üzerindeyse threshold veya altındaysa threshold.

Bunların tümü, OpenCV'de şu şekilde uygun bir şekilde uygulanmıştır:

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

… sırasıyla. Bunlar nispeten “naif” yöntemlerdir, çünkü oldukça basittirler, görüntülerdeki bağlamı hesaba katmazlar, hangi şekillerin yaygın olduğu hakkında bilgi sahibi olurlar, vb. Bu özellikler için – hesaplama açısından çok daha pahalı ve güçlü kullanmamız gerekir. teknikler.

Şimdi, “naif” yöntemlerle bile – biraz iyi eşikler bulmak için buluşsal yöntemler kullanılabilir ve bunlar Otsu yöntemini ve Üçgen yöntemini içerir:

  • cv2.THRESH_OTSU
  • cv2.THRESH_TRIANGLE

Not: OpenCV eşikleme ilkel bir tekniktir ve ışık değişimlerine ve gradyanlara, renk heterojenliğine vb. karşı hassastır. En iyi şekilde, segmentlere ayırmak istediğiniz nesnelerde çok fazla renk farkı olmaksızın, gürültüyü azaltmak için bulanıklaştırdıktan sonra nispeten temiz resimlere uygulanır.

Tek bir eşik değeri ile temel eşikleme ile ilgili bazı sorunların üstesinden gelmenin başka bir yolu, uyarlanabilir eşikleme genel olarak değil, bir görüntüdeki her küçük bölgeye bir eşik değeri uygular.

OpenCV ile Basit Eşikleme

OpenCV'nin Python API'sindeki eşikleme şu şekilde yapılır: cv2.threshold() yöntem – bir görüntüyü (tamsayılarla temsil edilen NumPy dizisi), eşiği, maksimum değeri ve eşikleme yöntemini (nasıl threshold ve maximum_value kullanılmış):

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)

Dönüş kodu yalnızca uygulanan eşiktir:

print(f"Threshold: {ret}") 

Burada eşik olduğu için 220 ve biz kullandık THRESH_BINARY yöntem – yukarıdaki her piksel değeri 220 artırılacak 255, aşağıdaki her piksel değeri 220 düşürülecek 0, ön plan nesnelerini kaplayan bir “maske” ile siyah beyaz bir görüntü oluşturur.

Neden 220? Görüntünün neye benzediğini bilmek, hangi eşiği seçebileceğiniz konusunda bazı yaklaşık tahminler yapmanızı sağlar. Pratikte, nadiren manuel bir eşik belirlemek isteyeceksiniz ve biz de birazdan otomatik eşik seçimini ele alacağız.

Sonucu çizelim! OpenCV pencereleri biraz titiz olabilir, bu nedenle orijinal görüntüyü, bulanık görüntüyü ve sonuçları Matplotlib kullanarak çizeceğiz:

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

Eşikleme Yöntemleri

Daha önce belirtildiği gibi, bir fonksiyonda eşiği ve maksimum değeri kullanmanın çeşitli yolları vardır. Başlangıçta ikili eşiğe bir göz attık. Bir yöntem listesi oluşturalım ve bunları tek tek uygulayalım, sonuçları çizelim:

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 ve THRESH_BINARY_INV birbirlerinin tersidir ve aralarındaki bir görüntüyü ikili hale getirirler. 0 ve 255, bunları sırasıyla arka plana ve ön plana atayarak veya tam tersi.

THRESH_TRUNC arasında görüntüyü ikili hale getirir threshold ve 255.

THRESH_TOZERO ve THRESH_TOZERO_INV arasında ikili hale getirmek 0 ve geçerli piksel değeri (src(x, y)). Ortaya çıkan görüntülere bir göz atalım:

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

En iyi uygulamalar, endüstri tarafından kabul edilen standartlar ve dahil edilen hile sayfası ile Git'i öğrenmek için uygulamalı, pratik kılavuzumuza göz atın. Googling Git komutlarını durdurun ve aslında öğrenmek o!

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.
cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.
cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.
cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bu yöntemler yeterince sezgiseldir – ancak iyi bir eşik değerini nasıl otomatikleştirebiliriz ve “iyi eşik” değeri ne anlama gelir? Şimdiye kadar elde edilen sonuçların çoğunda, içinde işaretler ve lekeler bulunan ideal olmayan maskeler vardı. Bu, madeni paraların yansıtıcı yüzeylerindeki farklılıktan kaynaklanır - çıkıntıların ışığı yansıtma biçimindeki farklılık nedeniyle tek tip renkli değildirler.

Daha iyi bir küresel eşik bularak bir dereceye kadar bununla savaşabiliriz.

OpenCV ile Otomatik/Optimize Edilmiş Eşik

OpenCV, iki etkili global eşik arama yöntemini kullanır – Otsu'nun yöntemi ve Üçgen yöntemi.

Otsu'nun yöntemi, üzerinde çalıştığını varsayar. çift ​​modlu Görüntüler. İki modlu görüntüler, renk histogramları yalnızca iki tepe içeren (yani yalnızca iki farklı piksel değerine sahip olan) görüntülerdir. Zirvelerin her birinin “arka plan” ve “ön plan” gibi bir sınıfa ait olduğu düşünülürse, ideal eşik bunların tam ortasındadır.

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.
Görüntü kredi: https://scipy-lectures.org/

Gauss bulanıklıkları ile bazı görüntüleri daha iki modlu hale getirebilirsiniz, ancak hepsini değil.

Alternatif, genellikle daha iyi performans gösteren bir algoritma, gri seviyeli histogramın maksimum ve minimum arasındaki mesafeyi hesaplayan ve bir çizgi çizen üçgen algoritmasıdır. Bu çizginin histogramın geri kalanından maksimum uzak olduğu nokta eşik olarak seçilir:

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bunların her ikisi de gri tonlamalı bir görüntü varsayar, bu nedenle giriş görüntüsünü şu yolla griye dönüştürmemiz gerekir: 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)

Görüntüyü her iki yöntemle de çalıştıralım ve sonuçları görselleştirelim:

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)

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.
cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Burada üçgen yöntemi, görüntü iki modlu olmadığı için Otsu'nun yönteminden daha iyi performans gösterir:

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)

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Bununla birlikte, üçgen yönteminin görüntü ile nasıl çalışabildiği ve daha tatmin edici bir sonuç üretebildiği açık.

OpenCV Eşiklerinin Sınırlamaları

OpenCV ile eşikleme basit, kolay ve verimlidir. Ancak oldukça sınırlıdır. Renkli öğeleri, tekdüze olmayan arka planları ve değişen aydınlatma koşullarını tanıttığınız anda, bir kavram olarak küresel eşikleme çok katı hale gelir.

Görüntüler genellikle tek bir eşiğin yeterli olamayacak kadar karmaşıktır ve bu kısmen şu yollarla ele alınabilir: uyarlanabilir eşikleme, burada tek bir global eşik yerine birçok yerel eşik uygulanır. Ayrıca sınırlı olmakla birlikte, uyarlanabilir eşikleme, küresel eşiklemeye göre çok daha esnektir.

Sonuç

Son yıllarda, ikili segmentasyon (burada yaptığımız gibi) ve çok etiketli segmentasyon (rasgele sayıda sınıfı kodlayabileceğiniz), çok daha güçlü ve esnek olan derin öğrenme ağları ile başarılı bir şekilde modellenmiştir. Ayrıca, küresel ve yerel bağlamı, bölümlere ayırdıkları görüntülere kodlayabilirler. Dezavantajı ise – onları eğitmek için verilere, ayrıca zamana ve uzmanlığa ihtiyacınız var.

Anında, basit eşikleme için OpenCV kullanabilirsiniz. Doğru, üretim düzeyinde segmentasyon için sinir ağlarını kullanmak isteyeceksiniz.

Daha İleri Gitmek – Bilgisayarla Görme için Pratik Derin Öğrenme

Meraklı doğanız daha ileri gitmek istemenizi sağlıyor mu? bizim kontrol etmenizi öneririz Kurs: “Python ile Bilgisayarla Görme için Pratik Derin Öğrenme”.

cv2.threshold() ile Python'da OpenCV Eşikleme PlatoBlockchain Veri Zekası. Dikey Arama. Ai.

Başka Bir Bilgisayarla Görme Kursu mu?

MNIST rakamları veya MNIST modası sınıflandırması yapmayacağız. Uzun zaman önce rollerine hizmet ettiler. Çok fazla öğrenme kaynağı, gelişmiş kara kutu mimarilerinin performans yükünü omuzlamasına izin vermeden önce temel veri kümelerine ve temel mimarilere odaklanıyor.

odaklanmak istiyoruz gizemden arındırma, pratiklik, anlayış, sezgi ve gerçek projeler. Öğrenmek istemek Nasıl bir fark yaratabilirsin? Beynimizin görüntüleri işleme biçiminden meme kanseri için araştırma düzeyinde bir derin öğrenme sınıflandırıcısı yazmaya, “halüsinasyon” gören derin öğrenme ağlarına, size ilkeleri ve teoriyi pratik çalışmalarla öğreterek, sizi aşağıdaki bilgilerle donatmaya kadar bir yolculuğa çıkaracağız. bilgisayar vizyonunu çözmek için derin öğrenmeyi uygulamada uzman olmak için teknik bilgi ve araçlar.

İçinde ne var?

  • Görmenin ilk ilkeleri ve bilgisayarlara “görmeyi” nasıl öğretebiliriz?
  • Bilgisayarla görmenin farklı görevleri ve uygulamaları
  • İşinizi kolaylaştıracak ticaret araçları
  • Bilgisayarla görü için veri kümelerini bulma, oluşturma ve kullanma
  • Evrişimli Sinir Ağlarının teorisi ve uygulaması
  • Veri kümelerinde etki alanı kayması, birlikte oluşma ve diğer önyargıları işleme
  • Öğrenimi aktarın ve başkalarının eğitim süresini ve hesaplama kaynaklarını kendi yararınıza kullanın
  • Son teknoloji bir meme kanseri sınıflandırıcısı oluşturmak ve eğitmek
  • Ana akım fikirlere sağlıklı bir şüphecilik dozu nasıl uygulanır ve yaygın olarak benimsenen tekniklerin sonuçları nasıl anlaşılır?
  • t-SNE ve PCA kullanarak ConvNet'in “kavram uzayını” görselleştirme
  • Şirketlerin daha iyi sonuçlar elde etmek için bilgisayarlı görme tekniklerini nasıl kullandıklarına dair vaka çalışmaları
  • Uygun model değerlendirmesi, gizli uzay görselleştirmesi ve modelin dikkatinin belirlenmesi
  • Alan araştırması yapmak, kendi veri kümelerinizi işlemek ve model testleri oluşturmak
  • Son teknoloji mimariler, fikirlerin ilerlemesi, onları benzersiz kılan nedir ve nasıl uygulanacağı
  • KerasCV – son teknoloji işlem hatları ve modeller oluşturmak için bir WIP kitaplığı
  • Makaleleri nasıl ayrıştırıp okuyabilir ve bunları kendiniz uygulayabilirsiniz
  • Uygulamanıza bağlı olarak model seçimi
  • Uçtan uca bir makine öğrenimi ardışık düzeni oluşturma
  • Daha Hızlı R-CNN'ler, RetinaNet'ler, SSD'ler ve YOLO ile nesne algılamada manzara ve sezgi
  • Örnek ve anlamsal segmentasyon
  • YOLOv5 ile Gerçek Zamanlı Nesne Tanıma
  • YOLOv5 Nesne Dedektörlerinin Eğitimi
  • KerasNLP (endüstri gücünde WIP kitaplığı) kullanarak Transformers ile çalışma
  • Görüntülerin altyazılarını oluşturmak için Transformers'ı ConvNets ile entegre etme
  • DeepDream
  • Bilgisayarla görme için Derin Öğrenme modeli optimizasyonu

Zaman Damgası:

Den fazla Yığın kötüye kullanımı