如何在MATLAB中识别和裁剪图像内的矩形

时间:2017-08-18 06:55:42

标签: image matlab image-processing

我的图像中有一个矩形。矩形可以是任何设计,但背景不是单一颜色。这张照片是从像这样的手机相机拍摄的。 Test image 我想在图像中裁剪到内部图片(风景)。

  

我怎样才能在MATLAB中做到这一点?

我试过这段代码

img = im2double(imread('https://i.stack.imgur.com/iS2Ht.jpg'));
BW = im2bw(img);
dim = size(BW)
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
boundary = bwtraceboundary(BW,[row, col],'N');
r = [min(boundary) , max(boundary)];
img_cropped = img(r(1) : r(3) , r(2) : r(4) , :);
imshow(img_cropped);

但它只适用于一个图像,这个 enter image description here

而不是上面的那个或者这个

enter image description here

  

我需要找到一个适用于任何具有特定矩形设计的图像的代码。任何帮助都会受到重视。谢谢

1 个答案:

答案 0 :(得分:1)

以下处理考虑以下内容:

  • 背景资料是单色的,可以使用渐变
  • 边框是单色(渐变),很容易与背景区分,而不是barocco / rococco风格
  • 图片是一种包含大量细节的真实世界图片,而不是Malevich's Black Square

所以我们首先搜索图片并通过熵过滤展平背景

img=imread('http://i.stack.imgur.com/KMBRg.jpg');
%dimensions for neighbourhood are just a guess
cross_nhood = false(11,11); cross_nhood(:,6)=1;cross_nhood(6,:)=1;
img_ent = entropyfilt(img./255,repmat(cross_nhood,[1 1 3]));
img_ent_gray = rgb2gray(img_ent);

然后我们使用Harris探测器找到角落并选择4点:最左边两个和最右边两个,并裁剪图像从而去除背景(精确到倾斜)。我使用r2011a,你可能有点different functions,参考MATLAB帮助

harris_pts = corner(img_ent_gray);
corn_pts = sortrows(harris_pts,1); 
corn_pts = [corn_pts(1:2,:);...
            corn_pts(size(corn_pts,1)-1:size(corn_pts,1),:)];
crop_img=img(min(corn_pts(:,2)):max(corn_pts(:,2)),...
             min(corn_pts(:,1)):max(corn_pts(:,1)),:);
corn_pts(:,1)=corn_pts(:,1) - min(corn_pts(:,1));
corn_pts(:,2)=corn_pts(:,2) - min(corn_pts(:,2));
corn_pts = corn_pts + 1;

这是一个问题:角点之间的线条以不同的角度倾斜。它既可以是角点检测和图像捕获的问题(客观失真和/或有点错误的采集角度)。没有直截了当,永远正确的解决方案。我最好选择最大的倾斜度(它会稍微裁剪图片)并开始逐行处理图像(分割图像使用Bresenham算法)直到任何或大多数,你选择,像素属于图片,不是内在的边界。可区分的特征可以是局部熵,颜色值的标准,特定的颜色阈值,不同的统计方法等等。

另一种方法是进行颜色分割,我喜欢大多数Gram-Shmidt正交化或a*-b* color segmentation。但是,如果图像歪斜并且图片的一部分与边框的颜色匹配(参见最后一张图片,左下角),则会遇到所有相同的问题。