今天把之前没完成的工作又拿出来改进了下,基本实现了想要的结果,但是只局限在一张图片上面,接下来的工作就是实现批量处理,相信通过努力,最终会实现的。
现在图片能够居中显示了,哈哈。还是分享出代码吧:
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&