2016-11-21 69 views
0

enter image description here你能帮我分割这个图像中的矩形对象,试过otsu但它不工作,因为背景和forground具有相同的值。如何使用python在此图像中查找矩形形状?

有没有其他方法可以做到这一点。

有人可以告诉我如何在这些图像中找到矩形对象吗? 图像是canny边缘检测的结果。其实我想在视频中跟踪这些矩形,如果你知道怎么做,请告诉我。 或者至少我想找出一个矩形是否存在。 enter image description here

+0

大约是一个长方形被认为是一个矩形,或者你需要90度角和相同的长度,它实际上是一个矩形? – Elia

+0

我想要近似矩形,因为在视频帧中形状可能会略有变化,您可以在两幅图像中看到差异。 – user4973313

回答

0

您可以查看像素的行和列。例如,矩形的顶部边框行包含比上述行更多的黑色像素。所以我建议你使用垂直(通过行)和水平(通过列)来查找边界。这是我的脚本来做到这一点:

from PIL import Image 

FACTOR = 1.5 # a threashold 

img = Image.open("path/to/your/image") 
pix = img.load() 
size = img.size 

# vertical pass 
sum_color_arr = [] 
for row_num in xrange(size[1]): 
    sum_color = 0 # calculating of brightness for each row separately 
    for i in xrange(size[0]): 
     sum_color += pix[i, row_num] 
    sum_color_arr.append(sum_color) 

for row_num in xrange(size[1] - 1): 
    if sum_color_arr[row_num] > FACTOR * sum_color_arr[row_num + 1]: 
     print "Top border: y =", (row_num + 1) 
    if sum_color_arr[row_num + 1] > FACTOR * sum_color_arr[row_num]: 
     print "Bottom border: y =", row_num 

# horizontal pass 
sum_color_arr = [] 
for col_num in xrange(size[0]): 
    sum_color = 0 # calculating of brightness for each column separately 
    for i in xrange(size[1]): 
     sum_color += pix[col_num, i] 
    sum_color_arr.append(sum_color) 

for col_num in xrange(size[0] - 1): 
    if sum_color_arr[col_num] > FACTOR * sum_color_arr[col_num + 1]: 
     print "Left border: x =", (col_num + 1) 
    if sum_color_arr[col_num + 1] > FACTOR * sum_color_arr[col_num]: 
     print "Right border: x =", col_num 
+0

我正在尝试执行你的代码...在sum_color + = sum(pix [i,row_num])中得到这个错误 TypeError:'int'object is not iterable – user4973313

+0

我修复了一些代码。使用Python 2.7来运行。 – Fomalhaut

+0

只使用Python 2.7,我仍然得到相同的错误。已附加原始图像[输入图像说明] [1] 这是我的canny边缘检测代码..你可以检查你的代码。 帧= cv2.imread( '的ImagePath') framegray1 = cv2.cvtColor(帧,cv2.COLOR_BGR2GRAY) framegray = cv2.blur(framegray1,(3,3)) EDGE1 = feature.canny(framegray,标准差= 3) edge11 = ndimage.binary_closing(edge1) edge2 = np.uint8(edge11) edge2 [edge2 == 1] = 255#这是canny边缘图像 [1]:https://i.stack.imgur .com/O26np.jpgv – user4973313