2013-11-21 54 views
2

我有以下圖像:https://drive.google.com/file/d/0B6NhNcM1nZznQXVUZ01qS0Q3YTA/edit?usp=sharingOpenCV,將對象分成零件

在OpenCV(最好是Python)中是否有一個函數可以說這個圖片中的對象可以被分成幾部分。例如,第一個對象由兩個段(或兩行)組成,即三個(或四個)中的第三個。

如果OpenCV沒有這樣的東西,那麼在任何地方瞭解這樣的算法/函數都會很棒。

+0

OpenCV的霍夫變換線可能會幫助你http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html – Haris

回答

2

此問題可以通過鏤空圖像然後使用HoughlinesP來解決。 Scikit-image有很好的骨架化方法。 如下圖所示,直線尋找14條線段。 最後,您將需要經過並找出哪組線相交以查看哪些屬於一起。

result

#!/usr/bin/python 

from skimage import morphology 
import cv2 
import math 
import numpy as np 

im = cv2.imread("objects.png") 
dst = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) 

dst = 1 - dst/255 
dst = morphology.skeletonize(dst).astype(np.uint8) 

objs = 255 * dst 

#cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]]) 
rho = 1 
theta = math.pi/180 
threshold = 1 
minLineLength = 3 
maxLineGap = 5 

lines = np.ndarray([1, 1, 4, 4]) 
lines = cv2.HoughLinesP(dst, rho, theta, threshold, lines, minLineLength, maxLineGap) 

lineColor = (0, 255, 0) # red 

for line in lines[0]: 
     #print line 
     cv2.line(im, (line[0], line[1]), (line[2], line[3]), lineColor, 1, 8) 

# 
# Now you need to go through lines and find those that intersect 
# You will notice that some lines have small gaps where they should 
# join to a perpendicular line. Before find intersections you would 
# need to make each line longer (just by adjusting the numbers in lines) 
# to get around this problem. 
# 

cv2.imshow('Objects', objs) 
cv2.imshow('Lines', im) 
cv2.imwrite('lines.png', im) 

cv2.waitKey() 
cv2.destroyAllWindows() 
+0

我有執行該代碼有問題。我搜索了很多,但很少發現信息: 'code' OpenCV錯誤:斷言失敗(scn == 3 || scn == 4)在未知函數中,文件.. \ .. \ .. \ opencv -2.4.7 \ modules \ imgproc \ src \ color.cpp,line 3737 dst = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) cv2.error:.. \ .. \ .. \ opencv-2.4.7 \ modules \ imgproc \ src \ color.cpp:3737:error:(-215)scn == 3 || scn == 4 我試過替換cv2.COLOR_BGR2GRAY,但結果是一樣的 – bdshadow

+0

像你的圖像這樣的圖像可能已經是單通道了,試着省略'cv2.cvtColor()',即設置'dst = im' – Bull