【问题标题】:How to Crop Multiple Objects in an Image [MATLAB]如何裁剪图像中的多个对象 [MATLAB]
【发布时间】:2014-07-20 14:01:46
【问题描述】:

我是 MATLAB 的新生并使用 MATLAB 和神经网络开发“大米质量识别”应用程序。对于我的指导,我更喜欢这个 Research Paper

此应用程序包含 5 个阶段

  1. 图像采集
  2. 图像预处理
  3. 图像分割和识别感兴趣区域
  4. 特征提取
  5. 培训和测试

我现在处于第三阶段,已经为此应用程序开发了初始步骤

第 1 步:从计算机浏览图像并显示它

 % Get the orginal image & show , Figure 1
 [fileName, pathName] = uigetfile('*.jpg;*.tif;*.png;*.gif','Select the Picture file');
 I = fullfile(pathName, fileName);
 I = imread(I);
 imshow(I)

第 2 步:背景减法

% selected rice image Background subtraction , Figure 2
% Use Morphological Opening to Estimate the Background
background = imopen(I,strel('disk',7));
I2 = I - background;
figure, imshow(I2);

第 3 步:

% get the Black and white Image , Figure 3
% output image BW replaces all pixels in the input image with luminance greater than 0.17 level  
BW = im2bw(I2,0.17);
figure, imshow(BW)

第 4 步:

 % Remove small objects fewer than 30 pixels from binary image
 pure = bwareaopen(BW,30);
 figure, imshow(pure)

第 5 步:标记

% Label Black and white & Image bounding box around each object
L=bwlabel(pure,8);
bb=regionprops(L,'BoundingBox');

我从 2 天开始就坚持第 6 步。第 6 步是使用带标签的二值图像从原始图像中裁剪多个对象

确切的输出应该如下图所示,

如果我能得到这个,我可以轻松计算原始图像中每个对象的形态特征和颜色特征,以用于阶段 4。

形态特征

1.Area for each Object
2.scale of X, Y axis for each object in above picture
3.using X, Y axis I can Calculate Aspect Ratio

颜色特征

 1. Red Mean 
 2. Green Mean 
 3. Blue Mean

您能否解释一下使用标记二进制图像从原始图像中裁剪多个对象的方法,即第 6 步。

【问题讨论】:

    标签: matlab image-processing neural-network


    【解决方案1】:

    如果我对第 6 步的解释正确,我相信它的意思是他们希望您在第 5 步之后使用您生成的二进制映射分割最终对象。鉴于您的 cmets,您还希望提取步骤 #5 中描述的边界框。如果是这种情况,那么您所要做的就是使用bb 中定义的RegionProps 结构,这将帮助我们为您做到这一点。回顾一下,从图像中提取的每个对象的 RegionProps 结构的 BoundingBox 字段返回一个由 4 个数字组成的数组,如下所示:

    [x y w h]
    

    x 表示列/水平坐标,y 表示行/垂直坐标,w,h 表示边界框的宽度和高度。

    您需要做的就是创建一个二进制地图,然后循环遍历每个边界框以描绘我们需要从图像中剪切的位置。完成后,使用此二进制地图提取像素。换句话说:

    %//Initialize map to zero
    bMap = false(size(pure));
    
    %//Go through each bounding box
    for i = 1 : numel(bb)
        %//Get the i'th bounding box
        bbox = bb(i).BoundingBox;
    
        %//Set this entire rectangle to true
        %//Make sure we cast off any decimal
        %//co-ordinates as the pixel locations
        %//are integer
        bbox = floor(bbox);
        bMap(bbox(2):bbox(4), bbox(1):bbox(3)) = true;
    end
    
    %//Now extract our regions
    out = zeros(size(I));
    out = cast(out, class(I)); %//Ensures compatible types
    
    %//Extract cropped out regions for each channel
    for i = 1 : size(out,3)
        chanOut = out(:,:,i);
        chanIm = I(:,:,i);
        chanOut(bMap) = chanIm(bMap);
        out(:,:,i) = chanOut;
    end
    

    这将创建一个存储在out 中的输出图像,并根据步骤#5 中给出的每个边界框,仅复制每个通道中为真的像素。

    我相信这就是第 6 步所说的。让我知道我是否正确解释了这一点。

    【讨论】:

    • 你明白了我的意图,但我需要清除这个“如何在一个图中可视化这些映射的单个对象,如上图?我是否需要使用“for循环”来做到这一点?“我真的很感谢您对这种情况的帮助
    • 你想创建一个包含所有这些对象的单个图像边界框完整吗?
    • 是的,就是这样,然后我可以轻松测量每个对象的形态特征和颜色特征,
    • 好的。你需要给我几分钟来修改我的答案。我们可以使用regionprops 中的值从原始图像中裁剪出每个边界框
    • 我仍然无法像i.stack.imgur.com/VZBz9.jpg 这样获得图像输出,这是 MATLAB 版本的问题吗?我正在使用 MATLAB R2013a
    猜你喜欢
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2014-08-03
    • 2016-12-05
    • 1970-01-01
    • 2019-01-19
    • 2013-04-20
    相关资源
    最近更新 更多