matlab实现图像的直方图均衡化处理 直方图均衡化 代码

xiaoxiao2025-10-24  8

题目:自定义一个函数,将输入图像(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('均衡化后图像的直方图');

 

转载请注明原文地址: https://www.6miu.com/read-5038448.html

最新回复(0)