11 Haziran 2017 Pazar

OPENCV DERSLERİ (DERS:18) KONTUR PART-1



KONTUR NEDİR?

    Konturlar aynı renk ve yoğunluğa sahip olan tüm kesintisiz noktaları sınır boyunca birleştiren bir eğri olarak basitçe açıklanabilir.Konturlar şekil analizi,nesne algılama ve tanıma için çok yararlı bir araçtır.
  • Kontur bulunması istenirken daha doğru sonuç için binary(siyah-beyaz) formunda resim kullanılmalıdır.
  • FindContours yöntemiyle konturleri bulunan resim komple değişir orjinal halini bir daha kullanılamaz hale gelir. Bunun için resimi yazılımda yedeklemeniz gerekmektedir.
  • OpenCV'de kontur bulma işlemi siyah zeminde beyaz nesne bulmak gibidir.Unutulmamalıdır ki bulunması gereken nesne beyaz arka plan siyah olmalıdır.
    Binary bir görünütünün Konturlarının nasıl bulunacağına bir göz atmak gerekirse;
import numpy as np
import cv2

im = cv2.imread('test.jpg')
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

    Orjinal resim okunup önce gri skalaya çevirilmiş ve gri skalaya çevrilen resim binary formata getirilmiştir.
    cv2.findContours() işleminde konturlar bulunmuştur.Bu işleme kodda bakıldığı zaman 3 argümanın olduğu görülmüştür.Bunları sırasıyla açıklarsak;

     1.Birinci argüman kontur bulunacak kaynak görüntüdür.
     2.İkinci argüman kontur alma modudur. 
     3.Üçüncü argüman ise kontur yaklaşım metodur.

    Bu işlem sonucu görüntüyü konturu ve hiyerarşiyi ortaya çıkarır.
Koddaki "contours " değişkenine atanan bilgiler aslında görüntüdeki konturların pythondaki bir listesidir.Her kontur nesnenin sınır noktaları koordinatlarının(x,y) bir Numpy dizisidir.


KONTURLARI ÇİZMEK?

    Konturlar cv2.drawContours() fonksiyonu ile çizdirilir.Bu fonkisyonda ilk argüman kaynak görüntü,ikinci argüman görüntüdeki konturların python listesi,üçüncü argüman konturların indeksi ,dördüncü argüman çizimin rengi ve beşinci argüman çizimin kalınlığıdır.
  • Bir resimdeki bütün konturları çizdirmek için;
img = cv2.drawContours(img, contours, -1, (0,255,0), 3)

  • Tek bir kontur çizilmek istenirse örneğin 4. kontür;
cnt = contours[4]
img = cv2.drawContours(img, [cnt], 0, (0,255,0), 3)



Kontur Yaklaşma Yöntemi

    cv2.findContours ifadesindeki 3. argüman olan bu komut kontur yaklaşma yöntemi adıyla bilinir.
    Yukarıdaki yazılarda kontur tanımı olarak aynı yoğunluğa sahip şeklin sınırları olduğu bahsedilmiştir.Aslında kontur bir şeklin sınır koordinatlarını depo eder.Ancak bütün koordinatları depo ediyor mu sorusuna cevabı bu kontur modu cevap verir.                
    Eğer cv2.CHAIN_APPROX_NONE komutu kullanılsaydı bütün kontur bilgileri saklanacaktı. fakat her durumda bütün kontur bilgilerine ihtiyaç varmıdır ve nasıl kullanabilir.Bir örnekle açıklayalım düz bir çizgiden oluşan bir konturu çizdirmek istenirse bütün kontur bilgilerine ihtiyaç yoktur başlangıç ve bitiş noktalarının koordinatlarını bilmek çizdirmek için yeterlidir. Bu durumda ise cv2.CHAIN_APPROX_SIMPLE komutunu kullanmak yeterlidir. 
    Bir fotoğraf üzerinden ikisi arasındaki farkı açıklayalım;
  • Sol taraftaki resimdeki konturlar CHAIN_APPROX_NONE komutu ile bulunmuş ve çizdirilirken bütün konturlar çizdirilmi görüntü olarak daha güzel dursada verdiği bilgi bolluğu açısından kodda kafa karışıklığına neden olabilir
  • Sağ taraftaki resim ise CHAIN_APPROX_SIMPLE ile bulunmuştur.Nesnenin bulunması için yeterli bütün bilgiyi vermiştir.
    Bu dersi Bir örnekle noktalandıralım;
    Bu örnekte kareyi bulalım ve çizdirelim(SIMPLE metodu kullanılmıştır siz NONE ilede deneyebilirsiniz)
    Giriş resmi:
                                    
    Kod:
import numpy as np
import cv2

im = cv2.imread('kare.png')
cv2.imshow('Orjinal resim',im)
imgray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,1)
cv2.imshow('thresh',thresh)
img,contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
img = cv2.drawContours(im, contours,-1, (255,0,0), 4)
cv2.imshow('para',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
   Sonuç:
               

Ders:17⬅                                                            Ders:19

4 yorum:

  1. hocam merhaba görüntü isleme ve python da yeniyim de "ret,thresh = cv2.threshold(imgray,127,255,1)" bu kod tam olarak ne anlama geliyor acaba.
    Bu arada harikasınız...

    YanıtlaSil
  2. cv2.threshold fonksiyonu Gri skalada olan resmi binary dediğimiz ikili(siyah-beyaz) hale getirir cv2.threshold(imgray,127,255,1) Buradaki imgray=gri skaladaki resim
    255=Eşik değeri için skalalandırma aralığı
    127 ise eşik değeridir.
    1=ise THRESH_BINARY komutuna denk gelir invert etmeden ikili hale getirir

    YanıtlaSil
  3. https://mavienginberk.blogspot.com/2016/03/opencv-dersleri-ders10-image.html bu linkten bakabilirsiniz

    YanıtlaSil
  4. kod sadece thresh ve orjinal resim çıktılarını veriyor

    YanıtlaSil