自动查找和裁剪定义的图像区域

时间:2012-09-19 20:31:09

标签: image matlab image-processing crop image-segmentation

我想在matlab中处理图像

enter image description here

图像由坚实的背景和两个样本(顶部和底部)组成。我已经有一个代码将顶部和底部分开并使其成为两个图像。但是我不能正常工作的部分是将图像裁剪到胶合区域(图像中的红色框,我只标记了顶部的一个)。但是,裁剪后的图像应该是一个矩形,就像红色框一样(黄色背景,之后可以丢弃)。

我知道可以使用imcrop完成此操作,但这需要用户手动输入。代码需要自动化,以便可以在没有用户输入的情况下处理更多图像。所有图像都具有相同的颜色(胶水为红色,材料为黑色)。

有人可以帮我这个吗?

编辑:感谢您的帮助。我使用以下代码来解决问题。但是,我无法摆脱红色框的黑色部分。这可以通过在制作照片之前关闭该部分来解决。我使用的代码看起来有点奇怪,但它成功地计算了图片中的黑色区域并获得了百分比。

a=imread('testim0.png');
level = graythresh(a);
bw2=im2bw(a, level);
rgb2=bw2rgb(bw2);
IM2 = imclearborder(rgb2,4);
pic_negative = ait_imgneg(IM2);

%% figures
% figure()
% image(rgb2)
% 
% figure()
% imshow(pic_negative)
%% Counting percentage
g=0;
for j=1:size(rgb2,2)
    for i=1:size(rgb2,1)
        if  rgb2(i,j,1) <= 0 ...
          & rgb2(i,j,2) <= 0 ...
          & rgb2(i,j,3) <= 0
        g=g+1;
        end
    end
end

h=0;
for j=1:size(pic_negative,2)
    for i=1:size(pic_negative,1)
        if  pic_negative(i,j)== 0
        h=h+1;
        end
    end
end

per=g/(g+h)

如果有人提出改进代码的建议,我很高兴听到它。

4 个答案:

答案 0 :(得分:2)

对于基于颜色(黄色,黑色在您的情况下突出)的2个区域(背景,前景)的直接图像分割,选项可以使用kmeans算法聚类图像颜色值。为了获得额外的稳健性,您可以将图像从RGB转换为Lab*色彩空间。

您案例的示例遵循MATLAB Imape处理示例here

% read and transform to L*a*b space
im_rgb = double(imread('testim0.png'))./256;
im_lab = applycform(im_rgb, makecform('srgb2lab')); 

enter image description here

enter image description here

% keep only a,b-channels and form feature vector
ab = double(lab_I(:,:,2:3));
[nRows, nCols, ~] = size(ab);
ab = reshape(ab,nRows * nCols,2);

% apply k-means for 2 regions, repeat c times, e.g. c = 5  
nRegions = 2;
[cluster_idx cluster_center] = kmeans(ab,nRegions, 'Replicates', 5); 

% get foreground-background mask
im_regions = reshape(cluster_idx, nRows, nCols);

enter image description here

您可以使用生成的二进制图像来索引原始参考图像中的感兴趣区域(或查找边界)。

答案 1 :(得分:0)

图像保存为矩阵。如果您知道要裁剪的裁剪框的像素范围,则可以使用索引执行裁剪。

M = rand(100); % create a 100x100 matrix or load it from an image
left = 50;
right = 75;
top = 80;
bottom = 10;

croppedM = M(bottom:top, left:right);
%save croppedm

答案 2 :(得分:0)

你可以通过

轻松获得未知的有界作物

1)绘制图像的轮廓,

2)find()关于最大/最小X / ys的结果,

3)使用@ slayton的方法来执行实际裁剪。

编辑:只看你的实际形象 - 它不会那么容易。但是首先对图像进行颜色增强/阈值处理,轮廓应该以合理的精度工作。毋庸置疑,这需要根据您的具体情况进行调整。

答案 3 :(得分:0)

因为你已经能够分开顶部和底部,并且能够分割你想要的区域(包括你不想要的右侧的一小部分),我建议你只需添加修复在代码的最后通过以下内容。

分割后,将每列蓝色强度值相加,这样就可以将图像从2d压缩到1d。因此,如果原始区域是宽度= 683高度= 59,则新矩阵/图像将仅为宽度= 683高度= 1。 现在,您可以应用一个小阈值来确定边缘的位置,并将裁剪应用于该位置的图像。现在你得到你的统计数据。