cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

cv2.Canny() ile Python'da OpenCV Kenar Algılama

Giriş

Kenar algılama, doğal olarak yaptığımız bir şeydir, ancak bilgisayarlar için kuralları tanımlamaya gelince o kadar kolay değildir. Çeşitli yöntemler tasarlanırken, hüküm süren yöntem 1986'da John F. Canny tarafından geliştirildi ve uygun bir şekilde Canny yöntemi olarak adlandırıldı.

Hızlıdır, oldukça sağlamdır ve olduğu teknik türü için çalışabileceği en iyi şekilde çalışır. Kılavuzun sonunda, videolarda gerçek zamanlı uç algılamayı nasıl gerçekleştireceğinizi öğrenecek ve aşağıdakiler doğrultusunda bir şeyler üreteceksiniz:

Canny Edge Algılama

Canny yöntemi nedir? Dört farklı işlemden oluşur:

  • Gauss yumuşatma
  • Hesaplama gradyanları
  • Maksimum Olmayan Bastırma
  • Histerezis Eşikleme

Gauss yumuşatma giriş görüntüsünü "düzeltmek" ve gürültüyü yumuşatmak için ilk adım olarak kullanılır ve nihai çıktıyı çok daha temiz hale getirir.

Görüntü gradyanları kenar algılama için daha önceki uygulamalarda kullanılıyordu. En önemlisi, Sobel ve Scharr filtreleri görüntü gradyanlarına dayanır. Sobel filtresi iki çekirdeğe kadar kaynar (Gx ve Gy), nerede Gx yatay değişiklikleri algılarken, Gy dikey değişiklikleri algılar:

G

x

=

[

-
1

0

+
1

-
2

0

+
2

-
1

0

+
1

]

G

y

=

[

-
1

-
2

-
1

0

0

0

+
1

+
2

+
1

]

Onları bir görüntünün üzerine kaydırdığınızda, her biri kendi yönlerinde çizgileri “alır” (vurgular). Scharr çekirdekleri, farklı değerlerle aynı şekilde çalışır:

G

x

=

[

+
3

0

-
3

+
10

0

-
10

+
3

0

-
3

]

G

y

=

[

+
3

+
10

+
3

0

0

0

-
3

-
10

-
3

]

Bu filtreler, bir kez görüntünün üzerine konulduğunda, özellik haritaları üretecektir:

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Resim kredisi: Davidwkennedy

Bu özellik haritaları için, gradyan büyüklüğü ve degrade yönü – yani değişimin ne kadar yoğun olduğu (bir şeyin kenar olma olasılığı) ve değişimin hangi yönü işaret ettiği. Gy dikey değişimi (Y-gradyan) ve Gx yatay değişimi (X-gradyan) temsil ettiğinden, “sol” tarafından oluşturulan üçgenin hipotenüsünü elde etmek için sadece Pisagor teoremini uygulayarak büyüklüğü hesaplayabilirsiniz ve “doğru” yönler:

$$
{G} ={kare {{{G} _{x}}^{2}+{{G} _{y}}^{2}}}
$$

Büyüklüğü ve yönü kullanarak, kenarları vurgulanmış bir görüntü oluşturabilirsiniz:

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Resim kredisi: Davidwkennedy

Ancak – tuğlaların yapısından da ne kadar gürültü yakalandığını görebilirsiniz! Görüntü gradyanları gürültüye karşı çok hassastır. Bu nedenle Sobel ve Scharr filtreleri bileşen olarak kullanıldı, ancak Canny'nin yöntemindeki tek yaklaşım değildi. Gauss yumuşatma burada da yardımcı olur.

Maksimum Olmayan Bastırma

Sobel filtresiyle ilgili göze çarpan bir sorun, kenarların gerçekten net olmamasıdır. Bu, birinin bir kalem alıp görüntünün bir çizgisini oluşturmak için bir çizgi çizmesi gibi değil. Işık yavaş yavaş dağıldığı için, görüntülerde kenarlar genellikle o kadar net kesilmez. Bununla birlikte, kenarlardaki ortak çizgiyi bulabilir ve etrafındaki piksellerin geri kalanını bastırarak bunun yerine temiz, ince bir ayrım çizgisi elde edebiliriz. Bu, Maksimum Olmayan Bastırma olarak bilinir! Maksimum olmayan pikseller (3×3 çekirdek gibi küçük bir yerel alanda karşılaştırdığımızdan daha küçük olanlar) bastırılır. Konsept bundan daha fazla göreve uygulanabilir, ancak şimdilik onu bu bağlama bağlayalım.

Histerezis Eşikleme

Birçok kenar olmayan, aydınlatma koşulları, görüntüdeki malzemeler vb. nedeniyle kenar olarak değerlendirilebilir ve muhtemelen de değerlendirilecektir. Bu yanlış hesaplamaların meydana gelmesinin çeşitli nedenleri nedeniyle – bir kenarın kesinlikle ne olduğu ve ne olmadığına dair otomatik bir değerlendirme yapmak zordur. 't. "Gerçek" kenarların "sahte" kenarlardan daha yoğun olduğunu varsayarak, gradyanları eşikleyebilir ve yalnızca daha güçlü olanları dahil edebilirsiniz.

Eşikleme her zamanki gibi çalışır - gradyan daha düşük bir eşiğin altındaysa kaldırın (sıfırlayın) ve belirli bir üst eşiğin üzerindeyse koruyun. Alt sınır ile üst sınır arasındaki her şey “gri bölge” içindedir. Eşikler arasındaki herhangi bir kenar bir kesin kenar (eşiğin üzerinde olanlar) – ayrıca kenar olarak kabul edilirler. Bağlantılı değillerse, muhtemelen yanlış hesaplanmış bir ucun ürünüdürler.

Bu histerezis eşiğidir! Aslında, yanlış kenar olarak sınıflandırdığınız şeye bağlı olarak nihai çıktının temizlenmesine ve yanlış kenarların kaldırılmasına yardımcı olur. İyi eşik değerleri bulmak için genellikle eşikler için farklı alt ve üst sınırlar deneyecek veya Otsu'nun yöntemi veya Üçgen yöntemi gibi otomatik bir yöntem kullanacaksınız.

Bir görüntü yükleyelim ve gri tonlamalı hale getirelim (Canny, tıpkı Sobel/Scharr'ın görüntülerin gri tonlamalı olmasını gerektirmesi gibi):

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg', cv2.IMREAD_GRAYSCALE)
img_blur = cv2.GaussianBlur(img, (3,3), 0)

plt.imshow(img_blur, cmap='gray')

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Bir parmağın yakından çekilmiş görüntüsü, kenar tespiti için iyi bir test alanı görevi görür - görüntüden parmak izini ayırt etmek kolay değildir, ancak yaklaşık olarak tahmin edebiliriz.

cv2.Canny() ile Görüntülerde Kenar Tespiti

Canny'nin algoritması OpenCV'ler kullanılarak uygulanabilir. Canny() yöntem:

cv2.Canny(input_img, lower_bound, upper_bound)

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!

Alt sınır ile üst sınır arasında doğru dengeyi bulmak zor olabilir. Her ikisi de düşükse, birkaç kenarınız olur. Alt sınır düşük ve üst sınır yüksekse, gürültü elde edersiniz. Her ikisi de yüksek ve birbirine yakınsa, birkaç kenarınız olur. Doğru nokta, sınırlar arasında yeterli boşluğa sahiptir ve bunları doğru ölçekte tutar. Deney!

Giriş görüntüsü Canny yöntemiyle bulanıklaştırılır, ancak çoğu zaman bulanıklaştırmanın size faydası olur. önce o da giriyor Yöntem, işlemlerin geri kalanından geçmeden önce girdiye 5×5 Gauss bulanıklığı uygular, ancak bu bulanıklıkta bile, bir miktar gürültü yine de sızabilir, bu nedenle görüntüyü algoritmaya beslemeden önce bulanıklaştırdık:


edge = cv2.Canny(img_blur, 20, 30)

fig, ax = plt.subplots(1, 2, figsize=(18, 6), dpi=150)
ax[0].imshow(img, cmap='gray')
ax[1].imshow(edge, cmap='gray')

Bunun sonucu:

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Değerleri 20 ve 30 burada keyfi değil – Yöntemi çeşitli parametreler üzerinde test ettim ve düzgün bir sonuç veriyor gibi görünen bir dizi seçtim. Bunu otomatikleştirmeyi deneyebilir miyiz?

cv2.Canny() için Otomatik Eşikleme?

En uygun eşik değerleri kümesini bulabilir misiniz? Evet, ama her zaman işe yaramaz. İyi bir değer için kendi hesaplamanızı yapabilir ve ardından aralığı bir sigma bu eşiğin etrafında:

lower_bound = (1-sigma)*threshold
upper_bound = (1+sigma)*threshold

Ne zaman sigma, demek, 0.33 – sınırlar olacak 0.66*threshold ve 1.33*threshold, etrafında ~1/3 aralığına izin verir. rağmen, bulmak threshold daha zor olan şey. OpenCV bize Otsu'nun yöntemini (iki modlu görüntüler için harika çalışıyor) ve Üçgen yöntemini sağlar. Üçüncü seçenek olarak piksel değerlerinin basit bir medyanını alarak ikisini de deneyelim:

otsu_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_OTSU)
triangle_thresh, _ = cv2.threshold(img_blur, 0, 255, cv2.THRESH_TRIANGLE)
manual_thresh = np.median(img_blur)

def get_range(threshold, sigma=0.33):
    return (1-sigma) * threshold, (1+sigma) * threshold

otsu_thresh = get_range(otsu_thresh)
triangle_thresh = get_range(triangle_thresh)
manual_thresh = get_range(manual_thresh)

print(f"Otsu's Threshold: {otsu_thresh} nTriangle Threshold: {triangle_thresh} nManual Threshold: {manual_thresh}")

Bunun sonucu:

Otsu's Threshold: (70.35, 139.65) 
Triangle Threshold: (17.419999999999998, 34.58) 
Manual Threshold: (105.18999999999998, 208.81)

Bunlar oldukça farklı! Daha önce gördüğümüz değerlerden, burada en iyi Üçgen yönteminin çalıştığını tahmin edebiliriz. Manuel eşik, yalnızca medyan piksel değerini aldığından ve bu görüntü için geniş bir aralığa daha da çarpan yüksek bir temel eşiğe sahip olduğundan, çok bilgili değildir. Otsu'nun yöntemi bundan daha az zarar görür, ancak yine de zarar görür.

Eğer çalıştırırsak Canny() bu eşik aralıklarına sahip yöntem:

edge_otsu = cv2.Canny(img_blur, *otsu_thresh)
edge_triangle = cv2.Canny(img_blur, *triangle_thresh)
edge_manual = cv2.Canny(img_blur, *manual_thresh)

fig, ax = plt.subplots(1, 3, figsize=(18, 6), dpi=150)
ax[0].imshow(edge_otsu, cmap='gray')
ax[1].imshow(edge_triangle, cmap='gray')
ax[2].imshow(edge_manual, cmap='gray')

Not: İşlev, birden çok bağımsız değişken bekler ve eşiklerimiz tek bir demettir. Yapabiliriz yıkmak tuple'ı önekleyerek birden çok bağımsız değişkene dönüştürün *. Bu, listeler ve kümeler üzerinde de çalışır ve programlı yollarla elde ettikten sonra birden çok argüman sağlamanın harika bir yoludur.

Bunun sonucu:

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Üçgen yöntemi burada oldukça iyi çalıştı! Bu, diğer durumlarda da iyi çalışacağının garantisi değildir.

cv2.Canny() ile Videolarda Gerçek Zamanlı Kenar Tespiti

Son olarak, Canny uç algılamayı bir videoya gerçek zamanlı olarak uygulayalım! İşlenmekte olan videoyu (her kare yapıldığı gibi) şunu kullanarak göstereceğiz: cv2.imshow() görüntülemek istediğimiz çerçeveyi içeren bir pencere görüntüler. Yine de, videoyu daha sonra incelenip paylaşılabilecek bir MP4 dosyasına da kaydedeceğiz.

OpenCV kullanarak bir video yüklemek için VideoCapture() yöntem. eğer geçersek 0 – mevcut web kamerasından kayıt yapacaktır, böylece kodu web kameranızda da çalıştırabilirsiniz! Bir dosya adı iletirseniz, dosyayı yükler:

def edge_detection_video(filename):
    cap = cv2.VideoCapture(filename)
    
    fourcc = cv2.VideoWriter_fourcc(*'MP4V')
    out = cv2.VideoWriter('output.mp4', fourcc, 30.0, (int(cap.get(3)), int(cap.get(4))), isColor=False)
    
    while cap.isOpened():
        (ret, frame) = cap.read()
        if ret == True:
            frame = cv2.GaussianBlur(frame, (3, 3), 0)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
            edge = cv2.Canny(frame, 50, 100)
            out.write(edge)
            cv2.imshow('Edge detection', edge)
        else:
            break

        if cv2.waitKey(10) & 0xFF == ord('q'):
            break

    cap.release()
    out.release()
    cv2.destroyAllWindows()

edge_detection_video('secret_video.mp4')

The VideoWriter çıktı dosya adı, FourCC (videoyu kodlamak için kullanılan codec bileşenini gösteren dört codec kodu), kare hızı ve bir demet olarak çözünürlük gibi birkaç parametreyi kabul eder. Videoyu tahmin etmemek veya yeniden boyutlandırmamak için - orijinal videonun genişliğini ve yüksekliğini kullandık. VideoCapture genişlik, yükseklik, toplam kare sayısı vb. gibi videonun kendisiyle ilgili verileri içeren örnek.

Yakalama açılırken bir sonraki kareyi ile okumaya çalışıyoruz. cap.read(), bir sonuç kodu ve sonraki kareyi döndürür. sonuç kodu True or False, bir sonraki çerçevenin varlığını veya eksikliğini gösterir. Sadece bir çerçeve olduğunda onu daha fazla işlemeye çalışırız, aksi takdirde döngüyü kırarız. Her geçerli çerçeve için, onu bir gauss bulanıklığından geçiriyoruz, gri tonlamaya dönüştürüyoruz, çalıştırıyoruz. cv2.Canny() üzerine yazın ve şunu kullanarak yazın: VideoWriter diske ve kullanarak görüntüleme cv2.imshow() canlı görüntü için.

Son olarak, her ikisi de diskteki dosyalarla çalıştığından ve mevcut tüm pencereleri yok ettiğinden, yakalama ve video yazıcıyı serbest bırakıyoruz.

Yöntemi bir ile çalıştırdığınızda secret_video.mp4 girdi – bir pencerenin açıldığını ve bittiğinde, çalışma dizininizde bir dosya göreceksiniz:

cv2.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. Dikey Arama. Ai.

Sonuç

Bu kılavuzda, Canny kenar algılamanın nasıl çalıştığına ve onu oluşturan parçalara - gauss yumuşatma, Sobel filtreleri ve görüntü gradyanları, Maks Olmayan Bastırma ve Histerezis Eşikleme - bir göz attık. Son olarak, Canny kenar tespiti için otomatik eşik aralığı araması için yöntemleri araştırdık. cv2.Canny()ve tekniği bir video üzerinde kullanarak gerçek zamanlı uç algılama sağladı ve sonuçları bir video dosyasına kaydetti.

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.Canny() PlatoBlockchain Veri Zekası ile Python'da OpenCV Kenar Tespiti. 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ı