1、编写一个图像灰度直方图统计函数my_imhist,选择一幅图像利用my_imhist显示其直方图,将结果与MATLAB图像处理工具箱中提供的灰度直方图函数imhist的处理结果进行比较,并在同一窗口中显示出来。
function hist(a)
[m,n]=size(a);
x=1:256;
y=zeros(1,256);
for i=1:m*n
y(a(i)+1)=y(a(i)+1)+1;
end
bar(x,y);
or
function hist(a)
[m,n]=size(a);
h=zeros(1,256); %生成一个1*256的0矩阵;
for m=1:m
for n=1:n
h(i(m,n)+1)=h(i(m,n)+1)+1; %统计每个像素的数值,由于i(m,n)代表像素数值有0数值,而MATLAB中矩阵下标从1开始,所以用i(m,n)+1代替下标;
end
end
bar(h); %用bar画图函数实现;
%主程序
a=imread("D:\好图共赏\111.jpg")
subplot(1,2,1);imhist(a);title('imhist函数');
subplot(1,2,2);hist(a);title('自定义函数');
2、利用以上编写的函数my_imhist或imhist,估算图像iris.tif中瞳孔的半径(以像素为单位)。
因为瞳孔是黑色的,可以大致认为图像中所有黑色的像素块都为瞳孔。根据hist算法
可以算出0-50之间的像素个数大约为14000个,然后圆形面积公式的R=(S/π)^(1/2),得R≈67。
但此结果并不精确,因为眉毛也是黑色的。
3、按照教材68页上的公式(4.1.6)
(4.1.6)
编程实现图像的分段线性灰度变换.
img=imread("L:\图像处理\实验文件\iris.tif")
[m,n,k]=size(i);
j=zeros(m,n,k);
a=255/3;
b=2*a;
M=255;
c=a+20;
d=M-c;
for i =1:m*n*k
if (img(i)>=0 && img(i)<a)
j(i)=(c/a)*img(i);
else
if (img(i)>=a && img(i)<b)
j(i)=(d-c)/(b-a)*(img(i)-a)+c;
else
j(i)=(d-b)/(d-a)*(img(i)-b)+d;
end
end
end
figure(1);
subplot(2,2,1);imshow(img);title('原图像');
subplot(2,2,2);imshow(uint8(j));title( '变换后' );
subplot(2,2,3);imhist(img);
subplot(2,2,4);imhist(uint8(j));
4、编写一个灰度图像的直方图均衡化函数(不可使用库函数)。(可使用的灰度等级数量不变即可),并对下图例题进行测试,给出测试结果。
I=[5 5 4 4 2 0 7;5 5 4 2 0 0 7;4 4 4 2 0 7 7;1 3 3 0 7 7 6;1 0 0 0 7 7 6;7 7 7 7 7 7 6;7 7 7 7 7 7 6];
%获得输入图像尺寸M、N(size函数)
[m,n]=size(I);
%灰度等级为0-7
num=zeros(1,8);
%计算每个灰度等级的个数
for i=1:m
for j=1:n
for k=0:7
if(I(i,j)==k)
num(k+1)=num(k+1)+1;
end
end
end
end
%计算每个灰度等级的频率
for k=1:8
num(k)=num(k)/(m*n);
end
%计算原图灰度的累计分布(使用cumsum函数)计算一个数组的累加值
sumnum=cumsum(num);
%四舍五入函数, 将num四舍五入,得到新旧图像灰度值的映射结果,均衡化
new=round(sumnum*7);
%形成新矩阵
Inew=zeros(m,n);
for i=1:m
for j=1:n
Inew(i,j)=new(I(i,j)+1); %让I(i,j)加1
end
end