1.空间滤波
空间滤波,就是直接在灰度值上,做一些滤波操作。滤波一词,其实来源于频域,将某个频率成分滤除的意思。大部分线性的空间滤波器(比如均值滤波器),是在空间上进行一些灰度值上的操作,这个线性空间滤波器与频域滤波器有一一对应的关系(比如均值滤波器其本质就是低通滤波器),这样会有助于理解这个滤波器的特性。然而,对于非线性的滤波器(比如最大值,最小值和中央值滤波器)的话,则没有这样一个一一对应的关系。
线性空间滤波所使用的运算是卷积,其计算如下所示。
在执行空间滤波的时候,我们都会使用到这个操作。
这个式子可能会出现两个问题。这次是在空间域进行操作的,所以上式应该没什么问题。但是,如果换到频域,我们会发现,我们使用的滤波器是非因果的,按照我之前在数字信号处理的那一节,非因果具有零相位特性,但是是不可实现的,因为需要未来的输入。而在这,我们在图像处理的时候,都是一帧一帧的处理,所以,这里非因果性不是问题。而最重要的是,零相位特性不会使得图像变形,这是很重要的。
还有一个问题就是边界问题,当滤波器的中心靠近图像边缘时候,滤波器的一部分会位于图像外,那么此时,我们通常会采用填0的操作来解决。但是,一些场合,直接填0操作会使得操作后的图像出现黑边。所以,常用的操作还有,①选择距离最近的点填充,②填充的点为圆图像的镜像,③将原图像当做周期信号来填充。
2.几个典型的空间滤波器
2.1平滑滤波器
在空间域上考虑,我们所指的平滑滤波器,有平均滤波与加权平均滤波两种形式。
这里很好理解,将滤波器范围内的点,求平均值(或者加权平均值)。这样会使得图像平滑,有助于去掉一些噪声。
我们将其放到频域去考虑的话,其实这是一个很典型的低通滤波器。这个滤波器会滤掉高频成分,所以可以使得图像平滑。其频率响应如下所示。
3X3平均滤波的频率响应
3X3加权平均滤波的频率响应
首先,对于两个滤波器的振幅特性。平均滤波器的通带要比加权平均滤波器的窄,故使用平均滤波器处理的图像要比加权滤波器处理的图像要模糊一些。
注意平均滤波器的相位特性,其相位特性并不是一个平面,有的地方的值为π。首先,平均滤波器是一个偶实函数,其频率响应是一个实函数。但是,其频率响应有的部分为负值,这就造成了Matlab的angle()的计算结果为π。其实其还是具有0相位特性的。
用其处理实际处理图像的话,会得到以下结果。
看其处理结果,其实很难分辨出有什么区别。所以,加权平均滤波器和平均滤波器的区别,从频率响应来看的话,容易明白一些。本文只是简单的介绍一下均值滤波器,详细的,请参看[数字图像处理]图像去噪初步(1)--均值滤波器
2.2统计排序滤波器
统计排序滤波器的运用也广泛,其是很典型的非线性滤波器。主要包括了,最大值滤波器,最小值滤波器,中央值滤波器等等。这里作为代表的,主要说中央值滤波器,中央值滤波对于去除椒盐噪声特别有效。
所谓中央值滤波器,就是将滤波器范围内的像素的灰度值,进行排序,选出中央值作为这个像素的灰度值。同理可解释最大值滤波器与最小值滤波器。
我们将一幅图像添加椒盐噪声,然后尝试着用中央值滤波器去除。
从直方图中,可以看出,中央值滤波器对于椒盐噪声,有很好的去噪作用。关于非线性滤波的详细,请参看[数字图像处理]图像去噪初步(2)--非线性滤波器
2.3锐化滤波器
使用平均滤波器,可以将图像平滑,其本质是将图像在滤波器范围内求平均值。从频域上来看,平均滤波器是低通滤波器。然而,所谓的锐化,即是将图像的细节强调出来。这里进行了一个假设,假设细节部分是图像高频成分。从这里看来,其实锐化滤波器是与平均滤波器是相反的操作。
对于一个一次元函数,其一阶微分为
这样的微分被称为向前一次微分,这样的微分会产生一个采样点(针对图像来说,偏移一个像素)的偏移。为了避免这样的偏移,一般将向前一次微分与向后一次微分连用,这样就不会产生一些偏移,如下所示。
现在将其二阶段微分扩展到二次元的图像,如下所示。
将其写成滤波器的形式的话,如下左所示。我们为了强调其微分效果,也可以在斜方向上加上一个微分效果,如下右所示。我们将其称为拉普拉斯算子。
其频率响应如下所示。
四方向的拉普拉斯滤波器的频率响应
八方向的拉普拉斯滤波器的频率响应
我们可以看出,八方向的拉普拉斯滤波器对于高频成分的强调效果较强。其低频部分最小值为0,这意味着,进行拉普拉斯滤波之后,其实只剩下图像的高频部分了(在空间域里来讲,只剩下边缘部分了)。所以,若用于图像锐化的话,可以将所得结果叠加至原图像,其实也就相当与滤波器的振幅特性往上移动1,保证低频部分不变,强调高频部分。
2.4高提升滤波
高提升滤波一般用于使得图片更加清晰。其步骤大致如下,首先将图片模糊化,然后从原图中,将其模糊形式去除。
从而得到图像的反锐化掩蔽,然后用将其叠加至原图上,从而使得图像更清晰。
当k=1的时候,这个操作称为反锐化掩蔽。当k>1时候,这个操作称为高提升滤波。
其实,高提升滤波也是一种锐化滤波,其强调的也是图像的边缘部分(或者跳变部分)。用以下实验可以加深对高提升滤波的理解。
得到的结果确实比原图更加的清晰了。为了更深一步理解,我们将第77行的灰度曲线画出来,看看具体啥样的。
首先是原图的77行与高斯模糊后的77行。
然后是原图与模糊后的图像的差,其图像如下所示。
可以看出,边缘部分都凸显出来了,下面,我们将这个部分乘以某个常数,再叠加回原图,就可以得到高提升滤波的结果,如下所示。
可以看出,字体的边缘部分被强调了。这样会使得字体在感觉上,更加的清晰。
2.5 sobel滤波器
sobel滤波器也是一个常用的滤波器。其原理与锐化滤波器也很像,其运用了一阶微分,使得边缘部分得到保留,滤除了其余的平滑部分。
现在来分析一下sobel滤波器。纵向看这个滤波器,是一个中心2次式微分运算,这个运算是一个高通滤波器。由此可以确定,sobel滤波器是可以提取图像的边缘。再看纵向,纵向其实是一个加权平均滤波器,这也就说明了,其实sobel滤波器有一定的平滑作用。综上,sobel滤波器是由以下两个滤波器合成的。
Sobel滤波器有两个方向,所以,其两个方向的频响如下所示。
sobel滤波器可以抽出图像的边缘部分。从频域上来看,其保留了图像的中部频段部分。
3.参考用代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | close all; clear all;
%% -------------Smoothing Lines Filters----------------- f = imread('test_pattern_blurring_orig.tif'); f = mat2gray(f,[0 255]);
w_1 = ones(3)/9; %%%%% g_1 = imfilter(f,w_1,'conv','symmetric','same');
w_2 = ones(5)/25; %%%%% g_2 = imfilter(f,w_2,'conv','symmetric','same');
w_3 = [1 2 1; 2 4 2; 1 2 1]/16; %%%%% g_3 = imfilter(f,w_3,'conv','symmetric','same');
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_1,[0 1]); xlabel('b).Average Filter(size 3x3)');
figure(); subplot(1,2,1); imshow(g_2,[0 1]); xlabel('c).Average Filter(size 5x5)');
subplot(1,2,2); imshow(g_3,[0 1]); xlabel('d).Weighted Average Filter(size 3x3)');
%% ------------------------ M = 64; N = 64; [H_1,w1,w2] = freqz2(w_1,M,N); figure(); subplot(1,2,1); mesh(w1(1:M)*pi,w2(1:N)*pi,abs(H_1(1:M,1:N))); axis([-pi pi -pi pi 0 1]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:M)*pi,w2(1:N)*pi,unwrap(angle(H_1(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Average_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | close all; clear all;
%% ----------------Noise type-------------------- f = imread('original_pattern.tif'); f = mat2gray(f,[0 255]); [M,N] = size(f);
g_gaussian = imnoise(f,'gaussian',0,0.015); g_salt_pepper = imnoise(f,'salt & pepper',0.15);
figure(1); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); h = imhist(f)/(M*N); bar(0:1/255:1,h); axis([-0.1 1.1 0 0.55]),grid; axis square; xlabel('b).The histogram of original image'); ylabel('Number of pixels');
figure(2); subplot(1,2,1); imshow(g_gaussian,[0 1]); xlabel('c).gaussian noise image');
subplot(1,2,2); h = imhist(g_gaussian)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('d).The histogram of c)'); ylabel('Number of pixels');
figure(5); subplot(1,2,1); imshow(g_salt_pepper,[0 1]); xlabel('i).salt & pepper noise image');
subplot(1,2,2); h = imhist(g_salt_pepper)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('j).The histogram of g)'); ylabel('Number of pixels');
%% -------------Nonlines Filters----------------- g_med_wg = medfilt2(g_gaussian,'symmetric',[3 3]); g_med_sp = medfilt2(g_salt_pepper,'symmetric',[3 3]);
figure(3); subplot(1,2,1); imshow(g_med_wg,[0 1]); xlabel('e).Result of median filter');
subplot(1,2,2); h = imhist(g_med_wg)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('f).The histogram of e)'); ylabel('Number of pixels');
figure(6); subplot(1,2,1); imshow(g_med_sp,[0 1]); xlabel('k).Result of median filter');
subplot(1,2,2); h = imhist(g_med_sp)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('l).The histogram of i)'); ylabel('Number of pixels');
%% -------------lines Filters----------------- w_1 = [1 2 1; 2 4 2; 1 2 1]/16; %%%%% g_ave_wg = imfilter(g_gaussian,w_1,'conv','symmetric','same'); g_ave_sp = imfilter(g_salt_pepper,w_1,'conv','symmetric','same');
figure(4); subplot(1,2,1); imshow(g_ave_wg,[0 1]); xlabel('g).Result of weighted average filter');
subplot(1,2,2); h = imhist(g_ave_wg)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.05]),grid; axis square; xlabel('h).The histogram of k)'); ylabel('Number of pixels');
figure(7); subplot(1,2,1); imshow(g_ave_sp,[0 1]); xlabel('m).Result of weighted average filter');
subplot(1,2,2); h = imhist(g_ave_sp)/(M*N); bar(0:1/255:1,h); axis([-.1 1.1 0 0.55]),grid; axis square; xlabel('n).The histogram of m)'); ylabel('Number of pixels');
|
Noline_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | close all; clear all;
%% -------------Sharpening Spatial Filters----------------- f = imread('blurry_moon.tif'); f = mat2gray(f,[0 255]);
w_L = [0 1 0 1 -4 1 0 1 0]; g_L_whitout = imfilter(f,w_L,'conv','symmetric','same'); g_L = mat2gray(g_L_whitout); g = f - g_L_whitout; g = mat2gray(g ,[0 1]);
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_L_whitout,[0 1]); xlabel('b).The Laplacian');
figure(); subplot(1,2,1); imshow(g_L,[0 1]); xlabel('c).The Laplacian with scaling');
subplot(1,2,2); imshow(g,[0 1]); xlabel('d).Result Image');
%% ------------------------ [M,N] = size(f); [H,w1,w2] = freqz2(w_L,N,M); figure(); subplot(1,2,1); mesh(w1(1:10:N)*pi,w2(1:10:M)*pi,abs(H(1:10:M,1:10:N))); axis([-pi pi -pi pi 0 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:10:N)*pi,w2(1:10:M)*pi,unwrap(angle(H(1:10:M,1:10:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Laplacian_Filters.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | close all; clear all;
%% -------------Unsharp Masking and Highboots Filtering----------------- close all; clear all;
f = imread('dipxe_text.tif'); f = mat2gray(f,[0 255]);
w_Gaussian = fspecial('gaussian',[3,3],1); g_Gaussian = imfilter(f,w_Gaussian,'conv','symmetric','same');
g_mask = f - g_Gaussian;
g_Unsharp = f + g_mask; g_hb = f + (4.5 * g_mask); f = mat2gray(f,[0 1]);
figure(); subplot(2,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(2,2,2); imshow(g_Gaussian,[0 1]); xlabel('b).Result of Gaussian Filter');
subplot(2,2,3); imshow(mat2gray(g_mask),[0 1]); xlabel('a).Unsharp Mask');
subplot(2,2,4); imshow(g_hb,[0 1]); xlabel('b).Result of Highboots Filter');
%% [M,N] = size(f);
figure(); %subplot(1,2,1); plot(1:N,f(77,1:N),'r'); axis([1,N,0,1]),grid; axis square; xlabel('a).Original Image(77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,2); plot(1:N,f(77,1:N),'r',1:N,g_Gaussian(77,1:N),'--b'); legend('Original','Result'); axis([1,N,0,1]),grid; axis square; xlabel('b).Result of gaussian filter(77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,1); plot(1:N,g_mask(77,1:N)); axis([1,N,-.1,.1]),grid; axis square; xlabel('c).Result of gaussian filter (77th column)'); ylabel('intensity level');
figure(); %subplot(1,2,2); plot(1:N,g_hb(77,1:N)); axis([1,N,0,1.1]),grid; axis square; xlabel('d).Result of Highboots Filtering(77th column)'); ylabel('intensity level');
|
Highboots_Filter.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 | close all; clear all;
%% -------------The Gradient----------------- f = imread('contact_lens_original.tif'); f = mat2gray(f,[0 255]);
sobel_x = [-1 -2 -1; 0 0 0; 1 2 1]; sobel_y = [-1 0 1; -2 0 2; -1 0 1];
g_x = abs(imfilter(f,sobel_x,'conv','symmetric','same')); g_y = abs(imfilter(f,sobel_y,'conv','symmetric','same')); g_sobel = g_x + g_y;
figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image');
subplot(1,2,2); imshow(g_sobel,[0 1]); xlabel('b).Result of Sobel Operators');
figure(); subplot(1,2,1); imshow(g_x,[0 1]); xlabel('c).Result of Sx');
subplot(1,2,2); imshow(g_y,[0 1]); xlabel('d).Result of Sy');
%% ------------------------ M = 64; N = 64; [H,w1,w2] = freqz2(sobel_x,N,M); figure(); subplot(1,2,1); mesh(w1(1:N)*pi,w2(1:M)*pi,abs(H(1:M,1:N))); axis([-pi pi -pi pi 0 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:N)*pi,w2(1:M)*pi,unwrap(angle(H(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
[H,w1,w2] = freqz2(sobel_y,N,M); figure(); subplot(1,2,1); mesh(w1(1:N)*pi,w2(1:M)*pi,abs(H(1:M,1:N))); axis([-pi pi -pi pi -12 12]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('|H(e^{j\omega_1},e^{j\omega_2})|');
%figure(); subplot(1,2,2); mesh(w1(1:N)*pi,w2(1:M)*pi,unwrap(angle(H(1:M,1:N)))); axis([-pi pi -pi pi -pi pi]); xlabel('\omega_1 [rad]');ylabel('\omega_2 [rad]'); zlabel('\theta [rad]');
|
Sobel_Operators.m
3.6 锐化空间滤波器
锐化处理的主要目的是突出图像中的细节或者增强被模糊了的细节,这种模糊不是由于错误操作,就是特殊图像获取方法的固有印象。总的来说,微分算子的响应强度与图像在该店(应用了算子)的突变程度有关。这样一来,图像微分增强了边缘和其他突变(如噪声)并削弱了灰度变化缓慢的区域。
为了说明简单,主要集中讨论一阶微分的性质。我们最高兴去的微分性质是恒定灰度区域(平坦段)、突变的开头与结尾(阶梯和斜坡突变)及沿着灰度级斜坡处的特性。这些类型的突变可以用来对图像中的噪声点、细线与边缘模型化。
3.6.1 基础
数字函数(图像,离散的数字序列)的微分定义条件:
这里我们首先了解下数学函数的微分,微分可以用不同的术语定义,也有各种方法定义这些差别,然而,对于一阶微分任何定义都必须保证以下几点:
(1)在平坦段(灰度不变区域)微分值为零;
(2)在灰度阶梯或斜坡的起始点处微分值非零;
(3)沿着斜坡面微分值非零。
任何二阶微分的定义也类似:
(1)在平坦去微分值必为零;
(2)在灰度阶梯或斜坡的起始点处微分值非零;
(3)沿着斜坡面微分值非零。
因为我们处理的是数字量,其值是有限的,故最大灰度级的变换也是有限的,变化发生最短距离是在两相邻像素之间。对于一元函数f(x)表达一阶微分定义是一个差值:
f/x = f(x+1) f(x)
这里,为了与对二元图像函数f(x,y)求微分时的表达式保持一致,使用偏导数符号,对二元函数,我们将沿着两个空间轴处理偏微分,类似地,用差分定义二阶微分:
下图表明了上述的具体含义。注意下图中二阶差分的零交叉点(Zero crossing),零交叉点对于边缘的定位非常有用。
二阶微分在增强细节方面比一阶微分好得多,这是一个适合锐化图像的理想特征。
3.6.2 基于二阶微分的图像增强--拉普拉斯算子
这里介绍二阶微分在图像增强处理中的应用。首先定义一个二阶微分的离散公式,然后构造一个基于此式的滤波器。我们最关注的是一种各向同性滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关。也就是说,各向同性滤波器是旋转不变的,即将原始图像旋转后进行滤波处理给出的结果与先对图像滤波,然后再旋转的结果相同。
处理方法
最简单的各向同性微分算子是拉普拉斯算子,一个二元图像函数f(x,y)的拉普拉斯变换定义为:
因为任意阶微分都是线型操作,所以拉普拉斯变换也是一个线性操作。
考虑到有两个变量,因此,我们在x,y方向上对二阶偏微分采用下俩定义:
因此二维拉维拉斯数字实现可由这两个分量相加得到:
,这里关注系数矩阵即掩膜:
这个矩阵给出了在90度方向上旋转的各向同性结果,如果向得到45度方向上旋转的各向同性结果则,将中心对角点标为1,中心点为-8即可。
由于拉普拉斯是一种微分算子,它的应用强调图像中灰度的突变及降低灰度慢变化的区域。将原始图像和拉普拉斯图像叠加在一起的简单方法可以保护拉普拉斯锐化处理的效果,同时又能复原背景信息。我们使用拉普拉斯变换对图像增强的基本方法可表示为下式:
含有对角线信息的拉普拉斯算子
3.6.3 非锐化掩蔽和高提升滤波
在印刷和出版界用了多年的图像锐化处理过程,从原图中减去一副非锐化(平滑后的)图像,达到锐化的目的。
步骤有以下几步:
- 模糊源图像
- 从原图像中减去模糊图像(产生的差值图像称为模板)
- 将模板加到原图像上。
令
表示模糊图像,那么首先我们得到模板:然后在原图像上加上该模板的一个权重部分:
上式中,当k=1时,我们得到上面定义的非锐化掩蔽,当k>1时,该处理称为高提升滤波,当k<1时,则不强调非锐化模板的贡献。
需要注意的是,如果k足够大的时候,负值将导致边缘周围有暗的晕轮,会产生不好的效果。
3.6.4 使用一阶微分对(非线性)图像锐化—梯度
一个函数f在f(x,y)的梯度是定义为二维列向量(这是一个矢量,给定了一个方向):
然后其幅度值为
,其中M(x,y)是与原图像大小相同的图像,该图像通常称为梯度图像。后面的表达式仍保留了灰度的变换,但丢失掉了其各向同性。下面介绍两种算子:一阶Roberts交叉梯度算子和二阶Soble算子:
在3×3的区域图像中,应该是gx = (z8z5) gy = (z9z6),但是Roberts进行了改良,提出了Roberts算子,gx=(z9z5),gy=(z8z6);由于偶数模板没有对称中心,所以与之前的卷积模板定义中,运算结果等会中心点位置值不能对应, 所以使用奇数的模板,例如3 * 3 的Soble算子,gx=(z7+2z8+z9)(z1+2z2+z3),gy=(z3+2z6+z9)(z1+2z4+z7)。
使用梯度进行边缘增强,可以用以突出灰度图像中看不见的小斑点,在下面的例子中甚至可以去除灰度不变或变换缓慢的图案阴影。
3.7 混合空间增强法
本书所提供例子的策略是:用Laplace突出图像中的小细节,然后使用梯度法突出边缘。平滑过得梯度图像用于掩蔽Laplace图像,最后使用灰度变换来增大图像的灰度动态范围。其中降低噪声可以使用中值滤波器或者使用原图像梯度操作的平滑形式形成的一个模板。
图像请直接参考Digital Image Processing (3rd Edition)Page 192。
3.8 使用模糊技术进行灰度变换和空间变换
3.8.1 引言
隶属度函数μ(z):用以描述一个元素是否属于集合的模糊程度,若是一个阶跃函数,可以认为是一个我们所了解的"干脆的"集合,若是一个分段函数,则可以看做一个模糊集合:
3.8.2模糊集合论原理
模糊集合是一个有z值和(赋予z成员等级的)相应隶属度函数组成的序对,即
A={z,μA(z)|z∈Z}
其中隶属度函数是关键,表明了元素z到集合的一种对应关系。如果隶属度函数仅有0,1两个值,那么模糊集合退化为"干脆的"集合。下面这张图展示了模糊集合间的一些关系:
有一些常用的隶属度函数,如三角形、梯形、∑型、S型、种型、截尾高斯型等,之后用到了会另作介绍。
3.8.3 模糊集合的应用(略)
3.8.4 使用模糊集合进行灰度变换
对于一副灰度图像,描述它的某个区域"暗的"、"灰的"、"亮的"都是利用模糊的概念,那么我们将给予这三种情况定义三种模糊集合:
那么对于任何输入z0,输出v0为
从书中给予的例子中来看,图像的细节部分得到了比较好的保留,但代价是计算量大大增加。