基于其二进制 - Matlab裁剪图像

时间:2015-11-08 16:58:46

标签: image matlab image-processing

我希望裁剪此原始图像

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

到一个新图像,其中只包含最小白色像素的包(基本上将尺寸图像缩小到包边框)

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

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

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

但我不知道如何找到袋角坐标[xmin ymin width height]以便与imcrop(I,rect)一起使用它们。

任何帮助都会很棒。

剧本:

clc;    
close all;  

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

grayImage = rgb2gray(rgbImage);

binaryImage = grayImage < 250;

imshow(binaryImage);

1 个答案:

答案 0 :(得分:2)

这是一项非常容易执行的任务。由于binaryImage包含您要用于裁剪图像的蒙版,因此您可以通过分别找到非最小的列和行坐标来找到要裁剪的位置的左上角(xmin,ymin) -zero在掩码中,然后找到宽度和高度,找到非零的右下角,然后减去宽度的两个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;

我为你的裁剪图像得到了这个:

enter image description here