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

Image 自动查找和裁剪定义的图像区域,image,matlab,image-processing,crop,image-segmentation,Image,Matlab,Image Processing,Crop,Image Segmentation,我想在matlab中处理一幅图像 图像由坚实的背景和两个样本(顶部和底部)组成。我已经有了一个代码,将顶部和底部分开,并使其成为两个图像。但我没有做的部分是只将图像裁剪到胶合区域(图像中的红色框,我只标记了顶部)。但是,裁剪后的图像应该是一个矩形,就像红色框一样(黄色背景,可以在之后丢弃) 我知道这可以通过imcrop完成,但这需要用户手动输入。代码需要自动化,以便在无需用户输入的情况下处理更多图像。所有图像将具有相同的颜色(红色表示胶水,黑色表示材质) 有人能帮我吗 编辑:谢谢你的帮助。我使

我想在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)
a=imread('testim0.png');
级别=灰度阈值(a);
bw2=im2bw(a,电平);
rgb2=bw2rgb(bw2);
IM2=imclearborder(rgb2,4);
pic_negative=ait_imgneg(IM2);
%%数字
%图(
%图像(rgb2)
% 
%图(
%imshow(图片/负片)
%%计数百分比
g=0;
对于j=1:尺寸(rgb2,2)
对于i=1:尺寸(rgb2,1)

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

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

您可以通过以下方式轻松获得未知的有界裁剪:

1) 绘制图像的等高线

2)
find()
在最大/最小X/ys的结果上

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


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

对于基于颜色(黄色、黑色在您的案例中突出)的直接图像分割为2个区域(背景、前景),可以使用算法对图像颜色值进行聚类。为了增强鲁棒性,您可以将图像从RGB变换到颜色空间

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


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

既然您已经能够分离顶部和底部,并且能够分割您想要的区域(包括您不想要的右侧的一小部分),我建议您只需通过以下步骤在代码末尾添加一个修复程序

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

那么,您是想自动将图像分割为“粘合”区域和“材质”区域(更复杂),还是需要应用矩形“裁剪遮罩”(正如@slayton还指出的那样)。如果是后者,不同图像之间区域的大小、位置或其他方式是否固定?最终目标是获得样本上的胶水百分比(在红色框中,其他区域应丢弃)。我遇到的困难是从红色框中裁剪黑色部分,因为这部分不相关。然而,标本可以上下移动(取决于谁制作的图片)。但是,所有图像都与我链接的图像相似。在这种情况下,您可能需要分割每个不同的图像(请参阅我的答案,了解快速而肮脏的解决方案),或者跟踪第一个序列帧上检测到的框到所有其他框(即使用运动估计、扭曲或关键点检测)。不过,我也想到了这种解决方案,这意味着所有的标本都应该在每张图片上完全相同的位置。这是不可能的。我已经做的是,将背景色(黄色部分)设为绿色(0255,0),然后设置黑色的阈值(例如(感谢您的回答,这很有帮助。但是,您能否再举一个例子,说明如何使用索引裁剪原始图像。一直面临的问题是图像(白色部分)不是直的,因此在裁剪后我仍然会得到一些黑色像素。
% 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);