Image 如何在MATLAB中识别和裁剪图像中的矩形
我有一个画了一个矩形的图像。矩形可以是任何设计,但背景不是单一颜色。这是一张像这样的手机摄像头拍的照片。 我想裁剪图像中的内部图片(场景) 如何在MATLAB中实现这一点 我试过这个密码Image 如何在MATLAB中识别和裁剪图像中的矩形,image,matlab,image-processing,Image,Matlab,Image Processing,我有一个画了一个矩形的图像。矩形可以是任何设计,但背景不是单一颜色。这是一张像这样的手机摄像头拍的照片。 我想裁剪图像中的内部图片(场景) 如何在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))) boundar
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);
但它只适用于一个图像,这一个
而不是上面的那个或这个
我需要找到一个代码,该代码适用于任何特定的矩形设计的图像。任何帮助都将受到欢迎。谢谢
下面的处理考虑以下因素:
- 背景为单色,可能带有渐变
- 边框是单色的(渐变色),很容易与背景区分,而不是巴洛克/罗科科风格
- 图片是一种有很多细节的真实世界图片,而不是
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,你可能有点,参考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正交化或。但是,如果图像倾斜,并且图片的一部分与边框颜色匹配(请参见最后一张图片,左下角),您会遇到同样的问题。您的图像是否总是有一种颜色背景?不,实际上是一种颜色,但有点像您在最后一张图像中看到的渐变色