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

时间:2014-05-30 18:09:50

标签: matlab image-processing neural-network

我是MATLAB& amp;利用MATLAB开发“稻米品质鉴定”应用神经网络。对于我的指导,我更喜欢这个Research Paper

此应用程序包含5个阶段

  1. 图像采集
  2. 图像预处理
  3. 图像分割和识别感兴趣区域
  4. 特征提取
  5. 培训和测试
  6. 我现在处于第三阶段,已经为此应用程序开发了初始步骤

    步骤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)
    

    enter image description here

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

    enter image description here

    第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)
    

    enter image description here

    第4步:

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

    enter image description here

    第5步:标记

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

    我从2天开始就坚持第6步了。步骤6使用标记二进制图像从原始图像裁剪多个对象

    这正是输出应该如下图所示,

    enter image description here

    如果我能得到这个,我可以轻松计算原始图像中每个对象的形态特征和颜色特征,用于第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
    

    您能否解释一下使用Labeled Binary Image 从原始图像裁剪多个对象的方法,即第6步。

1 个答案:

答案 0 :(得分:0)

如果我正确地解释第6步,我相信它所说的是他们希望你使用你拥有的二进制地图在第5步之后分割出最终对象产生的。根据您的评论,您还希望提取步骤#5中描述的边界框。如果是这种情况,那么您所要做的就是使用RegionProps中定义的bb结构来帮助我们为您完成此操作。作为对您的一点评论,从图像中提取的每个对象的BoundingBox结构的RegionProps字段返回一个包含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所说的。如果我已正确解释这一点,请告诉我。