记一次作业,统计一张图上的粒子分布——利用白顶帽变换统计各个尺寸的结构元的频数,最终绘制直方图。
% 利用matlab的内置函数进行灰度形态学的计算
clear;
I=imread('Chapter5_1.bmp');
% imshow(I)
% rectangle('Position',[208,218,10,10],'edgecolor','r') %衡量小粒子的大小
% rectangle('Position',[80,10,120,120],'edgecolor','r') %衡量小粒子的大小
count=[];
for x=3:2:119
size1=x;%WTH加强亮细节,结构元大于亮细节尺寸
SE1=strel('square',size1);
Iop1=imopen(I,SE1);%开运算函数,可以直接进行开运算:先腐蚀再膨胀
dif1=I-Iop1;
size2=x+2;%WTH加强亮细节,结构元大于亮细节尺寸
SE2=strel('square',size2);
Iop2=imopen(I,SE2);%开运算函数,可以直接进行开运算:先腐蚀再膨胀
dif2=I-Iop2;
dif=dif2-dif1;%留下(x+2)*(x+2)-x*x之间尺寸的粒子
% figure(1)
% subplot(1,3,1),imshow(I),title('原图');
% subplot(1,3,2),imshow(Iop),title('开运算函数');
% subplot(1,3,3),imshow(dif),title('亮区域粒子');
b=rgb2gray(dif);%绘制灰度直方图需要归一化成二值灰度图像
b1=b;
[m,n]=find(b1<20);%灰度阈值处理,留下差值更大的部分:小于20的阈值被置0(认为是大粒子的区域)
for i=1:size(m,1)
b1(m(i),n(i))=0;
end
% figure(2)
% subplot(1,2,1),imshow(b);%筛选前
% subplot(1,2,2),imshow(b1);%筛选后
white_point_count=length(find(b1~=0));%计算不是黑色的像素点的个数
counts=white_point_count/(x+2)^2;
if counts==0 %如果不存在计数
break
end
count=[count counts];
end
bar(3+2:2:(x-2)+2,count/sum(count))
参考: