2015-11-08 31 views
5

Python ile aşağıdaki görüntünün dış hatlarının koordinatları (x, y) ile bir matris elde etmem gerekiyor.Python ile görüntüdeki bir şeklin kontur (x, y) koordinatlarını alın

enter image description here

Ben opencv açıkgöz detektörlü denemek ve hatlarını bulmak ama hatlarına çok olsun ve ne istersem edinmeyle bilmiyorum.

enter image description here

import numpy as np 
from matplotlib import pyplot as plt 
import cv2 
#from skimage import measure, feature, io 
#from skimage import img_as_ubyte 

x1 = 330 
xf = 690 
y1 = 0 
yf = 400 

img = cv2.imread('test.tif') 
img = img[y1:yf, x1:xf] 
edge = cv2.Canny(img, 100, 200) 

image, contours, hierarchy = cv2.findContours(edge, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
Sadece (x, y) ile bir dizi mi çevritinin koordine eder. Bunun cv2.findContours() kontür çıktıda olduğunu düşünüyorum ama ben de matplotlib.pyplot.contour fonksiyonu ile çalıştı

istediğim kontur ... bulmuyorum:

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 

img = cv2.imread('test.tif', 0) # read image 
img = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)[1] # threshold image 
img = cv2.medianBlur(img, 15) # remove noise 

# skeletonize 
size = np.size(img) # get number of pixels 
skel = np.zeros(img.shape, np.uint8) # create an array of zeros with the same shape as the image and 256 gray levels 

element = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3)) # create a structurant element (cross) 
done = False 

while(not done): 
    eroded = cv2.erode(img, element) 
    temp = cv2.dilate(eroded, element) 
    temp = cv2.subtract(img, temp) 
    skel = cv2.bitwise_or(skel, temp) 
    img = eroded.copy() 
    zeros = size - cv2.countNonZero(img) 
    if zeros == size: 
     done = True 

cs = plt.contour(skel, 1) 
p = cs.collections[0].get_paths()[0] 
v = p.vertices 
x = v[:, 0] 
y = v[:, 1] 

enter image description here

Ama sadece var kapalı konturlar ve görüntünün solundan sağa giden açık konturu değil.

Cevabınız için çok teşekkürler.

+0

'Kontur' ile ne demek istiyorsun? Beklenen çıktınız nedir? Açık ol. – barny

+0

Yorumunuz için teşekkürler @barny. Kontur olarak, soldan sağa doğru giden ve yoğunluk gradyanının maksimum olduğu noktalardan geçen bir çizgi demek istiyorum. Ve bir matriste bu çizginin (x, y) koordinatlarına ihtiyacım var. – razoool

cevap

2

Sorunuzun cevabını neredeyse buldunuz. Her şeyden önce, kenar algılama ve kontur algılama arasında bir fark vardır. Temel olarak, kenar algılama, “açık kontur” (yani kenar) dediğiniz (kontur) ve kontur algılama, “kapalı çevre” (yani çevre çizgisi) dediğiniz şeyle sonuçlanır.

Canny kenar algılama, popüler bir kenar algılama algoritmasıdır. Kenarın, görüntünün solundan sağa doğru giden (x, y) koordinatlarına sahip bir dizi biçiminde algılanmasını istiyorsanız, Canny kenar algılama iyi bir fikirdir.

Yanıt, istenen biçiminde olmayan edge şeklindedir.

import numpy as np 
import matplotlib.pyplot as plt 
import cv2 

img = cv2.imread('test.tif') 
edge = cv2.Canny(img, 100, 200) 

ans = [] 
for y in range(0, edge.shape[0]): 
    for x in range(0, edge.shape[1]): 
     if edge[y, x] != 0: 
      ans = ans + [[x, y]] 
ans = np.array(ans) 

print(ans.shape) 
print(ans[0:10, :]) 

dizi ans ((n, 2) eşit şekli) tespit kenar oluşturan n piksel (x, y) -coordinate depolar. Aradığın sonuç bu. Bunun size yardımcı olacağını umuyoruz

enter image description here

: Burada

Beyaz bu n piksel çizilmiştir gelmiş bir görüntüdür.

+0

Bu detaylı açıklamalar için çok teşekkürler baptiste, tam olarak ne yok ki! – razoool

+0

Rica ederim! Mutlu kodlama. – Flabetvibes

İlgili konular