Pyton ve OpenCV Kullanarak Kenar Algılama Uygulaması

0 83

Python ve OpenCV görüntü işleme kütüphanesini kullanarak bir imajdaki nesnelerin kenarlarını Haris yöntemi ile bulunmasını sağlayacağız.

Sİtemizde daha önce paylaştığımız OpenCV ve Pyton ile geliştirilmiş örneklere bakabilirsiniz. OpenCV ile yüz tanıma uygulaması nasıl yapılır yazımızı okuyabilirsiniz.

Python programlama dilini yeni öğrenmeye başladıysanız Sitemizden Pyhton Programlama Dili Dersleri listesine erişebilirsiniz.

OpenCV Haris Yöntemi İle Kenar Belirleme

OpenCV görüntü işleme kütüphanesinde kenar belirlemek amacıyla cv.cornerHarris ()  işlevi mevcuttur. Bu fonksiyonun argümanları şunlardır:

  • img – Giriş görüntüsü. Bu gri tonlama ve float32 tip olmalıdır.
  • blockSize – Kenar tespiti için düşünülen komşuluk büyüklüğünde
  • ksize – kullanılan sobel türevinin Açıklık parametresi.
  • k – Harris dedektörü denklemde serbest parametresi.

Şimdi Örnek uygulamamıza bakalım :

import numpy as np
import cv2 as cv
filename = 'chessboard.jpg'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
#İşaretlenmiş kenarları içeren sonuç bilgisi değişkeni, çok önemli değil
dst = cv.dilate(dst,None)
# Optimum sonuç için Threshold işlemi , bu imajın çok derinine işleyebilir.
img[dst>0.01*dst.max()]=[0,0,255]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
        cv.destroyAllWindows()

Yukarıdaki kodu çalıştırdığımızda satranç tahtası üzerinde işlemler yaparak köşeleri bize gösterecektir.

orjinal Resim
İşlenmiş ve Köşeleri belirlenmiş resim

SubPixel Doğruluklu Köşe Bazen, köşeleri maksimum doğrulukla bulmanız gerekebilir. OpenCV, alt piksel doğruluğu ile algılanan köşeleri daha da hassaslaştıran cv.cornerSubPix () işleviyle birlikte gelir. Aşağıda bir örnek verilmiştir.

Her zamanki gibi, önce Harris köşelerini bulmamız gerekiyor. Sonra bu köşelerin centroidlerini geçiyoruz (Bir köşede bir grup piksel olabilir, sentroidlerini alırız). Harris köşeleri kırmızı piksellerle, rafine köşeler yeşil piksellerle işaretlenmiştir.

Bu işlev için, yinelemenin ne zaman durdurulacağını ölçmek zorundayız. Hangisi önce olursa olsun, belirli sayıda yineleme veya belirli bir doğruluk elde edildikten sonra durdururuz. Köşeleri aradığı mahallenin boyutunu da tanımlamamız gerekiyor.

import numpy as np
import cv2 as cv
filename = 'solids-153261_1280.png'
img = cv.imread(filename)
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# find Harris corners
gray = np.float32(gray)
dst = cv.cornerHarris(gray,2,3,0.04)
dst = cv.dilate(dst,None)
ret, dst = cv.threshold(dst,0.01*dst.max(),255,0)
dst = np.uint8(dst)
# find centroids
ret, labels, stats, centroids = cv.connectedComponentsWithStats(dst)
# define the criteria to stop and refine the corners
criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.001)
corners = cv.cornerSubPix(gray,np.float32(centroids),(5,5),(-1,-1),criteria)
# Now draw them
res = np.hstack((centroids,corners))
res = np.int0(res)
img[res[:,1],res[:,0]]=[0,0,255]
img[res[:,3],res[:,2]] = [0,255,0]
cv.imshow('dst',img)
if cv.waitKey(0) & 0xff == 27:
   cv.destroyAllWindows()

Yukarıdaki örneği çalıştırdığınız da alttaki gibi bir sonuç elde edersiniz.

Sonuç olarak yukarıda gördğünüz resimdeki gibi bir sonuç elde edeceksiniz. Bu işlem yazı tanıma, el yazısı tanımlama, plaka okuma, nesne tanıma gibi birçok uygulamada kullanılabilir.

Not: Yukarıdaki kodların çalışması için resimlerin kodla aynı dizinde olması ve Opencv kütüphanesinin yüklü olması gerekir.

Sorularınızı yorumlar kısmında bizlerle paylaşabilirsiniz.

Cevap bırakın

E-posta hesabınız yayımlanmayacak.

Bu web sitesi deneyiminizi geliştirmek için çerezleri kullanır. Bununla iyi olduğunuzu varsayacağız, ancak isterseniz vazgeçebilirsiniz. Kabul etmek Mesajları Oku