图像增强

图像增强–亮度变换和直方图

定义

图像增强是指按照特定的需要突出一幅图像中的某些信息,同时,削弱或者去除不需要信息的处理方法

图像增强方法

空域方法(基于像素的点处理,灰度级变换,寻找一个合适的变换T;基于模版的空域滤波,空域过滤器,寻找一个合适的模版),频域方法

图像亮度变换

点运算的定义

g(x,y) = T[f(x,y)] 这里是一个灰度到灰度到映射过程,这个函数称为灰度变换函数

比如我们使用线性变换,则可以增大他的对比度,改变图像所占据的灰度值范围

如果我们使用非线性变换,则我们可能实现图像的部分加亮,减暗,也就是可能突出我们想要的部分

线性点运算

如果a>1,那么就导致输出图像的对比度增大(灰度扩展)

如果0<a<1,输出图像的对比度减小(灰度压缩)

如果斜率为-1就是反相

分段线性点运算

可以将感兴趣的灰度范围线性扩展,抑制不感兴趣的灰度区域

效果如图:

图像亮度变换的程序

1
2
3
4
I = imread('pout.tif');
k1 = imadjust(I);
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(k1);

结果呈现

增加参数

增加参数[low_in,high_in] [low_out,high_out]。把所有小于low_in的映射为low_out,把大于high_in 的映射为high_out

增加参数gamma,如果gamma小于1,就是图像变亮,等于1不变,大于1变暗

灰度直方图

是一种反应一幅图像中的灰度级与出现这只灰度概率的图形

灰度直方图只反映不同灰度值出现的次数,未反映某一灰度值像素所在的位置。也就是只包含了该图像中某一灰度值的像素出现的概率,丢失了位置信息

不同的图像,可能有相同的直方图

可以用于判断图像的质量如果一幅图像用了所有的灰度级,那么这个图像的质量较好,否则等于增加了量化间隔,丢失的信息无法恢复

灰度直方图所用函数

Imhist()

直方图均衡化

针对动态范围小的图像,我们将直方图变为均匀分布的形式,

步骤一:求灰度直方图

当图像在[0,L-1]范围内量化时,计算每个像素值出现的次数,h是一个L维向量

步骤二:计算每种灰度出现的概率

先求出图像f总体像素的个数,计算每个灰度级像素在整个图像中所占的百分比

步骤三:计算灰度级的累计分布

也就是向量从上到下算概率的前缀和,最后一个必然是1

步骤四:计算新图像的灰度值

利用转换函数计算新图像的灰度值

直方图均衡化实质上是减少图像的灰度级来换取对比度的加大(动态范围增大),imhist和histeq只能用于灰度或者二值图像

对比度增加函数:histeq()

图像增强–空间滤波

空间域滤波是基于领域处理的增强方法,它应用某一模版对每个像素与其周围邻域的所有像素进行某种数学运算得到该像素的新的灰度值,新的灰度值的大小不仅与该像素的灰度值有关,而且还与其邻域内的像素的灰度值有关。

空域滤波器

模版本身称为空域滤波器,可以看成尺寸nxn的小图像,一般n为奇数,常用3x3

我们就是在待处理的图像中逐点地移动模版,对每个(x,y)点,滤波器在该点的响应通过事先定义的关系来计算

可以分为

1、平滑滤波器:用于模糊处理和减少噪声。有线性平滑滤波器,中值滤波器

2、锐化滤波器:使边缘和轮廓线模糊的图像变清晰,使细节更清晰。梯度算子法,拉普拉斯算子法

平滑滤波

如果图像产生毛糙,就要对其进行平滑处理

邻域平均法(均值滤波)

是一种简单的处理方法,使用领域像素灰度的平均来代替原来的,实现图像的平滑

邻域可以选择4邻域和8邻域。注意,运算时也包含本身,如下所示

平滑滤波器的大小越大,越模糊,因为两个相邻像素点越接近;越小,去噪效果不好,如下:

中值滤波

是用一个有奇数点的滑动窗口,将窗口中心点的值用窗口各点的中值代替,步骤

1、将模版在图中漫游,并将模版中心与图中莫哥像素的位置重合

2、读取模版下各对应像素的灰度值

3、从小到大,找中间的赋给模版中心

优点:克服细节模糊问题,可以有效过滤脉冲干扰和图像扫描噪声

缺点:对高斯噪声的效果不是很好

最大值滤波

用于寻找最亮点

最小值滤波

找最暗点

图像噪声

图像噪声可以理解为“妨碍人们感觉器官对所接收的信源信息理解的因素。”而图像中各种妨碍人们对其信息接受的因素即可称为图像噪声。

图像的加噪

使用函数imnoise,范例如下:

1
2
3
4
I = imread('/Users/roarboil/Desktop/1.jpg');
n = imnoise(I,'gaussian');
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(n);

这里的可选参数除了gaussian还有poisson,salt&pepper,speckle等

高斯噪声还有可选参数,均值,方差,椒盐噪声还有浓度,如下

1
2
3
4
5
6
I = imread('/Users/roarboil/Desktop/1.jpg');
n1 = imnoise(I,'gaussian',0,0.05);
n2 = imnoise(I,'salt & pepper',0.1);
subplot(1,3,1);imshow(I);
subplot(1,3,2);imshow(n1);
subplot(1,3,3);imshow(n2);

效果如下

图像去噪

使用fspecial生成模版函数,可选type参数包括如下

不同的type之后的参数会有不同,如:

均值模版,只有一个HSIZE,表示大小

高斯模版,有HSIZE和SIGMA

在生成了模版之后就用筛选函数 imfilter,见下

图像的边界处理

默认情况下直接补0,见下

由于可能会变大,还有same和full来设置图像大小

滤波类型默认为corr,也可以设置成conv,也就是卷积。由于大部分对称,所以结果一样

注意: 如果运算时超过255会直接被截断,为了解决这个问题可以采用im2double来先转换为double型

一些实例

均值滤波去噪

1
2
3
4
5
6
7
8
9
I = imread('/Users/roarboil/Desktop/1.jpg');
n1 = imnoise(I,'gaussian',0,0.05);
w = fspecial('average',3);
%w = [1 1 1; 1 1 1; 1 1 1]/9;
k = imfilter(n1,w);

subplot(1,3,1);imshow(I);
subplot(1,3,2);imshow(n1);
subplot(1,3,3);imshow(k);

注意这里使用了两种方法来构建滤波器,一种是使用之前介绍的fspecial函数,另一种是直接构造矩阵,效果如下:

中值滤波去噪

1
2
3
4
5
6
7
I = imread('/Users/roarboil/Desktop/1.jpg');
I = rgb2gray(I);
n1 = imnoise(I,'salt & pepper',0.02);
k = medfilt2(n1);
subplot(1,3,1);imshow(I);
subplot(1,3,2);imshow(n1);
subplot(1,3,3);imshow(k);

这里要注意这个medfilt2只能对灰度图像使用,所以先对图像进行了灰度化,具体效果见下

最大值最小值滤波

这里的函数相当于是从滤波器中寻找第n大的

1
2
3
4
5
6
7
8
9
10
11
12
I = imread('/Users/roarboil/Desktop/1.jpg');
I = rgb2gray(I);
n1 = imnoise(I,'salt & pepper',0.02);
k1 = ordfilt2(n1,1,ones(3,3));
k2 = ordfilt2(n1,5,ones(3,3));
k3 = ordfilt2(n1,9,ones(3,3));
subplot(2,3,1);imshow(I);
subplot(2,3,2);imshow(I);
subplot(2,3,3);imshow(n1);
subplot(2,3,4);imshow(k1);
subplot(2,3,5);imshow(k2);
subplot(2,3,6);imshow(k3);

效果见下

课后练习

对图像进行不同程度的平滑(模糊)

代码

1
2
3
4
5
6
7
8
9
10
I = imread('/Users/roarboil/Desktop/1.jpg');
w1 = fspecial('average',3);
w2 = fspecial('average',35);
w3 = fspecial('average',71);
k1 = imfilter(I,w1);
k2 = imfilter(I,w2);
k3 = imfilter(I,w3);
subplot(1,3,1);imshow(k1);
subplot(1,3,2);imshow(k2);
subplot(1,3,3);imshow(k3);

这里就是用不同大小的滤波器对同一张图片进行处理,越大会越模糊

效果

对图像添加不同种类的噪声,调节函数参数值观察结果

代码

1
2
3
4
5
6
7
I = imread('/Users/roarboil/Desktop/1.jpg');
k1 = imnoise(I,'gaussian',0,0.05);
k2 = imnoise(I,'salt & pepper',0.1);
k3 = imnoise(I,'speckle',0.1);
subplot(1,3,1);imshow(k1);
subplot(1,3,2);imshow(k2);
subplot(1,3,3);imshow(k3);

注意不同类型的模糊会导致后面跟的参数不同

效果

对图像分别添加高斯噪声和椒盐噪声,对比均值滤波和中值滤波效果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I = imread('/Users/roarboil/Desktop/1.jpg');
I = rgb2gray(I);
k1 = imnoise(I,'gaussian',0,0.05);
k2 = imnoise(I,'salt & pepper',0.1);
w = fspecial('average',3);
k1_1 = imfilter(k1,w);
k1_2 = medfilt2(k1);
k2_1 = imfilter(k2,w);
k2_2 = medfilt2(k2);
subplot(2,4,1);imshow(k1);
subplot(2,4,2);imshow(k1);
subplot(2,4,3);imshow(k2);
subplot(2,4,4);imshow(k2);
subplot(2,4,5);imshow(k1_1);
subplot(2,4,6);imshow(k1_2);
subplot(2,4,7);imshow(k2_1);
subplot(2,4,8);imshow(k2_2);

效果

明显看出中值滤波对椒盐更有优势

观察imfilter中滤波类型,边界选项和大小选项对结果图像的影响

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
I = imread('/Users/roarboil/Desktop/1.jpg');
I = rgb2gray(I);
n = imnoise(I,'gaussian',0,0.05);
w = fspecial('average',3);
k1 = imfilter(I,w);
k2 = imfilter(I,w,'symmetric');
k3 = imfilter(I,w,'replicate');
k4 = imfilter(I,w,'circular');
k5 = imfilter(I,w,'full');
k6 = imfilter(I,w,'conv');
subplot(2,3,1);imshow(k1);
subplot(2,3,2);imshow(k2);
subplot(2,3,3);imshow(k3);
subplot(2,3,4);imshow(k4);
subplot(2,3,5);imshow(k5);
subplot(2,3,6);imshow(k6);

效果

观察用最大值滤波、最小值滤波和中值滤波的对比结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
I = imread('/Users/roarboil/Desktop/1.jpg');
I = rgb2gray(I);
n1 = imnoise(I,'salt & pepper',0.02);
k1 = ordfilt2(n1,1,ones(3,3));
k2 = ordfilt2(n1,5,ones(3,3));
k3 = ordfilt2(n1,9,ones(3,3));
subplot(2,3,1);imshow(I);
subplot(2,3,2);imshow(I);
subplot(2,3,3);imshow(n1);
subplot(2,3,4);imshow(k1);
subplot(2,3,5);imshow(k2);
subplot(2,3,6);imshow(k3);

效果

图像增强–锐化滤波

定义

图像锐化就是使边缘和轮廓线模糊的图像变得清晰,使细节更加清晰。图像模糊的实质是图像受到平均或者积分运算的影响,对其进行逆运算就可使图像清晰

锐化滤波器-梯度算子法

使用直接差分算子

使用交叉的罗伯特算子

考虑六领域的sobel算子

锐化滤波器-拉普拉斯算子法

模版生成

可以使用fspecial生成相应的模版

1
2
H1 = fspecial('prewitt');
H2 = fspecial('laplacian');

锐化滤波实例

1
2
3
4
5
6
7
8
9
I = imread('moon.tif');
H = fspecial('sobel');
I1 = im2double(I);
j = imfilter(I1,H);
subplot(2,2,1); imshow(I);
subplot(2,2,2); imshow(j);
subplot(2,2,3); imshow(j,[]);
I2 = I1-j;
subplot(2,2,4); imshow(im2uint8(I2));

效果如下

如果要使用另一个方向的卷积算子,我们可以对其转置

用a=a’

Author: YihangBao
Link: https://roarboil.github.io/2020/04/22/imalight/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.