数字图像处理笔记-02(图像空域增强技术及联合应用)
(一) 图像增强
1.1 基本概念
由于图像在传输或处理过程中会引入噪声或模糊图像,从而降低图像质量,甚至淹没特殊图像 征,给分析带来了困难。 因此,图像增强是为了突出图像中的某些信息,同时削弱或删除某些不需要的信息 以获得视觉效果更好或更有用的图像技术为特定应用。
图像增强的基本方法有:
- 空间域处理:直接处理图像素 如:
- 点处理(图像灰度变换);
- 平衡直方图;
- 领域处理(线性、非线性平滑和锐化)
- 频域处理 :修改图像的傅里叶变换 如:高、低通滤波、同态滤波等
1.2 空间域处理
空间域方法是直接操作像素的过程,定义:g(x,y)=T[f(x,y)] T 是对 f 其定义是一种操作(x,y)邻域。邻域可为正方形、矩形和圆形,称为模板处理或滤波。邻域为单像素,称为点操作,如亮度调节、对比度拉伸、灰度级切片等。 为了简单起见,令 r 和 s 所定义的变量 , 分别是 f ( x,y ) 和 g ( x,y ) 在任意点 ( x,y ) 的灰度级, 则 T 以灰度级变换函数的形式操作:s = T ( r );
(二)基本灰度变化
2.1 灰度反转: s =L -1- r
这样反转图像的强度,可以产生图像反转的对等图像; 用途:反转变换适用于增强嵌入图像暗色区域的白色或灰色细节 , 尤其是黑面积占主导地位的时候。
2.2 对数变换
表达式为: s = c log( 1 r ); c 假设是常数 r ≥0将窄带低灰度输入图像值映射为宽带输出值,扩大低灰度范围,压缩高灰度范围 功能:扩展暗部分,抑制亮部分。 用途:可用于扩展图像中的暗像素;
2.3 幂次变换
表达式为:s=c*r^γ(其中 c 和γ为正常数) 在幂次曲线中γ该值决定是将输入窄带暗值映射到宽带输出值,还是将输入窄带亮值映射到宽带输出值。 其中 c 和 γ 是正常数。法律方程中的指数称为伽马(γ),这些幂律响应现象的处理称为伽马校正。 有时会考虑偏移量(即输入为 0 可测量输出),公式也可以写为 s = c(r ε)γ ①当γ<1 当变换拉伸低灰度值(暗值),提高灰度级,使图像变亮 ②当γ>1 当变化拉伸高灰度值(亮值)时,降低灰度级,使图像变暗 用途:幂次变换用于对比度增强
2.4 分段线性变换函数
例如:对比度拉伸 由于照明不足、成像传感器动态范围小或镜头光圈设置错误, 对比度拉伸可以扩展图像灰度级的动态范围。
(三)直方图处理
- 直方图: h(rk ) = nk 其中:rk∈[0=L-1]–灰度级;nk灰度级为 rk 像素数;
- 归一化直方图: pr (rk)为原始图像;
3.1 均衡处理直方图
通过改变图像的直方图,改变图像中各像素的灰色,是一种简单有效的图像增强技术 度主要用于增强动态范围较小的图像对比度。原始图像可能集中在较窄的范围内,因为其灰度分布 图像不够清晰。 例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在高亮度范围内 低亮度范围内。通过直方图的平衡,原始图像的直方图可以转换为均匀分布(平衡)的形式,从而实现 增加像素之间灰度值差的动态范围,从而增强图像的整体对比度。 换句话说,直方图平衡的基本原理是拓宽图像中大量像素的灰度值(即对图像起主要作用的灰度值) 数量少的灰度值(即画面不起主要作用的灰度值)合并,从而增加对比度,使图像清晰,增加 强 的 目 的 。 举 个 例 子 , 如 图 1 所 示 , 左 图 为 原 始 图 像 , 右 图 为 直 方 图 均 衡 化 后 的 图 像 。
3.1.1 直方图的概念
对于灰度图像,其直方图反映了图像中不同灰度级的统计。图 2 给出直方图 示例,其中图(a)灰度直方图可以表示为图像(b),横轴表示图像的灰度级,纵轴表示图像 各灰度级像素的数量。(需要注意的是,灰度直方图表示图像中每个单独的灰度分布,图像对 比例取决于相邻近像素之间的灰度级关系。) 在 MATLAB 函数可用于中间 imhist()计算灰度图像的直方图。让我们计算下图 1 中左图灰度直 方图,结果如图 3 所示。
I = imread('pout.tif'); figure; subplot(121), imshow(I); subplot(122), imhist(I); axis([0, 256, 0, 4000]);
我们以图 1 以中左图为例,计算其归一化的直方图,如图所示 4 所示。
I = imread('pout.tif'); N = numel(I); % 图像像素总数 Pr =(I) / N;
k = 0 : 255;
3.1.1 MATLAB 上实现直方图均衡化
在 MATLAB 中提供了现成的函数 histeq()来实现灰度图像的直方图均衡化,如下例所示:
close all;
clear;
clc;
I = imread('pout.tif');
J = histeq(I,256);
imshowpair(I,J,'montage');
3.1.3 直方图均衡化的缺点
如果一幅图像整体偏暗或者偏亮,那么直方图均衡化的方法很适用。但直方图均衡化是一种全局处 理方式,它对处理的数据不加选择,可能会增加背景干扰信息的对比度并且降低有用信号的对比度(如 果图像某些区域对比度很好,而另一些区域对比度不好,那采用直方图均衡化就不一定适用)。 此外,均衡化后图像的灰度级减少,某些细节将会消失;某些图像(如直方图有高峰),经过均衡 化后对比度不自然的过分增强。针对直方图均衡化的缺点,已经有局部的直方图均衡化方法出现。
(四)领域处理
4.1 空间域滤波基础
空间域图像增强是基于图像中每个小范围(邻域)内的像素进行灰度变换运算,某个点变换之后的 灰度由该点邻域之内的那些点的灰度值共同决定,因此空间域增强也称为邻域运算或邻域滤波。 (1)图像的平滑、锐化都是利用掩模操作来完成的。通过掩模操作实现一种邻域运算,待处理像 素点的结果由邻域的图像像素以及相应的与邻域有相同维数的子图像得到。这些子图像被称为滤波器、 掩模、核、模板或窗口; (2)掩模运算的数学含义是卷积(或互相关)运算; (3)掩模子图像中的值是系数值,而不是灰度值;
4.1.1 空间域滤波
(1)滤波:是信号处理中的一个概念,是将信号中特定波段频率滤除的操作,在数字信号处理中 通常通过傅里叶变换及其逆变换实现。 (2)边界处理:执行滤波操作要注意的一点是当模板位于图像边缘时,会产生模板的某个元素很 可能位于图像之外的情况,这时对于在边缘附近执行滤波操作需要单独处理,以避免引用到不属于图像 的无意义的值。 (3)解决边界问题的方法: ①收缩处理范围:处理时忽略位于图像 f 边界附近会引起问题的那些点; ②使用常数填充图像:根据模板形状为图像 f 虚拟出边界,虚拟边界像素值为指定的常数,如 0, 得到虚拟图像 f1,保证模板在移动过程中始终不会超过 f1 边界; ③使用复制像素的方法填充图像:和(2)基本相同,只是用来填充虚拟边界像素值的不是固定的 常数,而是复制图像 f 本身边界的模式。
4.1.2 滤波函数
(1)imfilter()原型如下
- f 是要进行滤波操作的图像 w 时滤波操作所使用的模板,为一个二维数组 ;
- option1,option2,…是可选项,具体可以包括以下内容:边界选项、尺寸选项、模式选项 Matlab 实现:
f=imread('pout.tif');%读入图像
imshow(f); w=[1 1 1;1 1 1;1 1 1]/9 %滤波模板
g=imfilter(f,w,'corr','replicate');%滤波
figure,imshow(g);
(2)二维滤波器 fsspecial()原型如下: ** h=fspecial(type,parameters)**
- type:指定了滤波器的类型 可选输入 parameters:是和所选定的滤波器类型 type 相关的配置参数,如尺寸和标准差等,如果不 提供则函数使用该类型的默认参数配置 返回时 h:为特定的滤波器
4.2 图像平滑
4.2.1 平滑线性滤波器
定义:图像平滑是一种可以减少和抑制图像噪声的使用数字图像处理技术,在空间域中一般可以采 用邻域平均来达到平滑的目的。 原理:用包含在滤波掩模邻域内的像素的平均灰度值去代替每个像素点的值。又叫:均值滤波器 matlab 实现
I=imread('D:\matlab r2019a\bin\数字图像处理 matlab 版\MATLAB 课本各章图片(冈萨雷 斯)\dipum_images_ch04\Fig0413(a)(original_test_pattern).tif'); figure,subplot(141);imshow(I);title('原图')%原图
h=fspecial('average',3);%3x3 平均模板
I3=imfilter(I,h,'corr','replicate');%相关滤波,重复填充边界
subplot(142),imshow(I3);title('3x3 平均滤波后图像')
h=fspecial('average',5)%5x5 平均模板
I5=imfilter(I,h,'corr','replicate');
subplot(143),imshow(I5);title('5x5 平均滤波后图像')
h=fspecial('average',7);%7x7 平均模板
I7=imfilter(I,h,'corr','replicate');
subplot(144),imshow(I7);title('7x7 平均滤波后图像 ')
4.2.2 高斯平滑
- :平均平滑对于邻域内的像素一视同仁,为了减少平滑处理过程中的模糊,得到更自 然的平滑效果,很自然的想到适当加大模板中心点的权重,随着距离中心点的距离增大,权重迅速减小, 从而可以确保中心点看起来更接近于与它距离更近的点,基于这样的考虑得到的模板即为高斯模板。 matlab 实现:
I=imread('baby_noise.bmp');
subplot(2,3,1),imshow(I),title('原图像');
h3_5=fspecial('gaussian',3,0.5);%sigma=0.5 的 3x3 高斯模板
I3_5=imfilter(I,h3_5);
subplot(2,3,2),imshow(I3_5),title('3x0.5');
h3_8=fspecial('gaussian',3,0.8);%sigma=0.8 的 3x3 高斯模板
I3_8=imfilter(I,h3_8);
subplot(2,3,3),imshow(I3_8),title('3x0.8');
h3_18=fspecial('gaussian',3,1.8);%sigma=1.8 的 3x3 高斯模板,接近于平均模板
I3_18=imfilter(I,h3_18);
subplot(2,3,4),imshow(I3_18),title('3x1.8');
h5_8=fspecial('gaussian',5,0.8);%sigma=0.8 的 3x3 高斯模板
I5_8=imfilter(I,h5_8);
subplot(2,3,5),imshow(I3_8),title('5x0.8');
imwrite(I5_8,'baby5_8.bmp');
h7_12=fspecial('gaussian',7,1.2);%sigma=0.8 的 3x3 高斯模板
I7_12=imfilter(I,h7_12);
subplot(2,3,6),imshow(I7_12),title('7x1.2');
imwrite(I7_12,'baby7_12.bmp');
4.3 中值滤波
-
:中值滤波本质上是一种统计排序滤波器。中值是指排序队列中位于中间位置的元素的值
-
:使拥有不同灰度的点看起来更接近于它的邻近值。
-
: 中值滤波对于某些类型的随机噪声具有非常理想的降噪能力,能够有效去除脉冲噪声:以黑白点叠 加在图像上;对于线性平滑滤波而言,在处理的像素邻域之类包含噪声点时,噪声的存在总会或多 或少影响该点像素值的计算(对于高斯平滑,影响程度同噪声点到中心点的距离成正比),但在中值滤波中,噪声点则常常是直接被忽略掉的,在去除噪音的同时,可以比较好地保留边的锐度和图像的细节 (优于均值滤波器);而且同线性平滑滤波器相比,中值滤波在降噪的同时引起的模糊效应较低。中值 滤波的一种典型应用是消除椒盐噪声。
-
:先将掩模内欲求的像素及其领域的像素值排序(升序或降序),确定出中值,并将中值赋予该像素点。
-
①图片加噪声 J=imnoise(I,type,parameters) type:噪声类型 ②中值滤波原型: I2=medfilt2(I1,[m,n]) I1 是原图矩阵 m 和 n 是中值滤波处理的模板大小,默认 3x3 输出 I2 是中值滤波后的图像矩阵 matlab 实现:
I=imread('D:\matlab r2019a\bin\数字图像处理 matlab 版\MATLAB 课本各章图片(冈萨雷 斯)\dipum_images_ch05\girl.jpg');
subplot(2,3,1),imshow(I),title('原图像');
I = rgb2gray(I);
subplot(2,3,2),imshow(I),title('灰度图');
J=imnoise(I,'salt & pepper'); %为图像叠加椒盐噪声
subplot(2,3,3),imshow(J),title('原图像叠加椒盐噪声');
w=[1 2 1;2 4 2;1 2 1]/9;
J1=imfilter(J,w,'corr','replicate');%高斯平滑
subplot(2,3,4),imshow(J1),title('高斯平滑');
w=[1 1 1;1 1 1;1 1 1]/9;
J2=imfilter(J,w,'corr','replicate');%平均平滑
subplot(2,3,5),imshow(J2),title('平均平滑');
J3=medfilt2(J,[3,3]);%中值滤波
subplot(2,3,6),imshow(J3),title('中值滤波');
4.4 空间锐化滤波器
锐化处理的目的:是突出图像中的细节或者增强被模糊了的细节。 锐化处理可以用空间微分来完成. 微分算子的响应强度与图像在该点的突变程度有关,图像微分增强了边缘和其他突变(如噪声)而消弱了灰度变化缓慢的区域。我们最感兴趣的是微分算子在①恒定灰度 区域(平坦段)、②突变的开头与结尾(阶梯与斜坡突变)以及③沿着灰度级斜坡处的特性 (1)对于一阶微分必须保证: 平坦段微分值为零 在灰度阶梯或斜坡的起点处微分值非零 沿着斜坡面微分值非零 ; (2)对于二阶微分必须保证: 在平坦区微分值为零 在灰度阶梯或斜坡的起始点处微分值非零 沿着斜坡面微分值为零。
: (1)一阶微分处理通常会产生较宽的边缘 ; (2)二阶微分处理对细节有较强的响应,如细线和孤立点 ; (3)一阶微分处理一般对灰度阶梯有较强的响应; (4)二阶微分处理对灰度级阶梯变化产生双响应 ; (5)二阶微分在图像中灰度值变化相似时,对线的响应要比对阶梯强,且点比线强.。 大多数应用中,对图像增强来说,二阶微分处理比一阶微分好,因为形成细节的能力强.。而一阶微分处理主要用于提取边缘。
4.4.1 基于一阶微分的图像增强—— 梯度算子(图像锐化)
(1)Prewitt 梯度算子: (2)Sobel 梯度算子: 使用权重 2 的目的:突出中心点的作用以达到平滑的目的 (3)Robert 交叉梯度算子: 微分掩模的所有系数之和为 0 保证了灰度恒定区域的响应为 0(微分算子要求的)
梯度算子经常用于工业检测、辅助人工检测缺陷,或者是更为通用的自动检测的预处理。 Robert 交叉梯度图像锐化 matlab 实现
I=imread('D:\matlab r2019a\bin\数字图像处理 matlab 版\MATLAB 课本各章图片(冈萨雷斯)\dipum_images_ch05\rice.tif');
subplot(2,2,1),imshow(I),title('原图像');
I=double(I);%转换为 double 型,这样可以保存负值,否则 unite8 型会把负值截掉
w1=[-1 0;0 1];
w2=[0 -1;1 0];
G1=imfilter(I,w1,'corr','replicate');
G2=imfilter(I,w2,'corr','replicate');
G=abs(G1)+abs(G2);%计算 Robert 梯度
subplot(2,2,2),imshow(G,[]),title('Robert 交叉梯度图像');
subplot(2,2,3),imshow(abs(G1),[]),title('w1 滤波后取绝对值并重新标定');
subplot(2,2,4),imshow(abs(G2),[]),title('w2 滤波后取绝对值并重新标定');
4.4.2基于二阶微分的图像增强——拉普拉斯算子
拉普拉斯微分算子强调图像中灰度的突变,弱化灰度慢变化的区域。这将产生一幅把浅灰色边线、突变点叠加到暗背景中的图像。
将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息。因此拉普拉斯算子用于图像增强的基本方法如下: MATLAB 实现
f=imread('moon.tif');
w4=fspecial('laplacian',0)
w8=[1 1 1;1 -8 1;1 1 1]
f=im2double(f);
g=imfilter(f,w4,'replicate');%未标定拉普拉斯算子滤波;
figure(1),imshow(g);
g4=f-g;%原图加上拉普拉斯变换过的图,因为拉普拉斯运算中心是负号;
g8=f-imfilter(f,w8,'replicate');% 标定拉普拉斯算子滤波 ;
figure(2),imshow(f);
figure(3),imshow(g4);
figure(4),imshow(g8):
拉普拉斯算子对于接近水平和接近竖直方向的边缘都有很好的增强,从而也就避免读者在使用梯度算子时要进行两次滤波的麻烦。
4.5高提升滤波及其实现
:无论基于一阶微分的 Robert、sobel 模板还是基于二阶微分的拉普拉斯模板,其中各系数和均为零。这说明算子在灰度恒定区域的响应为 0,即在锐化处理后的图像中,原图像的平滑区域近乎于黑色,而原图中所有的边缘、细节和灰度跳变点都作为黑色背景中高灰度部分突出显示。在基于锐化的图像增强中常常希望在增强边缘和细节的同时仍然保留原图像中的信息,而不是将平滑区域的信息丢失。因此可以把原图像加上锐化后的图像得到比较理想的结果。
:具有正的中心系数和具有负的中心系数的模板之间的差别,对于中心系数为负的模板,要达到上述的增强效果,显然应当让原图像 f(i,j)减去锐化算子直接处理后的图像。为正的模板就加。
4.6高斯——拉普拉斯变换
matlab 实现:
I=imread('baby.bmp');
subplot(2,2,1),imshow(I),title('原图像');
Id=double(I);
h_lap=[-1 -1 -1;-1 8 -1;-1 -1 -1]%拉普拉斯算子
I_lap=imfilter(Id,h_lap,'corr','replicate');
subplot(2,2,2),imshow(uint8(abs(I_lap)),[]),title('Laplacian 锐化图像,噪声较明显');%取绝对值,并将255 以上的响应截断
h_log=fspecial('log',5,0.5);%大小为 5,sigma 为 0.5 的 LoG 算子I_log=imfilter(Id,h_log,'corr','replicate');
subplot(2,2,3),imshow(uint8(abs(I_log)),[]),title('经 LoG 处理后的图像,sigma=0.5');
h_log=fspecial('log',5,2);
I_log=imfilter(Id,h_log,'corr','replicate');
subplot(2,2,4),imshow(uint8(abs(I_log)),[]),title('经 LoG 处理后的图像,sigma=2');
(五)将下列图,运用综合的图像的空间域增强进行增强,以方便医生观察骨骼情况
观原图像是人体骨骼核扫描图像,我们的目的是通过图像锐化突出骨骼的更多细节来增强图像。由于图像灰度的动态范围很窄并且有很高的噪声内容,所以很难对其进行增强。 对此我们采取的策略是,首先用拉普拉斯法突出图像中的小细节,然后用梯度法突出其边。平滑过的梯度图像将用于掩蔽拉普拉斯图像。最后,我们将试图试用灰度变换来增强图像的灰度动态范围。
%骨骼图像增强 clear all;clc; im=imread('D:\matlab r2019a\bin\数字图像处理matlab 版\MATLAB 课本各章图片(冈萨雷斯)\dipum_images_ch03\Fig0306(a)(bone-scan-GE).tif'); im=im2double(im); %---原始图像 subplot(2,4,1); imshow(im); title('1:原始图像'); %---为图 2,使用模板为[-1,-1,-1;-1,8,-1;-1,-1,-1]的滤波器对原图像进行拉普拉斯操作,为了便于显示,对图像进行了标定,这一步先对图像进行初步的锐化滤波。 subplot(2,4,2); h=[-1,-1,-1;-1,8,-1;-1,-1,-1]; im1=imfilter(im,h); imshow(im1); title('2:拉普拉斯操作后图像'); %---图 3,由于使用的模板如上,让常数 c=1,简单的将原图和图 2 相加就可以得到一幅经过锐化过的图像。 subplot(2,4,3); im2=im+im1; imshow(im2) title('3:1 图和 2 图相加后图像'); %---图 4,对原图像试用 Sobel 梯度操作,分量gx 为[-1,-2,-1;0,0,0;1,