1

我有一个 RGB 图像。我已经扫描了图像。因此,图像只占 A4 尺寸纸张的一小部分。

我想找到图像的边框并裁剪它。我可以使用“Sobel”等边缘检测算子,但它们会检测图像中存在的所有边缘。我想要的只是图像的边框。此外,包括“bwboundaries”在内的许多边缘检测功能仅适用于二进制或灰度图像。我的图像是RGB。

我尝试使用“imcrop”,但这更像是交互式裁剪。我热衷于自动执行此操作。

上传测试图像:

4

3 回答 3

5

由于这是一张 rgb 图像,灰色区域会有明显的颜色,但白色区域应该没有。您可以利用它来查找图像,然后您可以获得边界框。

img = imread('http://i.stack.imgur.com/dEawA.jpg');
%# instead of "==" you can check for similarity within a tolerance
tt=img(:,:,1)==img(:,:,2) & img(:,:,2) == img(:,:,3);

在此处输入图像描述

%# invert tt so that it's 1 where there is signal
tt = ~tt;

%# clean up some of the smaller artifacts
tto = imopen(~tt,strel('square',100));

在此处输入图像描述

%# get the areas and bounding box of the areas above threshold
%# as an additional criterion, you could also use excentricity
%# or you could simply remove the bottom 100 rows of the scan
stats = regionprops(tto,'BoundingBox','Area');
area = cat(1,stats.Area);
[~,maxAreaIdx] = max(Area);
bb = round(stats(maxAreaIdx).BoundingBox);

%# note that regionprops switches x and y (it's a long story)
croppedImage = img(bb(2):bb(2)+bb(4),bb(1):bb(1)+bb(3),:);

在此处输入图像描述

由于旋转,会留下一点边界。您可以使用上面的蒙版tto在裁剪之前将所有非图像像素设置为 NaN,或者您可以使用它imrotate来修复图像。

于 2012-06-20T16:23:36.973 回答
0

您可以尝试使用 Harris-Detector(corner在 Matlab 中)检测图像的角落。将要检测的最大角点数设置为 4。然后使用 中的角点位置imcrop。如果您发布图片,我可以给您更具体的提示。您的图像是 RGB 应该不是问题,只需将其转换为灰度即可。

于 2012-06-20T14:38:15.770 回答
0

您可以尝试使用bwlabel http://www.mathworks.com/help/toolbox/images/ref/bwlabel.html(连同查找,如帮助页面中所述)来获取图像的索引并使用它们来裁剪原来的。

您首先需要使用im2bw http://www.mathworks.com/help/toolbox/images/ref/im2bw.html将原始图像转换为二进制。

于 2012-06-20T15:59:32.450 回答