2017-08-18 127 views
1

我有一个图像,其中绘制了一个矩形。矩形可以是任何设计,但背景不是单一的颜色。这是从这个手机拍摄的照片。 Test image 我想裁剪图像中的内部图片(scenary)。如何在MATLAB中识别和裁剪图像中的矩形

我该怎么在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

我需要找到这对于任何图像与特定的矩形design.Any帮助作品将aprreciated.Thank你

+0

您的图片是否总有一种颜色背景? – Cecilia

+0

不,实际上它的一种颜色,但它的一种渐变颜色,你可以在上一张图中看到 –

回答

1

下处理考虑以下代码:

  • backgroung是单色的,可能的梯度
  • 边框为单色(梯度),是由后台很容易分辨,不巴洛/洛可可风格
  • 一个画面是有很多的细节那种真实世界的画面,不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); 

随后,我们发现使用哈里斯检测器角,选择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算法分割图像),直到任何或大部分,您可以选择,像素属于图片,而不是内部边界。可区分的特征可以是局部熵,颜色值的标准,特定的颜色阈值,不同的统计方法等等。

另一种方法是做颜色分割,我喜欢大多数革兰氏Shmidt正交或a*-b* color segmentation。但是,如果图像偏斜并且图片的一部分与边框的颜色相匹配(请参阅最后一张图片,左下角),则会出现同样的问题。