[实验内容]:
一、运用Matlab对Lena进行对比度拉伸增强(利用 imadjust )
二、运用Matlab对图像进行直方图均衡化和规定化
Matlab版本:R2015a
原图像Lena的灰度变换范围为[a,b],处理后的图像out的灰度变换范围为[c,d]
方法一:线性灰度变换运算的数学表达式得出的,对比度拉伸增强后的图像
in=imread('boy.tif');
a=min(in(:));%原图像的灰度变换范围为[a,b]
b=max(in(:));
c=0;%处理后的图像out的灰度变换范围为[c,d],即[0,255]
d=255;
out = (d-c)/(b-a)*(in-a)+c;%线性灰度变换运算的数学表达式
figure;
subplot(1,2,1); imshow(in);title('原始图像');
subplot(1,2,2); imshow(out);title('线性灰度变换对比度拉伸增强后的图像');
效果图:
方法二:利用 imadjust得出的,对比度拉伸增强后的图像
J = imadjust(I,[low_in high_in],[low_out high_out],gamma)
该函数的作用是把原始图像中的小于low_in的像素值映射到low_out。把大于high_in的像素值映射到high_out。gamma是其他像素点的映射参数。
low_in = double(min(in(:)))/255;%原始图像的最小像素
high_in = double(max(in(:)))/255;%原始图像的最大像素
low_out=0;
high_out=1;
out=imadjust(in,[low_in,high_in],[low_out,high_out]);
figure;
subplot(1,2,1); imshow(in);title('原始图像');
subplot(1,2,2); imshow(out);title('imadjust,对比度拉伸增强后的图像');
1、请利用循环编程计算图像“Lena.bmp”的直方图,利用imhist对比前面的直方图计算是否正确。在一个figure中显示imhist的结果和自己计算的结果,并做适当标注
img_Lena= imread('Lena.bmp');
[row,col]=size(img_Lena);%提取图像的高度和宽度
zft=zeros(1,256);% 建立一个256列的行向量,以统计各灰度级的像素个数
%记录每个灰度值的像素数目
for i=1:row
for j=1:col
k=img_Lena(i,j); % k是像素点(i,j)的灰度值
% 因为zft数组的下标是从1开始的,但是图像像素的取值范围是0~255,所以用zft(k+1)
zft(k+1)=zft(k+1)+1; % 对应灰度值像素点数量加1
end
end
figure;
subplot(2,2,1);imshow(img_Lena);title('原图')
subplot(2,2,2);bar(zft);title('循环bar灰度图像直方图')
subplot(2,2,3);imhist(img_Lena);title('imhist检验')
效果图:
%2、利用 histeq 对图像“Lena.bmp”进行直方图均衡化
Original_lena = imread('Lena.bmp');
histeq_lena = histeq(Original_lena);%使用直方图均衡增强对比度
%3、将图像“Lena.bmp”直方图规定化为图像“boy.tif”的直方图,详细比较显示直方图均衡化、规定化前后直方图和图像的变化情况
Original_boy=imread('boy.tif');
imhist_boy=imhist(Original_boy);%boy图像数据的直方图
%J = histeq(I,hgram),对灰度图像I进行变换,使得输出灰度图像J的直方图与目标直方图hgram近似匹配。
Lena_histeq_ImhistBoy=histeq(Original_lena,imhist_boy);
%详细比较显示直方图均衡化、规定化前后直方图和图像的变化情况
figure;
subplot(2,2,1); imhist(Original_lena); title('原始Lena直方图');
subplot(2,2,2); imhist(histeq_lena); title('Lena均衡直方图');
subplot(2,2,3); imhist(Original_boy); title('原始boy直方图');
subplot(2,2,4); imhist(Lena_histeq_ImhistBoy); title('正则化直方图');
效果图:
4、不使用 histeq ,自行编程实现对Lena图像进行直方图均衡
I=imread('Lena.bmp');
[height, width] = size(I);
count = zeros(1, 256); % 统计每个像素值出现次数
for i = 1 : height
for j = 1 : width
%k = I(i,j);
count(I(i,j)+1 )= count(I(i,j)+1) + 1;
end
end
% 接下来,将频数值算为频率
ProbPixel = zeros(1,256); % 统计各灰度级出现的频率
ProbPixel=double(ProbPixel);count=double(count);
% 统计每个像素值出现的概率, 得到概率直方图
for i = 1 : 256
ProbPixel(1,i) =count(1,i) / (height * width);
end
% 求累计概率,得到累计直方图
for i=2:256
ProbPixel(i)=ProbPixel(i-1)+ProbPixel(i);
end
%完善ProbPixel函数的定义
for i = 1 : 256
ProbPixel(i) = ProbPixel(i) * 255;
end
% 完成每个像素点的映射
I=double(I);
for i = 1 : height
for j = 1 : width
I(i,j) = ProbPixel(I(i,j)+1); % 这里的v(i,j)不能为0,否则数组索引出错
end
end
II=uint8(I);
figure;
subplot(2,2,1); imshow(Original_lena); title('原始Lena图像');
subplot(2,2,2); imshow(histeq_lena); title('Lena直方图均衡图像');
subplot(2,2,3); imshow(Lena_histeq_ImhistBoy); title('正则化直方图图像');
subplot(2,2,4); imshow(II); title('自己编写的直方图均衡化处理结果');
效果图:
如果有错,欢迎纠正