1

我想在matlab中处理图像

在此处输入图像描述

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

我知道这可以用 来完成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

4 回答 4

2

对于基于颜色(黄色、黑色在您的情况下突出)的直接图像分割成 2 个区域(背景、前景),一个选项可以是使用kmeans算法对图像颜色值进行聚类。为了获得额外的鲁棒性,您可以将图像从 RGB 转换为L a b*颜色空间。

您的案例示例遵循此处的 MATLAB Imape 处理示例。

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

在此处输入图像描述

在此处输入图像描述

% 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);

在此处输入图像描述

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

于 2012-09-19T22:18:07.167 回答
0

您可以通过以下方式轻松获得未知的有界作物

1)轮廓绘制图像,

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

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

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

于 2012-09-19T20:52:53.687 回答
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
于 2012-09-19T20:38:19.673 回答
0

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

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

于 2012-09-21T04:31:55.013 回答