实验二 图像直方图及灰度变换

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

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫归棠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值