Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在MATLAB中识别和裁剪图像中的矩形_Image_Matlab_Image Processing - Fatal编程技术网

Image 如何在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

我有一个画了一个矩形的图像。矩形可以是任何设计,但背景不是单一颜色。这是一张像这样的手机摄像头拍的照片。 我想裁剪图像中的内部图片(场景)

如何在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);
但它只适用于一个图像,这一个

而不是上面的那个或这个

我需要找到一个代码,该代码适用于任何特定的矩形设计的图像。任何帮助都将受到欢迎。谢谢


下面的处理考虑以下因素:

  • 背景为单色,可能带有渐变
  • 边框是单色的(渐变色),很容易与背景区分,而不是巴洛克/罗科科风格
  • 图片是一种有很多细节的真实世界图片,而不是
因此,我们首先搜索图片,然后通过熵滤波将背景平坦化

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正交化或。但是,如果图像倾斜,并且图片的一部分与边框颜色匹配(请参见最后一张图片,左下角),您会遇到同样的问题。

您的图像是否总是有一种颜色背景?不,实际上是一种颜色,但有点像您在最后一张图像中看到的渐变色