我有这张图片:
是矩形但不完全。我想找到矩形轮廓,我尝试使用 edge 和 hough ,但它没有找到连续线。我还试图侵蚀和扩张,但它不能消除水平最上面一行上一个像素的差异,例如它仍然没有找到连续线。
问题的第二部分是纠正它。
我得到的另一个想法是找到角落用直线连接它们但它也不起作用。
我相信它不应该变得复杂,但我无法做到。
欢迎任何想法! 干杯
答案 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
结果:
答案 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
进行投影变换。
我希望这两件事能帮助你......