Matlab:找到轮廓并拉直近似矩形的图像

时间:2013-03-06 15:14:29

标签: image matlab image-processing

我有这张图片:

rectangle

是矩形但不完全。我想找到矩形轮廓,我尝试使用 edge hough ,但它没有找到连续线。我还试图侵蚀扩张,但它不能消除水平最上面一行上一个像素的差异,例如它仍然没有找到连续线。

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

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

我相信它不应该变得复杂,但我无法做到。

欢迎任何想法! 干杯

3 个答案:

答案 0 :(得分: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 :(得分:1)

要查找轮廓,可以进行边缘检测,然后加粗线条。你可能不会只使用形态学操作获得直线,因为你的数字是这样的。形态学操作将对整个图像应用相同的效果。此外,边缘检测不会给出直线。

就找到一条直线而言,我认为问题属于寻找最小边界矩形的范畴。但是,如果术语straight表示parallel to X-Y axis,则Junuxx的答案应该有效。最小边界矩形紧密贴附在图像上,但不一定与X-Y轴平行。您可以找到该算法here的实现。要查找上面图像的最小边界矩形,首先使用remove中的bwmorph,然后将该点设置为最小边界矩形算法的输入。

答案 2 :(得分: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进行投影变换。

我希望这两件事能帮助你......