图形图像处理之——实现图形图像子区域额提取3

        今天把之前没完成的工作又拿出来改进了下,基本实现了想要的结果,但是只局限在一张图片上面,接下来的工作就是实现批量处理,相信通过努力,最终会实现的。

现在图片能够居中显示了,哈哈。还是分享出代码吧:

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


最终的效果如下:

     ,哈哈,这样就把这张图片的6个贝母提取出来了。继续加油哦!!

你可能感兴趣的:(图像相关)