2013-03-06 55 views
3

我有这样的形象:Matlab的:找到轮廓和理顺几乎矩形图像

rectangle

是长方形状,但不完全是。我想找到矩形轮廓,我试图使用边缘霍夫但它没有找到连续的线。我也尝试过侵蚀扩张但它不能抹去水平最上一行上的一个像素的差异,例如它仍然没有找到连续的线。

问题的第二部分是纠正它。

我得到的另一个想法是找到角落用直线链接它们,但它也不起作用。

我相信它不应该是复杂的,但我不能做到。

任何想法都会受到欢迎! 干杯

+0

使用霍夫变换的结果是什么,为什么没有工作?相同的角落检测。 – Junuxx 2013-03-06 15:18:37

+0

如果你只是想旋转它,你可以使用[imrotate](http://www.mathworks.com/help/images/ref/imrotate.html)。对于你的情况,你可以旋转1度,然后检查其中一个维度的总和。如果某些连续的列有[120,122,124]个白色像素,则必须旋转更多。当你得到'[122,122,122]',你的工作就完成了。 – 2013-03-06 16:08:10

+0

所以,@ user1270155,你解决了这个问题吗? – Junuxx 2013-03-20 15:03:07

回答

0

假设您知道“黑色”和“白色”的值,您可以通过在中点处绘制轮廓来找到边缘 - 所以如果黑色= 0且白色= 1,则在0.5处绘制轮廓。你可以用下面的比如做:

img = zeros(500, 500); 
img(200:300, 200:300) = 1; 
img(210:290, 210:290) = 0; 
img = imrotate(img, 3); 
c = contourc(img, 0.5*[1 1]); % repeat 0.5 to be interpreted as value of contour 

轮廓的坐标现在是在C。您也可以绘制与

contour(img, 0.5*[1 1]); 

当你看c,你可以找出其中的边角轮廓;一旦你知道了,你可以使用imtransform进行投影变换,这是在图像处理工具箱中。

我希望这两件事情将让你去...

+0

谢谢你的帮助。它确实有帮助,尽管以这种方式计算c会给出更高的结果(一些x坐标为0.5)。但imtransform有很大的帮助。 – user1270155 2013-03-11 14:23:01

+0

异常值几乎就像轮廓的“起点”。就好像你正在使用Etch-a-Sketch,而你的“笔”是从错误的地方开始的。我已经看到了它们 - 它们很容易找到(例如,如果使用'abs(diff())',它们将对应于非常大的数字)。很高兴'imtransform'帮助。 – Floris 2013-03-11 14:55:57

1

您可以使用regionprops()找到毗邻地区的边框二进制图像:

img = imread('rect.jpg'); 
bw = im2bw(img); 

% find both black and white regions 
stats = [regionprops(bw); regionprops(not(bw))] 

% show the image and draw the detected rectangles on it 
imshow(bw); 
hold on; 

for i = 1:numel(stats) 
    rectangle('Position', stats(i).BoundingBox, ... 
    'Linewidth', 3, 'EdgeColor', 'r', 'LineStyle', '--'); 
end 

结果:

image with rects drawn on it

1

要找到轮廓,您可以执行边缘检测,然后加粗线条。因为你的形象就是这样,你可能不会只通过形态学得到一条直线。形态学操作将对整个图像应用相同的效果。另外,边缘检测不会给出直线。

只要找到一条直线,我认为问题属于寻找最小边界矩形的范畴。但是,如果术语straight意味着parallel to X-Y axis那么应该通过Junuxx应该工作。最小边界矩形紧密贴合图像,但不一定平行于X-Y轴。您可以找到该算法的实现here。要找到上面图像的最小边界矩形,首先使用bwmorph中的remove,然后将该点集作为最小边界矩形算法的输入。