图形图像处理之——实现图像子区域图像的简单提取


           今天经过高人点醒,我好想懂了点点我要做的东东的思路,今天晚上就拿出来试了一下,居然还小小的实现了一番,太开心了,迫不及待的拿出来分享一下:

不过当然还没有完全实现,还需要进一步的设计批量操作。代码贴出来:

 

image=imread('E:\qww.jpg');
[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');%对数组进行降序排序,并返回排序后的数组,Index为返回的排序后元素在原数组中的行位置或列位置.
L2 = ismember(L0,Index(1));%判断一个集合是否为另一个的子集,此地方是。
bwImage = bwlabel(L2);%进行标注
bwImage = imfill(bwImage,'holes');%%对二值图像中的目标孔进行填充点
stats1=regionprops(bwImage,'Centroid');

image1=rgb2ind(image,map);%将待处理图片转换为索引图像
[height,width]=size(image1);%计算灰度索引图像的长宽
for i=1:height   
        for j=1:width 
            if bwImage(i,j)==0
               image1(i,j)=0; 
            end
        end
end
image=ind2rgb(image1,map);%将处理后的索引图像转换为真彩色图像
imshow(image);

hold on 
plot(stats1.Centroid(1),stats1.Centroid(2),'R+');%用红色标注质心
hold off

x0=stats1.Centroid(1)% 求的图像质心的坐标
y0=stats1.Centroid(2)% 求的图像质心的坐标

rect=[x0-80 y0-80 x0+80 y0+80]
a=imcrop(image,rect);% 用imcrop裁剪:

figure;
imshow(a)
imwrite(a,'aaa.bmp')


    


看看效果吧:

原图:

 

这个图的最后一个子图,哈哈。不过这肯定不行,背景是由索引图像(背景0)转换过来的,转换过来背景就不是0了,~~~~(>_<)~~~~

 

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