对辣椒图像的分割程序,由于辣椒的弯曲程度不同,直接用外接矩形分割会存在重叠的情况,吧叶柄去掉再外接矩形分割比较好(还有用最小外接凸边形);记下流程,以后做图像分割自己可以借鉴。在图像分割中,最小外接其实都不怎么给力感觉。
close all;
clear all;
A=imread('4.jpg');
% imshow(A);
r=A(:,:,1);
g=A(:,:,2);
b=A(:,:,3);
grayim=mat2gray(g);%转灰度图
%图像二值化处理,最大类间方法找到合适阈值,后面加1的都是叶柄处理
binarization_s=graythresh(grayim);
biimg=im2bw(grayim,0.15);
biimg1=im2bw(grayim,binarization_s);
%填充空洞
fill=imfill(biimg,'holes');
fill1=imfill(biimg1,'holes');
%对叶柄做二次腐蚀
se=strel('square',3);
Image_erode11=imerode(fill1,se);
Image_erode1=imerode(Image_erode11,se);
%对整株做二次腐蚀
% Image_erode=imerode(fill,se);
Image_dilate=imerode(fill,se);
% Image_dilate=imerode(i2,se);
%寻找连通域W,j为整株连通域矩阵数量;W1,j1为叶柄连通域矩阵与数量
[ W,J] = bwlabel(Image_dilate,8);
[ W1,J1] = bwlabel(Image_erode1,8);
%计算连通域面积
S = regionprops(W, 'Area');
S1 = regionprops(W1, 'Area');
%建立矩阵bw2与W大小相同,其中面积大于200的保留
bw21=ismember(W,find([S.Area])>=200);
bw21=~bw21;
bw22=ismember(W1,find([S1.Area]<=2000));
%对叶柄进行滤波膨胀处理
b=medfilt2(bw22,[3,3]);
se1=strel('square',7);
b=imdilate(imdilate(b,se1),se1);
%删除叶柄
bw2=im2bw(bw21-b);
% figure('Name','bw2');
% imshow(bw2);
%对叶柄进行中值滤波处理
bw2=medfilt2(bw2,[3,3]);
%建立剩余连通域矩阵与数量
[ W3,J3] = bwlabel(bw2,8);
%计算连通域面积
S3 = regionprops(W3, 'Area');
%只剩主体
bw2x=~ismember(W3,find([S3.Area]>=200));
%边缘提取
% figure('Name','边缘提取1');
eprew=edge(bw2x,'Canny');
% imshow(eprew);title('Canny算子提取');
% 加载mask,去背景
im_e=immultiply(g, eprew);
[l,num]=bwlabel(im_e,8);
% figure('Name','边缘提取');
% imshow(im_e);
% %求解最小凸多边形
% figure('Name','Final-最小凸多边形'); imshow(A);
% stats= regionprops(l,'ConvexHull');
% %求质心
% for i=1:num
% tn = stats(i).ConvexHull;
% hold on;
% h = patch(tn(:, 1), tn(:, 2), 'r');
% set(h, 'FaceColor', 'none', 'EdgeColor','r', 'Marker', '.');
% end
% hold on
% %求几何中心
% for i=1:num
% A=stats(i).ConvexHull;
% xaxls=mean(A(:,1));
% yaxls=mean(A(:,2));
% solt(i,1)=xaxls;
% solt(i,2)=yaxls;
% plot(xaxls,yaxls,'Marker','o','MarkerEdgeColor','k',...
% 'MarkerFaceColor','k','MarkerSize',10);
% plot(xaxls,yaxls,'Marker','*','MarkerEdgeColor','w');
% end
% hold off;
%求解最小矩形(非最小外接矩)
figure('Name','Final-最小矩形(非最小外接矩)');
imshow(A);
hold on
%求质心
for k=1:num
[r,c]=find(l==k);
rbar1(k)=mean(r);
cbar1(k)=mean(c);
plot(cbar1(k),rbar1(k),'Marker','o','MarkerEdgeColor','k',...
'MarkerFaceColor','k','MarkerSize',10);
plot(cbar1(k),rbar1(k),'Marker','*','MarkerEdgeColor','w');
end
status= regionprops(l,'BoundingBox');
for i=1:num
rectangle('position',status(i).BoundingBox,'edgecolor','r');
BoundingBox_position_x(i,:)=status(i).BoundingBox;
end
hold off;
shownum=0;
[sA,index] = sort(BoundingBox_position_x(:,2));%把纵坐标y进行排序,实现空间位置的排序,先左边后右边
for band=1:512
temp_im_e=immultiply(g, bw2);%加载mask,去背景
for q=1:5
c=q;
start_xpos=BoundingBox_position_x(index(c),1);% 取按照人眼box的位置取值
start_ypos=BoundingBox_position_x(index(c),2);
xlength=BoundingBox_position_x(index(c),3);
ylength=BoundingBox_position_x(index(c),4);
single_leaf = imcrop(temp_im_e,[start_xpos start_ypos xlength ylength]);%截图
后来发现,之前用的方法有点愚蠢,没有充分利用find这个函数和连通域的特性。连通域会自己做好标记,通过find即可以找到你分割出来的ROI,这样不用做最小外接矩或者最小外接凸边形。修改后代码如下。
了close all;
clear all;
A=imread('4.jpg');
% imshow(A);
r=A(:,:,1);
g=A(:,:,2);
b=A(:,:,3);
grayim=mat2gray(g);%转灰度图
figure('Name','huidutu');
imshow(grayim);
%图像二值化处理,最大类间方法找到合适阈值,后面加1的都是叶柄处理
binarization_s=graythresh(grayim);
biimg=im2bw(grayim,0.15);
biimg1=im2bw(grayim,binarization_s);
%填充空洞
fill=imfill(biimg,'holes');
fill1=imfill(biimg1,'holes');
%对叶柄做二次腐蚀
se=strel('square',3);
Image_erode11=imerode(fill1,se);
Image_erode1=imerode(Image_erode11,se);
%对整株做二次腐蚀
% Image_erode=imerode(fill,se);
Image_dilate=imerode(fill,se);
% Image_dilate=imerode(i2,se);
%寻找连通域W,j为整株连通域矩阵数量;W1,j1为叶柄连通域矩阵与数量
[ W,J] = bwlabel(Image_dilate,8);
[ W1,J1] = bwlabel(Image_erode1,8);
%计算连通域面积
S = regionprops(W, 'Area');
S1 = regionprops(W1, 'Area');
%建立矩阵bw2与W大小相同,其中面积大于200的保留
bw21=ismember(W,find([S.Area])>=200);
bw21=~bw21;
bw22=ismember(W1,find([S1.Area]<=2000));
%对叶柄进行滤波膨胀处理
b=medfilt2(bw22,[3,3]);
se1=strel('square',7);
b=imdilate(imdilate(b,se1),se1);
%删除叶柄
bw2=im2bw(bw21-b);
% figure('Name','bw2');
% imshow(bw2);
%对叶柄进行中值滤波处理
bw2=medfilt2(bw2,[3,3]);
%建立剩余连通域矩阵与数量
[ W3,J3] = bwlabel(bw2,8);
%计算连通域面积
S3 = regionprops(W3, 'Area');
%只剩主体
bw2x=ismember(W3,find([S3.Area]>=200));
%边缘提取
% figure('Name','边缘提取1');
eprew=edge(bw2x,'Canny');
% imshow(eprew);title('Canny算子提取');
% 加载mask,去背景
im_e=immultiply(g, bw2x);
[l,num]=bwlabel(bw2x,8);
liantong=l;
figure('Name','边缘提取');
imshow(im_e);
%提取图像的长与宽
[row,clumn]=size(bw2x);
%显示分割顺序
for qshow=1:5
cshow=qshow;
backgroundshow=zeros(row,clumn);
% for i=1:num
[rxshow,cxshow]=find(liantong==cshow);
for i=1:size(rxshow)
backgroundshow(rxshow(i),cxshow(i))=1;
end
figure('Name','显示');
imshow(backgroundshow);
end
%进行多波段分割
for q=1:5
c=q;
temp_im_e=bw2;
background=zeros(row,clumn);
% for i=1:num
[rx,cx]=find(liantong==c);
for i=1:size(rx)
background(rx(i),cx(i))=1;
end
background=im2bw(background);
for band=1:1
im_ex=immultiply(g, background);
figure('Name','xxx');
imshow(im_ex);
hold on
end
end