Practice:
1.Try it,and display it on the screen.
实现方式:
RGB = imread('night.jpg');
I = rgb2gray(RGB);
Hist = imhist(I);
Min = min(Hist);
Max = max(Hist);
E = I .* 1.5;
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imshow(E);
subplot(2,2,3);
imhist(I);
subplot(2,2,4);
imhist(E);
接下来,用histeq函数做一下对比:
实现方式:
RGB = imread('night.jpg');
I = rgb2gray(RGB);
E = histeq(I);
subplot(2,2,1);
imshow(I);
subplot(2,2,2);
imshow(E);
subplot(2,2,3);
imhist(I);
subplot(2,2,4);
imhist(E);
咦?原来这才是均衡化,修改一下实现方式:
具体代码如下:
RGB = imread('night.jpg');
II = rgb2gray(RGB);
[m,n]=size(II);
f1 = im2uint8(ones(m,n));
% matlab读入图像的数据是uint8,
% 而matlab中数值一般采用double型(64位)存储和运算。
% 把图像数据类型转换为无符号八位整型
% 得到输入图像的直方图h
h = imhist(II);
% 获取直方图的横坐标和纵坐标,即各个像素级,以及每个像素级上的像素出现的次数
I = length(h);
% 最大数组维度的长度
PDF = h/numel(II);
% 数组元素的数目
%概率密度PDF
CDF = cumsum(PDF);
% 累积和
%分布函数CDF
j = CDF .* 256;
%取整扩展,得到均衡化之后的灰度分布直方图
J = round(j);
% 灰度级数取整
%将扩展后的灰度级数对应映射到图片中
for i = 1 : I
nn = find(J == i);
%找出扩展后的灰度级数对应的扩展前的灰度级数
%find返回的是位置
L = length(nn);
for k = 1: L
nn1 = find(II ==(nn(k)- 1));
%再找到扩展前的灰度级数对应的像素点
f1(nn1) = i;
%并将像素点对应灰度值值置为扩展后的灰度值
end
end
subplot(2,2,1);
imshow(II);
subplot(2,2,2);
imshow(f1);
subplot(2,2,3);
imhist(II);
subplot(2,2,4);
imhist(f1);
参考:羽化成麟没有小白龙的博客