图像对⽐度增强算法
⼀、全局对⽐度增强
1. 直⽅图均衡化 Histogram Equalization
a. 基本思想
对于图像中的灰度点做映射,使得整体图像的灰度⼤致符合均匀分布。增强图像的对⽐度。
- 对于灰度值连续的情况,使⽤灰度的累积分布函数CDF做转换函数,可以使得输出图像的灰度符合均匀分布。
- 对于灰度值不连续的情况,存在舍⼊误差,得到的灰度分布⼤致符合均匀分布。
- 直观地理解,如果某⼀个灰度范围(如200-201)的像素点很少,那么它的概率密度值就会很⼩,所以CDF在200-201附近的增长变化就会很⼩;反之,如果某⼀个灰度范围(如100-101)的像素点很多,CDF在100-101附近的增长变化会很⼤。总体来看,以灰度为横轴,CDF为纵轴画曲线。这种向上凸的曲线,很像gamma变换: 中的情形。将灰度集中的部分拉伸,⽽将灰度不集中的部分压缩,达到提⾼对⽐度的效果。
- 直⽅图均衡可以看做⾃适应的gamma变换或者分段变换。前者的优势在于,不需要指定任何参数,所有运算都是基于图像本⾝的。b. 算法
根据图像灰度计算灰度概率密度函数
计算累积概率分布函数
将归⼀化到原图灰度取值范围,如[0,255]。
之后四舍五⼊取整,得到灰度转换函数
将作为转换函数,将灰度为的点转换为灰度
c. matlab实验
代码:
%% 直⽅图均衡
clear all;clc;close all;
ImgFile='E:\图像处理\冈萨雷斯图⽚库\DIP3E_Original_Images_CH03\Fig0310(b)(washed_out_pollen_image).tif';
ImgIn=imread(ImgFile);
ImgHistEq=histeq(ImgIn,256);
figure;subplot(121);imshow(uint8(ImgIn));title('原图');
subplot(122);imshow(ImgHistEq);title('全局灰度增强 - 直⽅图均衡');
figure;subplot(121);imhist(ImgIn,256);
axis([0 255 0 1e5]);title('原图的直⽅图');
subplot(122);imhist(ImgHistEq,256);axis([0 255 0 1e5]);title('直⽅图均衡化后的直⽅图');
% ⾃定义直⽅图均衡
[counts,x]=imhist(ImgIn,256);
cum_counts=cumsum(counts);
cum_counts=uint8(cum_counts/max(cum_counts)*255);% 转化函数
figure;plot(x,cum_counts);axis([0 255 0 255]);
xlabel('原图灰度');ylabel('转换后灰度');title('原图CDF转化的灰度映射函数');
ImgOut=nan(size(ImgIn));
for i=1:length(x)
ImgOut(ImgIn==x(i))=cum_counts(i);
end
ImgOut=uint8(ImgOut);
figure;imshow(uint8(ImgOut));title('⾃定义直⽅图均衡')
figure;imhist(ImgOut,256);axis([0 255 0 1e5]);title('⾃定义直⽅图均衡的直⽅图')
输出:
图1. 原图和均衡化后的图。均衡后图像对⽐度明显增强,纹理和边缘更加清晰。
图2. 原图和均衡化后的图的直⽅图。原图灰度分布在很狭窄的区间约[90,140]内。均衡化后灰度较为均匀的分布在整个[0, 255]区间内。
图3. 原图CDF归⼀化到[0, 255]后作为灰度变换函数。为了⽅便显⽰,画成连续曲线。
图4. ⾃定义均衡的直⽅图。和Matlab⾃带histeq输出基本⼀致。
2. 直⽅图匹配 Histogram Matching
a. 基本思想
我的理解:
对于图像中的灰度点做映射,使得整体图像的灰度⼤致符合给定的分布。
想要图像的直⽅图Hs和期望直⽅图Hd相同, 那么⼆者的CDF也是相同的.
也就是说, 对于某⼀个灰度x, CDFs(x)=CDFd(x). 所以, 如果CDFs(x)=CDFd(y). 那么我们令x=y.
也就是将原图的x灰度映射为y灰度. 相当于将图像直⽅图的横轴做了⼀个点对点的缩放操作.
这个缩放操作的结果就是图像直⽅图向理想直⽅图靠近.
在缩放过程中, 如果图像的直⽅图某⼀段灰度区间被拉长了, 因为灰度都是整数, 所以直⽅图的bin会变得稀疏.
所以,
最终的直⽅图匹配的结果就是直⽅图的bin变得稀疏了. 有的灰度区间没有灰度点.
对于某些图像,灰度分布过于不均衡,例如背景很⼤且均匀。直接做直⽅图均衡会把前景“洗⽩”,效果很差。直⽅图匹配需要设定⼀个直⽅图分布。不同的图像,此分布可能不同。
b. 算法
根据图像计算概率密度分布;
根据计算累计分布函数;
根据给定的⽬标分布计算累计分布函数;
对于每⼀个,到⼀个,使得约等于;
将原图中灰度为的点变为灰度;
c. Matlab实验
输出:
图5. 原图和直⽅图
图6. 直⽅图均衡后图像及直⽅图
clear all;clc;close all;
ImgFile='E:\图像处理\冈萨雷斯图⽚库\DIP3E_Original_Images_CH03\Fig0323(a)(mars_moon_phobos).tif';ImgIn=imread(ImgFile);
figure;subplot(121);imshow(ImgIn);title('原图')
subplot(122);imhist(ImgIn);title('原图Hist')
% histeq
ImgHistEq=histeq(ImgIn);
figure;subplot(121);imshow(ImgHistEq);title('Hist EQ');
subplot(122);imhist(ImgHistEq,256);title('Hist EQ')matlab直方图
% 根据3.35(a)估计的分布
x=[0 8 16 180 200 255];
Y=[0 70000 8000 0 3139 0];
xi=0:255;
yi = interp1q(x',Y',xi');
figure;plot(xi,yi,'.');title('⽬标 Hist')
ImgHistMatch = histeq(ImgIn, yi);
figure;subplot(121);imshow(ImgHistMatch);title('histeq 匹配')
subplot(122);imhist(ImgHistMatch,256);title('histeq 匹配直⽅图')
图7. ⽬标直⽅图
图8. 直⽅图匹配图像和直⽅图⾃定义直⽅图匹配
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论