今天经过高人点醒,我好想懂了点点我要做的东东的思路,今天晚上就拿出来试了一下,居然还小小的实现了一番,太开心了,迫不及待的拿出来分享一下:
不过当然还没有完全实现,还需要进一步的设计批量操作。代码贴出来:
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了,~~~~(>_<)~~~~