Görüntü işlemede sıkça gerekli olan bilgilerden birisi de görüntüdeki tespit edilebilen şekillerin orta noktalarıdır. Bir çok uygulamada işimizi kolaylaştırabilir ve pratik bir şekilde bizi çözüme götürebilir. 

Kod kısmına geçmeden önce 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

örn : ortaNokta.py

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

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

"import" komutlarıyla gerekli kütüphanelerimizi projemize ekledik. Eğer kütüphane sistemimizde yok ise Python yorumlayıcısı çalışma zamanında bizi uyaracaktır. Eğer kütüphaneler eksik ise PIP yardımıyla yüklemelisiniz.

  1. Görüntümüzü "image" isimli bir değişkene aldık. 
  2. Gri görüntüye çevirdik.
  3. Bulanıklaştırdık
  4. Son olarak Binary görüntüye çevirdik.

 

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

Sonraki adım;

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ü
 

Burdaki komutlar ile siyah-beyaz görüntüden figürlerin sınırlarını belli eden çizgileri (Konturler) elde ettik. Böylece tespit edilmiş şekillerden oluşan bir veri kümemiz oldu. Bu veri kümesinin her birini tek tek incelemek ve orta noktalarını bulmak için;

for c in cnts:
	M = cv2.moments(c)
	area = cv2.contourArea(c)
	print(area, width*height)
	if area < (width-1)*(height-1):
		cX = int(M["m10"] / M["m00"])
		cY = int(M["m01"] / M["m00"])
	 
		cv2.drawContours(image, [c], -1, (0, 255, 0), 2)
		cv2.circle(image, (cX, cY), 7, (255, 255, 255), -1)
		cv2.putText(image, "Center", (cX - 20, cY - 20),
			cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2)

Döngü içerisinde her bir şeklin orta noktasını hesaplayan küçük bir algoritma yazdık.

Not : Görüntü işlemede "moments" genellikle şekilleri karakterize etmek amacıyla kullanılırlar. "moments"lar şeklin alanını, orta noktalarını vb. bilgilerini barındırırlar.

Yukardaki komutlardan da görüleceği üzere "cv2.moments()" komutunu kullandık ve böylece şekilleri karakterize edip gereken bilgileri elde ettik. 

Her şeklin kenar çizgilerini  "cv2.drawContours()" ile çizdik ve orta noktayı da benzer şekilde "cv2.circle()" komutuyla gerekli yerlerde çizilmesini sağladık.

Böylece artık her şeklin orta noktası ve sınır çizgileri çizilmiş görüntü elde etmiş olduk.

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

Son olarak görüntümüzü ekranda gösterdik.


Görüntünün son hali