如何裁剪图像中的多个对象[MATLAB]

如何裁剪图像中的多个对象[MATLAB],matlab,image-processing,neural-network,Matlab,Image Processing,Neural Network,我是MATLAB的大一新生,使用MATLAB和神经网络开发“大米质量识别”应用程序。作为我的指导,我更喜欢这个 此应用程序包括5个阶段 图像采集 图像预处理 图像分割与感兴趣区域识别 特征提取 培训和测试 我现在处于第三阶段,已经为此应用程序开发了初始步骤 步骤1:从计算机浏览图像并显示它 % Get the orginal image & show , Figure 1 [fileName, pathName] = uigetfile('*.jpg;*.tif;*.png;*.gi

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

此应用程序包括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');
    
    我从两天以来一直坚持第六步。步骤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中的标记二值图像从原始图像中裁剪多个对象

    如果我对第6步的解释正确,我相信它所说的是,他们希望您使用您生成的二进制映射,分割出第5步之后的最终对象。根据您的评论,您还希望提取步骤#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中给出的每个边界框,仅复制每个通道上的真实像素


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

    您准确地理解了我的意图,但我需要澄清这一点:“我如何在上图这样的一个图形中可视化这些映射的单个对象?我是否需要使用“for loop”来做到这一点?”我真的很感谢你在这种情况下的帮助。你想创建一个包含所有这些对象的图像,并且边界框完整吗?是的,就是这样,然后我可以很容易地测量每个对象的形态特征和颜色特征,好的。你需要给我几分钟来修改我的答案。我们可以使用
    regionprops
    中的值从原始图像中裁剪出每个边界框我仍然无法获得这样的图像输出,这是MATLAB版本的问题吗?我使用的是MatlabR2013A