Watershed with Custom Seeds

Kategori: Computer Vision , 04 Şubat 2020 , JanFranco


Bir önceki yazımızda Watershed algoritması ile paraları tespit etmiştik. Ancak paraları Watershed algoritmasına vermeden önce tespit etmiştik. Bu yazımızda ise tespit etme işini manuel olarak yapacağız. Bir renk seçip mouse ile tıkladığımızda segment halini göreceğiz. Kütüphaneleri ve resmi alalım:


import cv2
import numpy as np
from matplotlib import cm

img = cv2.imread('../data/road_image.jpg')
copyImg = img.copy()
cv2.imshow('road img', img)
cv2.waitKey(0)
cv2.destroyWindow('road img')
>>

Watershed

10 farklı renk üreteceğiz. Bunun için matplotlib kütüphanesinin renklerini kullanalım:


def create_rgb(j):
    x = np.array(cm.tab10(j))[:3]*255
    return tuple(x)


colors = []
for i in range(10):
    colors.append(create_rgb(i))
Objeleri manuel olarak tespit edeceğimiz için marker_image isimli bir matris oluşturalım. Ayrıca segmentleri görüntülemek için de bir matris oluşturalım:


marker_image = np.zeros(img.shape[:2], dtype=np.int32)
segments = np.zeros(img.shape, dtype=np.uint8)
Değişkenlerimizi belirleyelim. n_markers 10 adet renk olduğundan, current_marker ise şuan bulunduğumuz rengi temsil ediyor. marks_updated ise tıklamalarımızı tespit etmek için:


n_markers = 10
current_marker = 1
marks_updated = False
mouse_callback fonksiyonunu oluşturalım. Önceki yazılarımızda görmüştük:


def mouse_callback(event, x, y, _, __):
    global marks_updated

    if event == cv2.EVENT_LBUTTONDOWN:
        cv2.circle(marker_image, (x, y), 10, current_marker, -1)
        cv2.circle(copyImg, (x, y), 10, colors[current_marker], -1)
        marks_updated = True


cv2.namedWindow('Road Image')
cv2.setMouseCallback('Road Image', mouse_callback)
Burada orjinal resme tıklandığında marker_image matrisinde yani resminde ve orjinal resim üzerinde yuvarlaklar çizeceğiz. Son kısma geçelim. While döngüsü ile uygulamamızı çalıştıralım ve watershed algoritmasını uygulayalım:


while True:
    cv2.imshow('WaterShed Segments', segments)
    cv2.imshow('Road Image', copyImg)

    k = cv2.waitKey(1)

    if k == 27:
        break

    elif k == ord('c'):
        road_copy = img.copy()
        marker_image = np.zeros(img.shape[0:2], dtype=np.int32)
        segments = np.zeros(img.shape, dtype=np.uint8)

    elif k > 0 and chr(k).isdigit():
        current_marker = int(chr(k))

    if marks_updated:
        marker_image_copy = marker_image.copy()
        cv2.watershed(img, marker_image_copy)
        segments = np.zeros(img.shape, dtype=np.uint8)

        for color_ind in range(n_markers):
            segments[marker_image_copy == color_ind] = colors[color_ind]

        marks_updated = False

cv2.destroyAllWindows()
Döngüde ilk olarak iki resmi görüyoruz. Eğer uygulamada Esc tuşuna basılırsa (27) uygulama sonlanacak. Eğer c tuşuna basarsak marker_image matrisi temizlenecek, segmentler temizlenecek. Eğer 1-10 arası bir tuşa basarsak renk değiştireceğiz. Eğer marks_updated değişkeni True ise (resme tıkladığımızda True oluyor), marker_image resmindeki matrisindeki yuvarlakları watershed algoritmasına veriyoruz ve segmentler çıkıyor. Renkler için de bir for döngüsü açıyoruz, hangi renk ile tıklamışsak segmenti de ı renge boyuyoruz ve marks_updated değişkenini False hale getiriyoruz. Sonuçları görelim:

Watershed

Watershed


Sonraki Yazı: Gaussian Blur
Yorumlar

Henüz bir yorum bulunmuyor.