2015-11-08 35 views
1

我要裁剪此原始图像作物基于其二进制图像 - Matlab的

bag http://oi65.tinypic.com/i19md1.jpg

以全新的形象,将只包含最小的白色像素袋(实质上缩小尺寸图像的袋边框)

cropbag http://oi67.tinypic.com/2wns6qr.jpg

因此,我决定先将其转换为二进制图像

binbag http://oi67.tinypic.com/16aoej8.jpg

,但我不知道怎么找,以便与imcrop使用它们的包角坐标[XMIN ymin的宽度高度(我,RECT)。

任何帮助将是伟大的。

脚本:

clc;  
close all; 

url='http://oi65.tinypic.com/i19md1.jpg' ; 
rgbImage = imread(url); 

grayImage = rgb2gray(rgbImage); 

binaryImage = grayImage < 250; 

imshow(binaryImage); 

回答

1

这是执行一个非常容易的事。由于binaryImage包含要用于裁剪图像的蒙版,因此您可以通过分别找到蒙版中非零的最小列和行坐标,然后找到要在其中进行裁剪的左上角(xmin,ymin)找到宽度和高度,找到非零的右下角,然后减去宽度的两个x坐标和高度的两个y坐标。您需要为每个差异添加1以说明自我距离(即,如果您的宽度为1像素宽,则应该获得宽度1,而不是0)。您可以使用find来帮助您找到非零的行和列位置。然而,imcrop要求x坐标反映水平行为和y坐标分别find返回的行和列的位置,其中反映垂直行为。这就是为什么你必须将它们翻转,当你调用find

[y,x] = find(binaryImage); %// Find row and column locations that are non-zero 

%// Find top left corner 
xmin = min(x(:)); 
ymin = min(y(:)); 

%// Find bottom right corner 
xmax = max(x(:)); 
ymax = max(y(:)); 

%// Find width and height 
width = xmax - xmin + 1; 
height = ymax - ymin + 1; 

现在,您可以继续前进,裁剪图像:

out = imcrop(rgbImage, [xmin ymin width height]); 
imshow(out); 

我得到这个你裁剪图像:

enter image description here