4

我有这张图片:

长方形

这是矩形的,但不完全是。我想找到矩形轮廓,我尝试使用边缘霍夫,但找不到连续线。我也尝试过侵蚀扩张,但它无法擦除水平最上面一行上一个像素的差异,因此它仍然找不到连续线。

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

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

我相信它不应该很复杂,但我做不到。

欢迎任何想法!干杯

4

3 回答 3

2

您可以使用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

结果:

带有矩形的图像

于 2013-03-06T19:29:05.527 回答
1

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

至于找到一条直线,我认为问题属于找到最小边界矩形的范畴。但是,如果术语straight意味着parallel to X-Y axis然后回答Junuxx应该有效。最小边界矩形紧贴图像,但不一定平行于 XY 轴。您可以在此处找到该算法的实现。要找到上图的最小边界矩形,首先使用removefrombwmorph然后将该点集作为最小边界矩形算法的输入。

于 2013-03-06T20:38:28.570 回答
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图像处理工具箱中的投影变换。

我希望这两件事能让你继续......

于 2013-03-06T17:03:37.533 回答