2013-11-21 4 views
2

У меня следующие изображения: https://drive.google.com/file/d/0B6NhNcM1nZznQXVUZ01qS0Q3YTA/edit?usp=sharing.OpenCV, делят объект на части

Есть ли функция в OpenCV (желательно Python), которая может сказать, что объекты на этом изображении можно разделить на части. Например, первый объект состоит из двух сегментов (или двух строк), третьего из трех (или четырех).

Если у OpenCV нет такой вещи, было бы здорово узнать о таком алгоритме/функции в любом месте.

+0

OpenCV Хаф Line Transform может быть помочь вам 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, строка 3737 dst = cv2.cvtColor (im, cv2.COLOR_BGR2GRAY) cv2.error: .. \ .. \ .. \ opencv-2.4.7 \ modules \ imgproc \ src \ color.cpp: 3737: ошибка: (-215) scn == 3 || scn == 4 Я попытался заменить cv2.COLOR_BGR2GRAY, но результат был тем же – bdshadow

+0

S0unds, как ваше изображение может быть уже одним каналом, попробуйте оставить 'cv2.cvtColor()', i.e установить 'dst = im' – Bull

Смежные вопросы