Görüntü işleme teknikleri ile görüntülerden şekilleri ayırt ederek bulunmasını istediğimiz şekilleri OpenCV ve Python ile kolayca tespit edebiliriz. Böylece tespit ettiğimiz bu şekilleri takip edebilen, yön levhalarını anlayabilen vs. robotlar üretebiliriz. Bu sayede günlük hayatta yardıma ihtiyacı olan insanlar için büyük kolaylıklar geliştirmiş oluruz.

Yapacağımız işlemler genel şekliyle sırasıyla şöyle olacaktır.

  • Görüntüyü yakalamak.
  • Gri görüntüye çevirmek.
  • Kontur tespit işlemini daha doğru yapmak için gürültüleri gidermeliyiz bu yüzden görüntüyü bulanıklaştırmak.
  • Kenarları kolayca algılayabilmek için görüntüyü Binary görüntüye çevirmek.

Öncelikle yenibir Python dosyası oluşturalım

import imutils
import cv2
 
image = cv2.imread("shapes.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

width = image.shape[0]
height = image.shape[1]

 

 
Orjinal görüntü Gri görüntü Bulanık görüntü

Görüntümüzü Binary(ikili) görüntüye çevirmek içn OTSU eşikleme kullanıyoruz.

thresh = cv2.threshold(blurred,35,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)[1]
cnts = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[1]

Eşikleme yapılmış görüntü

Artık elimizde şekiller var ancak bu şekiller henüz bilgisayar için anlamlı değiller. Bu şekilleri karakterize etmek ve her şeklin ne olduğunu tespit edebilmek için elimizdeki anlamsız şekilleri basit bir algoritma ile anlamlandırıyoruz :

for c in cnts:
	approx = cv2.approxPolyDP(c,0.01*cv2.arcLength(c,True),True)
	area = cv2.contourArea(c)
	cx,cy,cw,ch = cv2.boundingRect(c)

	if area < (width-1)*(height-1):
		sekil =""

		if len(approx) == 4:
			sekil ="Dikdortgen"
		else:
			sekil = "yuvarlak"
		
		cv2.putText(image, sekil, (cx + 20, cy + 20),
			cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 0), 2)

		cv2.drawContours(image,approx,-1,(0,0,0),2)

Artık bilgisayar gördüğü görüntülerdeki dikdörtgen şekillere "Dikdörtgen" diğerlerine ise "Yuvarlak" olarak nitelendirecektir. Pek tabii ki bu en temel anlatımıyla hazırlanmış bir algoritmadır. Daha fazla şekli algılayabilmek için algoritmanın geliştirilmesi gerekmektedir.

cv2.imshow("Image", image)
cv2.waitKey(0)

Son olarak sonuç görüntümüzü ekranda gösteriyoruz.


Şekiller tespit edilmiş sonuç görüntümüz.