【问题标题】:Find and crop defined image areas automatically自动查找和裁剪定义的图像区域
【发布时间】:2012-09-12 05:12:15
【问题描述】:

我想在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)

如果有人有一些改进代码的建议,我很高兴听到。

【问题讨论】:

  • 那么,您想自动将图像分割成“胶水”和“物质”区域(更复杂),还是需要应用矩形“裁剪蒙版”(@slayton 还指出)。如果是后者,不同图像之间的区域是否在大小、位置或其他方式上是固定的?
  • 最终的目标是得到试样上胶的百分比(红框内,其他区域应丢弃)。我所拥有的困难是从红色框中裁剪黑色部分,因为这部分不相关。但是,标本可以上下移动(取决于制作照片的人)。但所有图片都与我链接的图片相似。
  • 在这种情况下,您可能必须分割每个不同的图像(请参阅我的答案以获得快速而肮脏的解决方案),或者将在第一个序列帧上检测到的框跟踪到所有其余图像(即使用运动估计、变形或关键点检测)。

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


【解决方案1】:

既然你已经能够分离顶部和底部,并且还能够分割你想要的区域(包括你不想要的右侧的一小部分),我建议你添加一个修复在代码的末尾通过以下方式。

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

【讨论】:

    【解决方案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')); 
    

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

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

    【讨论】:

    • 感谢您的回答,帮助很大。但是,您能否再举例说明一下如何使用索引来裁剪原始图像。一直面临的问题是图像(白色部分)不直,因此裁剪后我仍然会得到一些黑色像素。
    【解决方案3】:

    您可以通过

    轻松获得未知的有界裁剪

    1) 绘制图像的轮廓,

    2) find() 关于 max/min X/ys 的结果,

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

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

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

      • 我也想过这个解决方案,但是,这意味着所有标本应该在每张图像上完全相同的位置。这是不可能的。我已经做的是,将背景颜色(黄色部分)设为绿色(0,255,0),然后设置黑色的阈值(例如(
      猜你喜欢
      • 2012-12-27
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多