今天把之前没完成的工作又拿出来改进了下,基本实现了想要的结果,但是只局限在一张图片上面,接下来的工作就是实现批量处理,相信通过努力,最终会实现的。
现在图片能够居中显示了,哈哈。还是分享出代码吧:
image=imread('E:\qw1.jpg'); load trees; %%——————————————处理图片,提取6个贝母的边缘————————————%% [H,S,V]=rgb2hsv(image);%step1:获取图片HSV分量,分别代表色调,饱和度,亮度 hMedian=median(median(H));%step2:提取中位数以下H分量,进行二值化 hBw1=im2bw(H,hMedian);%step3:二值化,阈值为hMedian HBelowMedian=H.*(~hBw1);%step4:剩余H二值化 hBw2=im2bw(HBelowMedian,graythresh(HBelowMedian));%二值化,阈值为graythresh(HBelowMedian) for i=1:size(image,1) bwImage(i,:)=bitxor(hBw1(i,:),hBw2(i,:));%%将hBw1和hBw2异或得到结果 end bwImage=~bwImage;%图像取反 [B0,L0] = bwboundaries(bwImage,'noholes');%边界跟踪,返回划分的区域L0,noholes算法只搜索目标的外边界。 stats = regionprops(L0,'Area');%regionprops测量每个标签区域L0的属性 [sortAfter,Index] = sort([stats(:,:).Area],'descend');%对数组进行降序排序,并返回排序后的数组 %————————————————————————————————————% %%——————————————处理第1个贝母——————————————%% %————————————————————————————————————% LL1 = ismember(L0,Index(1));%判断一个集合是否为另一个的子集,此地方是。 bwImage1 = bwlabel(LL1);%进行标注 bwImage1 = imfill(bwImage1,'holes');%%对二值图像中的目标孔进行填充点 stats1=regionprops(bwImage1,'Centroid'); x1=stats1.Centroid(2);% 求的图像1质心的坐标 y1=stats1.Centroid(1);% 求的图像1质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 backgroud1=zeros(128,128);%创建背景(全0) backgroud1=~backgroud1;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud1,'Centroid');%求背景的质心 backgroud1=~backgroud1;%背景取反,恢复黑色。 backgroud1=mat2gray(backgroud1);%将矩阵转换为灰度图像 backgroud1=gray2ind(backgroud1);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage1(i,j)==0 indimage(i,j)=0; end end end aa1=x1-bckg_x;%原图质心和新背景质心横坐标距离 bb1=y1-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud1(fix(i-aa1),fix(j-bb1))=indimage(i,j); end end end showimage1=ind2rgb(backgroud1,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage1); title('1'); imwrite(showimage1,'showimage1.jpg') %————————————————————————————————————% %%——————————————处理第2个贝母——————————————%% %————————————————————————————————————% LL2 = ismember(L0,Index(2));%判断一个集合是否为另一个的子集,此地方是。 bwImage2 = bwlabel(LL2);%进行标注 bwImage2 = imfill(bwImage2,'holes');%%对二值图像中的目标孔进行填充点 stats2=regionprops(bwImage2,'Centroid'); y2=stats2.Centroid(1);% 求的图像2质心的坐标 x2=stats2.Centroid(2);% 求的图像2质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 backgroud2=zeros(128,128);%创建背景(全0) backgroud2=~backgroud2;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud2,'Centroid');%求背景的质心 backgroud2=~backgroud2;%背景取反,恢复黑色。 backgroud2=mat2gray(backgroud2);%将矩阵转换为灰度图像 backgroud2=gray2ind(backgroud2);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage2(i,j)==0 indimage(i,j)=0; end end end aa2=x2-bckg_x;%原图质心和新背景质心横坐标距离 bb2=y2-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud2(fix(i-aa2),fix(j-bb2))=indimage(i,j); end end end showimage2=ind2rgb(backgroud2,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage2); title('2'); imwrite(showimage2,'showimage2.jpg') %————————————————————————————————————% %%——————————————处理第3个贝母——————————————%% %————————————————————————————————————% LL3 = ismember(L0,Index(3));%判断一个集合是否为另一个的子集,此地方是。 bwImage3 = bwlabel(LL3);%进行标注 bwImage3 = imfill(bwImage3,'holes');%%对二值图像中的目标孔进行填充点 stats3=regionprops(bwImage3,'Centroid'); y3=stats3.Centroid(1);% 求的图像3质心的坐标 x3=stats3.Centroid(2);% 求的图像3质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 backgroud3=zeros(128,128);%创建背景(全0) backgroud3=~backgroud3;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud3,'Centroid');%求背景的质心 backgroud3=~backgroud3;%背景取反,恢复黑色。 backgroud3=mat2gray(backgroud3);%将矩阵转换为灰度图像 backgroud3=gray2ind(backgroud3);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage3(i,j)==0 indimage(i,j)=0; end end end aa3=x3-bckg_x;%原图质心和新背景质心横坐标距离 bb3=y3-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud3(fix(i-aa3),fix(j-bb3))=indimage(i,j); end end end showimage3=ind2rgb(backgroud3,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage3); title('3'); imwrite(showimage3,'showimage3.jpg') %————————————————————————————————————% %%——————————————处理第4个贝母——————————————%% %————————————————————————————————————% LL4 = ismember(L0,Index(4));%判断一个集合是否为另一个的子集,此地方是。 bwImage4 = bwlabel(LL4);%进行标注 bwImage4 = imfill(bwImage4,'holes');%%对二值图像中的目标孔进行填充点 stats4=regionprops(bwImage4,'Centroid'); y4=stats4.Centroid(1);% 求的图像4质心的坐标 x4=stats4.Centroid(2);% 求的图像4质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 %——————————创建背景 backgroud4=zeros(128,128);%创建背景(全0) backgroud4=~backgroud4;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud4,'Centroid');%求背景的质心 backgroud4=~backgroud4;%背景取反,恢复黑色。 backgroud4=mat2gray(backgroud4);%将矩阵转换为灰度图像 backgroud4=gray2ind(backgroud4);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage4(i,j)==0 indimage(i,j)=0; end end end aa4=x4-bckg_x;%原图质心和新背景质心横坐标距离 bb4=y4-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud4(fix(i-aa4),fix(j-bb4))=indimage(i,j); end end end showimage4=ind2rgb(backgroud4,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage4); title('4'); imwrite(showimage4,'showimage4.jpg'); %————————————————————————————————————% %%——————————————处理第5个贝母——————————————%% %————————————————————————————————————% LL5 = ismember(L0,Index(5));%判断一个集合是否为另一个的子集,此地方是。 bwImage5 = bwlabel(LL5);%进行标注 bwImage5 = imfill(bwImage5,'holes');%%对二值图像中的目标孔进行填充点 stats5=regionprops(bwImage5,'Centroid'); y5=stats5.Centroid(1);% 求的图像5质心的坐标 x5=stats5.Centroid(2);% 求的图像5质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 backgroud5=zeros(128,128);%创建背景(全0) backgroud5=~backgroud5;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud5,'Centroid');%求背景的质心 backgroud5=~backgroud5;%背景取反,恢复黑色。 backgroud5=mat2gray(backgroud5);%将矩阵转换为灰度图像 backgroud5=gray2ind(backgroud5);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage5(i,j)==0 indimage(i,j)=0; end end end aa5=x5-bckg_x;%原图质心和新背景质心横坐标距离 bb5=y5-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud5(fix(i-aa5),fix(j-bb5))=indimage(i,j); end end end showimage5=ind2rgb(backgroud5,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage5); title('5'); imwrite(showimage5,'showimage5.jpg') %————————————————————————————————————% %%——————————————处理第6个贝母——————————————%% %————————————————————————————————————% LL6 = ismember(L0,Index(6));%判断一个集合是否为另一个的子集,此地方是。 bwImage6 = bwlabel(LL6);%进行标注 bwImage6 = imfill(bwImage6,'holes');%%对二值图像中的目标孔进行填充点 stats6=regionprops(bwImage6,'Centroid'); y6=stats6.Centroid(1);% 求的图像6质心的坐标 x6=stats6.Centroid(2);% 求的图像6质心的坐标 indimage=rgb2ind(image,map);%将待处理图片转换为索引图像 [height,width]=size(indimage);%计算灰度索引图像的长宽 %——————————创建背景 backgroud6=zeros(128,128);%创建背景(全0) backgroud6=~backgroud6;%背景取反,目的是求质心 bckg_zhixin=regionprops(backgroud6,'Centroid');%求背景的质心 backgroud6=~backgroud6;%背景取反,恢复黑色。 backgroud6=mat2gray(backgroud6);%将矩阵转换为灰度图像 backgroud6=gray2ind(backgroud6);%将灰度图像转换为索引图像 bckg_y=bckg_zhixin.Centroid(1);%背景质心X坐标 bckg_x=bckg_zhixin.Centroid(2);%背景质心y坐标 %使原图像只显示一个贝母(索引图片) for i=1:height for j=1:width if bwImage6(i,j)==0 indimage(i,j)=0; end end end aa6=x6-bckg_x;%原图质心和新背景质心横坐标距离 bb6=y6-bckg_y;%原图质心和新背景质心纵坐标距离 for i=1: height for j=1: width if indimage(i,j)~=0 backgroud6(fix(i-aa6),fix(j-bb6))=indimage(i,j); end end end showimage6=ind2rgb(backgroud6,map);%将处理后的索引图像转换为真彩色图像 figure; imshow(showimage6); title('6'); imwrite(showimage6,'showimage6.jpg')
最终的效果如下: