matlab直方图均衡化实现
直方图均衡化原理
以下是个人对直方图均衡化的理解,只做参考。如有问题请前辈们指正:
直方图均衡化的目的是为了提升图像对比度,采用的方式是将一幅图像的直方图分布尽可能地变成近似分布。
参考公式资源比较多,个人推荐参考一下文章(https://zhuanlan.zhihu.com/p/44918476)
malab实现
以下是个人代码。
clc;
clear all;
%从文件夹中读取两幅图片,并进行RGB到灰度的变换
pic_moon = imread('pic\moon.jpg');
pic_city = imread('pic\city.jpg');
pic_moon = rgb2gray(pic_moon);
pic_city = rgb2gray(pic_city);
%显示一张图片
figure(1);
imshow(pic_city);
%获取pic_moon的图片信息,主要是宽与高的像素数
[size_x,size_y] = size(pic_moon);
%创建两个全零数组,第一个用来存放变换后的映射表,第二个用来存放0-255每个像素的数量和
hist_map = zeros(1,256);
num_map = zeros(1,256);
%个人测试信号,可忽略
test = 0;
%计算值为0-255的像素个数(非0-255总数,是0的总数、1的总数、2的总数。。。。。)
for X = 1:size_x
for Y = 1:size_y
num_y = pic_city(X,Y)+1;
num_map(1,num_y) = num_map(1,num_y) + 1;
end
end
%获取新的映射表
new_num = 0;
for Z = 1:256
new_num = num_map(1,Z) + new_num;
hist_map(1,Z) = 256*new_num/(size_x*size_y);
end
hist_map = uint8(hist_map);
%像素值重新映射
hist_pic = uint8(zeros(size_x,size_y));
for X1 = 1:size_x
for Y1 = 1:size_y
deel_val = pic_city(X1,Y1)+1;
hist_pic(X1,Y1) = hist_map(1,deel_val);
end
end
figure(2);
imshow(hist_pic);
figure(3);
imshow(histeq(hist_pic));
figure(4);
imhist(pic_city);
figure(5);
imhist(hist_pic);
figure(6);
imhist(histeq(hist_pic));
与matlab函数对比
原图:1
matlab histeq 函数效果
我的算法效果
原图2
处理后的效果
可以看出对于对比度的提升是有一定的作用的,我的测试中对第一幅的处理效果较差,第二幅图效果较好,感兴趣的同学可以试试别的图片。
接下来我会对该算法进行优化修改,并将原理、代码、效果写在往后的文章中