第二章 灰度变化
改善图像质量的方法:
图像增强(Image Enhancement):不考虑图像降质的原因,选择性增强图像中的兴趣特征、或者抑制图像中某些不需要的特征(如亮度、对比度、边缘、轮廓等),以便显示、观察或分析。
图像复原(ImageRestoration):针对降质的具体原因,设法补偿降质因素,使得改善后的图像尽可能逼近理想图像。
2.1 图像的亮度、对比度和动态范围
2.1.1 亮度
通常指图像的整体亮度。每个像素的明暗程度取决于其颜色分量或灰度值的大小,图像的整体亮度则取决于所有像素的平均值。
简单地将图像每个像素的灰度值加上一个常数,就可以改变图像整体的亮度:
g(x,y) = f(x,y) + b;
b>0,图像整体变亮;b<0,图像整体变暗;
当灰度变换函数与像素位置无关时,可以用变量r、s分别表示输入、输出图像中任一像素的灰度值
s = r + b
示例: 改变图像亮度
% 2.1.1改变图像亮度
clear;
clc;
i = imread('lena.jpg');
i1 = rgb2gray(i); % 获取灰度图像
% imshow(i1)
b=100;
g= i1 +b;
%显示结果
%figure(1),imshow(i1);title('原图像');
%figure(2),imshow(g);title('亮度改变后的图像');
figure; montage({i1,g});title('左侧为原始image|右侧为亮度改变后的图像');
需要注意的是,MATLAB中灰度图像数据多采用无符号8位整数类型(uint8),取值范围在[0,255]之间,运算时MATLAB将自动把小于0或大于255的计算结果分别限制为0或255。
2.1.2 对比度
对比度用于描述图像中不同区域、物体之间的可区分性。
对比度的高低取决于图像中明、暗区域之间的差别,即亮度的反差大小。反差越大意味着对比度越大,反差越小则对比度越小。
图像对比度的简单调整
将图像所有像素的灰度值乘以常数a,就可以简单地增加或缩小像素灰度值之间的差距,从而改变图像的对比度,即:
a>1,对比度增强;a< 1,对比度降低。
示例:改变灰度图像的对比度
% 2.1.2 改变图像对比度
clear;
clc;
i = imread('lena.jpg');
i1 = rgb2gray(i); % 获取灰度图像
% imshow(i1)
a = 0.5;
g = i1* a;
%显示结果
figure; montage({i1,g});title('左侧为原始image|右侧为对比度改变后的图像');
2.1.3 动态范围
一幅图像像素灰度值所跨越的值域,称为该图像灰度值的动态范围,像素的明暗变化被限制在这个范围内。动态范围越大,变化层次越多,图像细节的表达能力也就越强。对于8位256级灰度图像而言,图像像素灰度值最大的动态范围为[0,255]。
2.2 线性灰度变换
线性灰度变换的一般表达式: s = a*r + b
2.2.1 具有饱和处理的线性灰度变换
令rlow和rhigh表示输入图像灰度值有效动态范围的下限值和上限值,slow和shigh表示输出图像期望动态范围的下限值和上限值,利用下式可将输入图像的有效动态范围[rlow,rhigh]线性映射为[slow,shigh]
如果slow和shigh 之差 > rlow和rhigh 之差 图像动态范围扩展(对比度拉伸);
如果slow和shigh 之差 < rlow和rhigh 之差 图像动态范围压缩(对比度收缩)
如何选取?
采用百分位数(percentile)来选择rlow和rhigh,比如,选择rlow的值,使得输入图像中灰度值 ≤ rlow的像素数占图像总像素数的1%;选择rhigh的值,使得输入图像中灰度值 ≥ rhigh的像素数占图像总像素数的1%; 对于8位 256级的灰度图像,通常 slow = 0,shigh = 255。
示例:具有饱和处理的线性灰度变换
% 2.2.1 具有饱和处理的线性灰度变换
clear;
clc;
i = imread('lena.jpg');
i1 = rgb2gray(i); % 获取灰度图像
% imshow(i1)
g=imadjust(i1);%函数默认方式采用百分位数0.01选择rlow和rhigh
rlow=min(min(double(i1)))/255;%令rlow为输入图像中的最小灰度值
rhigh=max(max(double(i1)))/255;%令rhigh为输入图像中的最大灰度值
g1=imadjust(i1,[rlow;rhigh],[]);%[low_out;high_out]采用默认值
%显示处理结果
subplot(2,3,1); imshow(i1);title('原图像');
subplot(2,3,2); imshow(g);title('默认百分位数选择rlow和rhigh');
subplot(2,3,3); imshow(g1);title('采用图像最小、最大灰度值');
subplot(2,3,4); imhist(i1);title('原图像');
subplot(2,3,5); imhist(g);title('默认百分位数方式');
subplot(2,3,6); imhist(g1);title('采用图像最小、最大灰度值');
2.2.2 分段线性灰度变换
选择输入灰度值的一个区间范围[r1,r2],以及输出灰度值的一个区间范围[s1,s2],这样由(r1,s1)和(r2,s2)两个拐点,加上(0,0)、(255,255)两个定点,构造了一个三段折线变换曲线。
改变拐点(r1,s1)和(r2,s2)的位置,可以控制分段直线的斜率,就能对任意灰度区间进行扩展和压缩。
示例: 分段线性灰度变换
% 2.2.2 分段线性灰度变换
clear;
clc;
i = imread('daisy.jpg');
f = rgb2gray(i);
%设置控制点位置
r1=double(min(f(:)));r2=double(max(f(:)));
s1=40;s2=240; % 改变拐点(r1,s1)和(r2,s2)的位置,可以控制分段直线的斜率,就能对任意灰度区间进行扩展和压缩。
%调用自定义变换函数
[g,lut]=IMpwlineartransform(f,r1,s1,r2,s2);
%显示处理结果
figure;subplot(3,2,1);imshow(f);title('Original image');
subplot(3,2,2);imhist(f);title('Histogram of the Original image');
subplot(3,2,3);imshow(g);title('Processed image');
subplot(3,2,4);imhist(g);title('Histogram of the processed image');
subplot(3,2,6);plot(lut);title('The gray transform function curve');
2.2.3 连续单独或同时调整图像的亮度和对比度
s = [ r - 127.5 * ( 1 - b ) * k + 127.5 * ( 1 + b) ]
其中, k = tan( 45° + 44° * c )
% 2.2.3 连续调整图像的亮度和对比度
clear;
clc;
i = imread('lena.jpg');
f = rgb2gray(i); % 获取灰度图像
%将输入图像数据转换为double型
fd=double(f);
%降低亮度,同时提高对比度
%b<0,降低亮度;b>0,提高亮度。 参数b在区间[-1,1]内取值
%c<0,降低对比度;c>0,提高对比度。 参数c在区间[-1,1]内取值
b=-0.25;c=0.45;k=tand(45+44*c);
g=(fd-127.5.*(1-b))*k+127.5*(1+b);
g=uint8(g);%将输出图像数据类型转换为uint8型
%显示处理结果
figure;montage({f,g});title('原图像(左)|亮度降低25%对比度提高45%后的图像(右)');
2.3 非线性灰度变换
2.3.1 伽马变换
伽马变换Gamma Transformation,又称伽马校正Gamma Correction、幂次变换Power law transformation,定义为:
式中,指数 g 称伽马值,这也是被称作伽马变换的由来。为保证输入灰度值 r 和输出灰度值 s 具有相同的取值范围,变换时需先将输入灰度值 r 从[0,255]归一化到 [0,1],变换后再把输出灰度值s从 [0,1] 线性映射到 [0,255] 之间。
2.3.2 对数变换
对数变换常用于图像的动态范围压缩,能扩展低端暗区域像素灰度值的动态范围、压缩高端亮区域像素灰度值的动态范围。常用于压缩动态范围过大而不能正常显示的图像,或增强暗背景中仅有若干亮点的图像。
常用于压缩动态范围过大而不能正常显示的图像,或增强暗背景中仅有若干亮点的图像。
2.3.3 指数变换
指数变换能增强图像中亮区域的细节(对比度提高),同时弱化图像中暗区域的细节(对比度降低)。指数变换对数变换。
式中,参数k用来选择灰度变换曲线的形状,一般在略大于1附近取值。c 是一个比例因子,若输出图像采用8位无符号整数时,c 可按给定式计算,其中,rmax为输入图像 f(x,y) 的最大灰度值。
2.4 直方图
灰度直方图反映了图像中各灰度值出现的频数,根据灰度值分布的范围和均匀程度,就可以判断出该图像曝光是否合适。
频数分布表与直方图
图像直方图、动态范围、亮度、对比度
累积直方图,又称累计直方图(Cumulative histogram),用于统计图像中像素灰度值小于和等于某一灰度值r的所有像素的总和。
imhist 函数调用语法
示例 计算灰度直方图
% 2.4 灰度直方图的计算
clear;
clc;
i = imread('lena.jpg');
f = rgb2gray(i); % 获取灰度图像
%获取图像高、宽
[M,N]=size(f);
%计算并显示灰度直方图
imhist(f);
[counts,binLocations]=imhist(f);
CHist=cumsum(counts);%计算频数累积直方图
Rcounts=counts./(M*N);%直方图归一化
RCHist=cumsum(Rcounts);%计算相对频数累积直方图
%显示处理结果
figure;subplot(2,3,1);imshow(f);title('输入图像');
subplot(2,3,2);stem(binLocations,counts,'Marker','none');title('频数直方图');
subplot(2,3,3);stem(binLocations,CHist,'Marker','none');title('频数累积直方图');
subplot(2,3,4);stem(binLocations,Rcounts,'Marker','none');title('相对频数直方图');
subplot(2,3,5);stem(binLocations,RCHist,'Marker','none');title('相对频数累积直方图');
2.5 直方图均衡化
图像直方图均衡化,是指寻找一个灰度变换函数,使变换后图像的像素值占有全部的灰度级并且分布均匀,从而得到一幅灰度级丰富且动态范围大的图像。
2.5.1 直方图均衡化基本步骤
- 计算输入图像的归一化直方图:
h(r) = nr/n, r=0,1,2,...,L-1
- 计算图像的相对频数累积分布函数H®,将其作为灰度变换函数:
- 由于H®在[0,1]之间取值,因此,需将其重新量化为[0,L-1]之间的整数,得到输入r与输出s之间的映射关系,即:
Int() 表示取整 - 采用查表法对输入图像执行灰度变换。
示例 灰度图像直方图均衡化
% 2.5 灰度图像直方图均衡化
clear;
clc;
i = imread('kid.jpg');
f = rgb2gray(i); % 获取灰度图像
[g,LUT]=histeq(f);%对图像进行直方图均衡化
[histarray_old,binLocations1]=imhist(f);%计算原图像直方图
[histarray_new,binLocations2]=imhist(g);%计算均衡化后的图像直方图
%显示处理结果
figure;subplot(2,2,1);imshow(f);title('原始图像');
% 绘制原始灰度图像的直方图
subplot(2,2,2);stem(binLocations1,histarray_old,'Marker','none');title('原图像直方图');
subplot(2,2,3);imshow(g);title('处理后的图像');
% 绘制直方图均衡化后灰度图像的直方图
subplot(2,2,4);stem(binLocations2,histarray_new,'Marker','none');title('直方图均衡化后的直方图');
灰度图像直方图均衡化函数 histeq()
2.5.2 对比度受限自适应直方图均衡化CLAHE
实际应用中,常常需要增强图像中某些局部区域细节,为此提出了自适应直方图均衡化方法(AHE,AdaptiveHistogramEqualization),对每个像素基于其大小为 m×n 邻域图块的灰度直方图进行均衡化,或把图像被划分为若干个大小相等的矩形网格图块,并对图块分别进行直方图均衡化。
% 2.5 对比度受限自适应直方图均衡化CLAHE
clear;
clc;
i = imread('drops.jpg');
f = rgb2gray(i); % 获取灰度图像
[g,LUT]=histeq(f);%对图像进行直方图均衡化
%对比度受限自适应直方图均衡化CLAHE
G =adapthisteq(f,'clipLimit',0.03);
[histarray_old,binLocations1]=imhist(f);%计算原图像直方图
[histarray_new1,binLocations2]=imhist(g);%计算均衡化后的图像直方图
[histarray_new2,binLocations3]=imhist(G);%计算均自适应直方图均衡化的图像直方图
%显示处理结果
figure;subplot(3,2,1);imshow(f);title('原始图像');
% 绘制原始灰度图像的直方图
subplot(3,2,2);stem(binLocations1,histarray_old,'Marker','none');title('原图像直方图');
subplot(3,2,3);imshow(g);title('直方图均衡化');
% 绘制直方图均衡化后灰度图像的直方图
subplot(3,2,4);stem(binLocations2,histarray_new1,'Marker','none');title('直方图均衡化后的直方图');
subplot(3,2,5);imshow(G);title('自适应直方图均衡化');
% 绘制直方图均衡化后灰度图像的直方图
subplot(3,2,6);stem(binLocations3,histarray_new2,'Marker','none');title('自适应直方图均衡化的直方图');
2.6 直方图匹配
直方图匹配,目的是寻找一个灰度变换函数,使得处理之后图像的直方图,与指定的灰度直方图相同(相匹配)。由于灰度直方图为离散量,这种匹配只是一种近似。
灰度图像直方图匹配函数 imhistmatch()
示例:直方图匹配 histeq()
% 2.6 直方图匹配 histeq
clear;
clc;
i = imread('man.jpg');
f = rgb2gray(i); % 获取灰度图像
i1 = imread('kid.jpg');
ref = rgb2gray(i1); % 获取参考image灰度图像
[hgram,binloc]=imhist(ref,64);
g=histeq(f,hgram);
%显示处理结果
figure;
subplot(2,3,1);imshow(f);title('待匹配图像');
subplot(2,3,2);imshow(g);title('待匹配图像64分组匹配');
subplot(2,3,3);imshow(ref);title('参考图像');
subplot(2,3,4);imhist(f,64);title('待匹配图像的直方图');
subplot(2,3,5);imhist(g,64);title('匹配结果图像直方图');
subplot(2,3,6);imhist(ref,64);title('参考图像直方图');
2.7 Matlab 常用的灰度变换函数