2016-04-12 15 views
4

Bir görüntüdeki çıkıntıları (lokal maksimumu) bulan ve bunları bir sırt dizisi olarak döndüren bir yöntem arıyorum (bir çıkıntının tanımlayan noktaların bir vektörü olduğu) Sırt). Diğer bir deyişle, bulucuların (konturları bulup konturları tanımlayan vektörler dizisi olarak döndüren) bulContours gibi davranan bir yöntemdir.OpenCV ile çıkıntıları izleyin - 'ridges' dönüş dizisi

Bu var mıdır, yoksa eğer bu etkiyi nasıl kazanırdım?

Distance transform of binary image of a road system

: yolların bir sistemin bir ikili görüntüden dönüşümü mesafeyi kullanarak,

I (biraz soluk üzgün) görüntüler var elde edilen (I OpenCV için Emgu CV sarmalayıcı kullanıyorum)

yol anahatlarını yol çizgilerini noktaların vektörleri olarak almak için orijinal ikili görüntüde findContours'u kolayca kullanabilirim. Ancak, yol merkez çizgisi ile ilgileniyorum. Yol orta çizgisi, yukarıdaki görüntünün yerel maksimum değeriyle temsil edilir.

Açıkçası, bu resimdeki findContours kullanmak bana yine yol anahatlarını veriyor. Ben her şeyi götürmek için non-maxima bastırma kullanmayı planlıyordum, ve bunun üzerinde findContours kullanın, ama ben de maxima suppression yapmak nasıl bilmiyorum, bu yüzden benim soru here

+0

'BulContours 'size ne istediğinizi vermiyor? Neyi denediğinize ve istediğiniz sonuçları vermeyi başaramadıklarına dair örnekleriniz var mı? – beaker

+0

Yorumunuz için teşekkürler - lütfen yeni düzenlemelere bakın. – mchristos

cevap

0

Her bir çizginin eğim yönü boyunca maksimum bastırma.

  1. Degrade yönünü hesaplayın.
  2. Her nokta için, yerel degrade yönündeki bir satırdaki maksimum değeri arayın. 2.1 Geçerli nokta şu görüntüyü alacak Sonunda sıfır
import cv2 
import numpy as np 
import math 
from matplotlib import pyplot as plt 

# Read image 
Irgb = cv2.imread('road.png') 
I = Irgb[:,:,0] 

# Find the gradient direction 
sobelx = cv2.Sobel(I,cv2.CV_64F,1,0,ksize=1) 
sobely = cv2.Sobel(I,cv2.CV_64F,0,1,ksize=1) 

gradDirection = np.zeros(I.shape, np.float64) 

for y in range(I.shape[0]): 
    for x in range(I.shape[1]): 
     gradDirection[y, x] = np.float64(math.atan2(sobely[y,x], sobelx[y,x])) 

# Iterate on all points and do max suppression 
points = np.nonzero(I) 
points = zip(points[0], points[1]) 
maxSuppresion = np.zeros_like(I) 
for point in points: 
    y = point[0] 
    x = point[1] 

    # Look at local line along the point in the grad direction 
    direction = gradDirection[y, x] 
    pointValues = [] 
    for l in range(-1,2): 
     yLine = int(np.round(y + l * math.sin(direction))) 
     xLine = int(np.round(x + l * math.cos(direction))) 

     if(yLine < 0 or yLine >= maxSuppresion.shape[0] or xLine < 0 or xLine >= maxSuppresion.shape[1]): 
      continue 

     pointValues.append(I[yLine,xLine]) 

    # Find maximum on line 
    maxVal = np.max(np.asarray(pointValues)) 

    # Check if the current point is the max val 
    if I[y,x] == maxVal: 
     maxSuppresion[y, x] = 1 
    else: 
     maxSuppresion[y, x] = 0 

# Remove small areas 
im2, contours, hierarchy = cv2.findContours(maxSuppresion,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE) 
minArea = 5 
maxSuppresionFilter = np.zeros_like(maxSuppresion) 
finalShapes = [] 
for contour in contours: 
    if contour.size > minArea: 
     finalShapes.append(contour) 

cv2.fillPoly(maxSuppresionFilter, finalShapes, 1) 
cv2.imshow('road',maxSuppresionFilter*255) 

gibi bir aksi işareti olarak maksimum işareti ise: enter image description here

Orada olduğunu görebilirsiniz Özellikle, yerel maksimum baskılamanın kesişme merkezinin yanındaki noktaları bastıran kesişme noktalarında hala sorunlar var. Bu problemlerin üstesinden gelmek için morfolojik işlemleri kullanmayı deneyebilirsiniz.