题目:自定义一个函数,将输入图像(EXP3A.tif)进行直方图均衡化处理,该函数输入参数为处理前的图像,输出参数为处理后的图像和直方图均衡化过程的变换函数,并画出直方图均衡化处理过程中的变换函数。
提示:直方图均衡化是一种无参的图像灰度变换方法,所以可将函数模板设计为[img2, func_T] = myHistogramEqualization(img);其中,img为唯一的输入参数输入图像;img2为输出图像,func_T为将img处理成img2所用的变换函数,变换函数可利用灰度变换模型计算累计概率密度(CDF)获得。
流程:
1. 统计图像中每个灰度级出现的次数,再统计图像中每个灰度级出现的概率
2. 根据变换公式得到直方图均衡化的变换函数
3. 根据变换函数映射到每个像素点
4. 输出映射后的图像
实现效果演示:
图1 直方图均衡化处理前后的图像及其对应的变换函数
实现源代码:
function [img2, func_T] = myHistogramEqualization(img)
img1 = double(img);
[r,c,l] = size(img1)%获取图像的高r和宽c
%统计图像中每个灰度级出现的次数
count = zeros(1,256);
for i=1:r
for j=1:c
count(1,img(i,j)+1) = count(1,img(i,j)+1)+1;
end
end
%统计图像中每个灰度级出现的概率
p = zeros(1,256);
for i=1:256
p(1,i) = count(1,i)/(r*c);
end
img2 = im2uint8(ones(r,c));%创建一个r X c大小的1矩阵
func_T = zeros(1,256);%变换函数
p_sum = 0;
%求直方图均衡化的变换函数
for k = 1:256
p_sum = p_sum + p(k);%求每个灰度级的概率之和
func_T(k) = (256-1)*p_sum;%根据变换函数的公式求和
end
func_T_z = round(func_T);%对变换函数进行取整
%完成每个像素点的映射
for i = 1:256
findi = find(func_T_z==i);%找到灰度级为i的概率和
len = length(findi);
for j=1:len
findj = find(img==(findi(j)-1));%进行对应每个像素点的映射
img2(findj) = i;
end
end
end
clc;
clear;
close all;
img1 = imread('EXP3A.tif');
[img2, func_T] = myHistogramEqualization(img1);
%显示图像
figure('NumberTitle', 'off', 'Name', '实验一第一题');
subplot(2,3,1);
imshow(img1);
title('原始图像');
subplot(2,3,3);
imshow(img2);
title('均衡化后图像');
subplot(2,3,4);
imhist(img1);
xlim([0 255]);
title('原始图像的直方图');
subplot(2,3,5);
plot(1:256,func_T);
xlim([0 255]);
ylim([0, 255]);
title('变换函数');
subplot(2,3,6);
imhist(img2);
xlim([0 255]);
title('均衡化后图像的直方图');