直接灰度变换和直方图均衡化

姓名:   李旭   学号:51220710116评定成绩:         

实验名称:实验1图像增强

  1. 基本原理与方法
    1. 直接灰度变换

灰度图像是由灰度阴影组成的数字图像,通常由8位灰度图像中从0(黑色)到255(白色)的像素大小表示。图像中的每个像素表示图像中特定点的亮度。灰度变换(Gray Level Transformation)是一种将图像的灰度级(亮度)值进行变换的操作,用于调整图像的对比度、亮度或者进行灰度级的映射。它的一般表示形式为:

g(x, y) = T(f(x, y))

(1)

灰度变换的目的可以是增强图像的对比度、调整图像的亮度、拉伸灰度级范围、均衡化灰度分布等。

线性变换:线性变换是最简单的灰度变换方式,可以通过改变变换函数的斜率和偏移来调整图像的对比度和亮度。线性变换可以表示为:

gx,y=a*fx,y+b

(2)

其中,a和 b是常数,控制变换的斜率和偏移。通过适当选择a和b的值,可以调整图像的亮度和对比度。

对数变换:对数变换可以扩展图像中的低灰度级细节,并减少高灰度级之间的差异。对数变换可以表示为:

g(x, y) = c * log(1+ f(x, y))

(3)

其中,c是常数,用于调整对数变换的增益。对数变换对于低灰度级的像素进行放大,使得细节更加明显。

幂次变换(伽马校正):幂次变换可以用于调整图像的对比度和亮度,并改变图像的灰度级分布。幂次变换可以表示为:

g(x, y)=c*f(x, y)γ

(4)

其中,c是常数,γ是幂次指数。通过调整γ的值,可以改变图像的对比度和亮度。当γ大于1时,图像的低灰度级会被压缩,高灰度级会被扩展,从而增强对比度。

直方图均衡化:直方图均衡化是一种常用的灰度变换方法,旨在使图像的灰度级分布更均匀,增强图像的对比度。直方图均衡化的原理是通过对图像的累积分布函数进行变换,将原始图像中的灰度级映射到新的灰度级上。

    1. 直方图显示及均衡化

直方图均衡化是一种常用的图像增强技术,旨在调整图像的灰度级分布,增强图像的对比度。它的原理基于直方图和累积分布函数的概念。

直方图均衡化的过程如下:

  1. 计算直方图:首先,对输入图像进行灰度化处理,然后计算图像的直方图。直方图是一个表示图像中每个灰度级出现次数的统计图。
  2. 计算累积分布函数(CDF):基于直方图,计算图像的累积分布函数。累积分布函数描述了图像中所有灰度级的像素累积概率。
  3. 映射到新的灰度级:根据累积分布函数,将原始图像中的每个像素的灰度级映射到新的灰度级上。这个映射过程可以通过将累积分布函数值乘以最大灰度级数(如255)并进行四舍五入来实现。
  4. 生成均衡化后的图像:根据映射后的灰度级,重新分配原始图像中的每个像素的灰度值,生成均衡化后的图像。

直方图均衡化的原理是通过调整图像中像素的灰度级分布,使得图像的灰度级更加均匀,从而增强图像的对比度。它的目标是将输入图像的累积分布函数变为线性的,即每个灰度级出现的概率均匀分布。通过直方图均衡化,原始图像中的较暗的区域将会被拉伸,从而增强细节;而较亮的区域将会被压缩,减少过曝。这样可以使整个图像的灰度范围更好地利用,从而提高图像的视觉效果和信息表达能力。

  1. 程序主要源代码
    1. 直接灰度变换

function transformedPel = transformedPel(pel)

    if pel<=80

        transformedPel = 45*1.0/80*pel;

    end

    if pel>170

        transformedPel = 0.353 * (pel - 170) + 225;

    end

    if pel<=170 && 80<pel

         transformedPel = 2 * (pel - 80) + 45;

    end

end

%%遍历图像并进行相应的变换

for i = 1:h

    for j = 1:w

        pel = image(i,j);

        endImage(i,j) = transformedPel(pel);

    end

end

%%draw

x = (0:255);

y = (0:255);

for x = 1:256

    y(x) = transformedPel(x);

end

    1. 直方图显示及均衡化

%%求直方图

for i = 1:h

    for j = 1:w

        pel = image(i,j);

        numList(pel+1) = numList(pel+1)+1;

    end

end

%求概率分布

cdf = cumsum(numList) / numel(image);

cdf_map = uint8(255 * cdf);

equalized_image = cdf_map(image + 1);%映射

  1. 实验结果与分析
    1. 灰度变换

图1 灰度变换曲线

a.灰度变换前

b.灰度变换后

图2灰度变换前后对比

由图1可知该灰度变换由三段一次函数组成分别为:

(1)transformedPel=45/80*pel                                (if pel<=80) 

(2)transformedPel=0.353*pel-170+225   pel>170

(3)transformedPel=2*pel-80+45                 pel≤170&&80<pel

当斜率大于1时,会增强图像的对比度;当斜率小于1时,会降低对比度。偏移参数可以控制图像的整体亮度。线性变换对图像的灰度级进行线性映射,结果可能是简单的亮度调整,而不改变图像的细节。将实验结果与原图对比,可发现,变换后图像较亮的部分变得更亮,较暗的部分变得更暗,图像的对比度增强。

    1. 直方图均衡

图3和图4,我们分别选择了较暗和较亮的灰度图像,由它们的直方图可知,较暗的直方图集中分布在亮度等级为0附近;而较亮的图像则相反,亮度等级主要分布在255附近。根据实验我们可以得出一下直方图均衡化可以显著增强图像的对比度。通过将原始图像的灰度级重新映射,使得图像中的像素灰度分布更加均匀。这使得暗部和亮部之间的差异更加明显,细节更加清晰。通过增强对比度,图像的视觉效果得到改善,细节更加突出。同时,我们进行本实验算法和MATLAB平台算法的对比,通过对比我们可以看出,直方图均衡化后的图像以及直方图大致相同。

  1. 结论

通过本次实验我们可以得出以下结论:

  1. 直接灰度变换可以通过调整斜率和偏移来改变图像的亮度和对比度。当变换函数的斜率小于1时,我们发现降低了图像的对比度;而斜率大于1时,可以增强图像的对比度;当斜率为1时,变换后的图像与原图像相同。灰度变换的目标是改善图像的视觉效果,提高对比度,并突出图像中的细节。
  2. 直方图均衡化通过重新分布图像的灰度级,将原始图像中的灰度级范围映射到更广的范围内。这样做可以使得图像中的暗部和亮部之间的差异更加明显,从而增强了图像的对比度。暗部细节和亮部细节都能够得到更好的展示,使得图像更加鲜明和清晰。

clear all;
close all;
clc;
% 
image = imread('lena.bmp');
[h,w] = size(image); % 得到图像的width and height
endImage = zeros(size(image)); %创建一个和原图width and height 相同的图像,并赋值为zeros
%%遍历图像并进行相应的变换
for i = 1:h 
    for j = 1:w
        pel = image(i,j);
        endImage(i,j) = transformedPel(pel);
    end
end
%%显示图像
figure
subplot(1,2,2)
imshow(endImage/255)
title("灰度变换后")
subplot(1,2,1)
imshow(image)
title("灰度变换前")
%%draw 
x = (0:255);
y = (0:255);
for x = 1:256
    y(x) = transformedPel(x);
end
figure
plot(y);
title("变换曲线")
clear all;
close all;
clc;

numList = zeros(1, 256);
image = imread('2-1.tif');
[h,w] = size(image); % 得到图像的width and height
endImage = zeros(size(image)); %创建一个和原图width and height 相同的图像,并赋值为zeros
%%求直方图
for i = 1:h 
    for j = 1:w
        pel = image(i,j);
        numList(pel+1) = numList(pel+1)+1;
    end
end
%求概率分布
cdf = cumsum(numList) / numel(image);
cdf_map = uint8(255 * cdf);
equalized_image = cdf_map(image + 1);%映射
figure
imhist(equalized_image);
figure
imshow(equalized_image);
figure
imshow(image);
figure
imhist(image);
%
equalized_image = histeq(image);
figure;
subplot(1,2,1);
imshow(equalized_image);
title('Equalized Image');

subplot(1,2,2);
imhist(equalized_image);
title('Equalized Image Histogram');

%%

image = imread('2-2.tif');
equalized_image = myHistogramEqualization(image);

% 显示原始图像及其直方图
figure;
subplot(2, 2, 1);
imshow(image);
subplot(2, 2, 2);
imhist(image);

% 显示均衡化后的图像及其直方图
subplot(2, 2, 3);
imshow(equalized_image);
subplot(2, 2, 4);
imhist(equalized_image);

function transformedPel = transformedPel(pel)
    if pel<=80
        transformedPel = 45*1.0/80*pel;
    end
    if pel>170
        transformedPel = 0.353 * (pel - 170) + 225;
    end

    if pel<=170 && 80<pel
         transformedPel = 2 * (pel - 80) + 45;
    end

end