图像处理作业ch3.2

Posted by Yoking on March 28, 2020

图像处理第二章作业

题目

  • 请仿真实现图像的直方图均衡化处理

实验代码、结果及其分析

1.直方图均衡化

代码

clear;
X = imread('image1.jpg');
X = rgb2gray(X);
[m,n] = size(X);
total = m * n;
subplot(2,2,1)
X0 = 0.5 * X;
imshow(uint8(X0))
subplot(2,2,2)
imhist(uint8(X0)); % 由于上一次作业已经实现过手动画灰度图并且效果与调用函数一致
          % 因此这次作业直接调用函数,使代码尽量简洁
title('原图(已经降低了对比度)')
myhist = [];
for i = 0:255
    myhist = [myhist;length(find(X0 == i))];% 手动构造一个灰度直方图的向量
end
for i = 2:256
    myhist(i) = myhist(i-1) + myhist(i);
end
myhist = myhist ./ total; % 归一化
% 从直方图还原回图片
X1 = zeros(m,n);
for i = 0:255
    [row,col] = find(X0 == i);% 找到对应灰度的所有像素位置
    for j = 1:length(row)
        X1(row(j),col(j)) = round(myhist(i+1)*255);% 重新给这些像素赋予新的灰度值
    end
end
subplot(2,2,3)
imshow(uint8(X1))
subplot(2,2,4)
imhist(uint8(X1)); % 由于上一次作业已经实现过手动画灰度图并且效果与调用函数一致
          % 因此这次作业直接调用函数,使代码尽量简洁
title('均衡化后')

结果

untitled.jpg

分析

承接上一次实验,这次在自己构造了一个灰度直方图的前提下,由直方图均衡的概念,把这些概率逐个累加,并重新分布到原来对应灰度级的位置上,为了能突出直方图均衡的效果,笔者先对原图做了一个乘0.5的线性变换,把对比度降低,之后再进行直方图均衡化处理,可以从直方图和处理后的图片中看出,图片的灰度范围确实被均衡化到了一个较大的范围,有效的提高了图片的对比度,使图片展示效果更佳。但是可以看出它处理后的效果与原图(未降低对比度前)仍有一定区别,整体颜色会偏深,也就是灰度偏高一些,而从灰度直方图上也可以看到整体灰度略不平坦,确实灰度偏高的像素数量较多。

总结和感想

承接上一次实验完成了对灰度直方图均衡的手写函数,成功把一个对比度较低,灰度范围较小的图片灰度展开为一个对比度较高的图片,可以看到效果较好,但是图片仍有瑕疵,灰度图不平坦,所以也就引出我们在一些情况下需要灰度直方图规方化的技术手段。