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:
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!
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.
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:
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)
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)
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”.
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