1.高斯函数的几种使用
imgaussfilt直接对图片进行高斯滤波,相关设置包括
FilterSize
- 高斯滤波器的大小
正奇整数 | 由正奇整数组成的二元素向量
Padding
- 图像填充'replicate'
(默认) | 数值标量 | 'circular'
| 'symmetric'
FilterDomain
- 要在其中执行滤波的域'auto'
(默认) | 'spatial'
| 'frequency'
imfilter编写高斯函数与图片相关运算滤波
fspecial生成高斯模板
-
如果图像 A 包含
Inf
或NaN
,则频域滤波的imgaussfilt
的行为会是未定义状态。如果将'FilterDomain'
参数设置为'frequency'
,或将其设置为'auto'
并且imgaussfilt
使用频域滤波,就会发生这种情况。要以类似于 imfilter 的方式限制输出中Inf
和NaN
的传播,请考虑将'FilterDomain'
参数设置为'spatial'
。 -
如果将
'FilterDomain'
参数设置为'auto'
,则imgaussfilt
使用内部启发式方法来确定空间域还是频域滤波更快。这种启发式方法依赖于机器,可能因不同配置而异。为了获得最优性能,请尝试两个选项'spatial'
和'frequency'
,以确定适合您的图像和核大小的最佳滤波域。 -
如果未指定
'Padding'
参数,则imgaussfilt
默认使用'replicate'
填充,这与 imfilter 使用的默认0填充不同。
img1 = imgaussfilt(imgGray,0.5,'FilterSize',[15,15],'Padding',0,'FilterDomain' ,'spatial');
f = fspecial('gaussian',[15,15],0.5);
img2 = imfilter(imgGray,f);
isequal(img1,img2)
ans =
logical
1
2.conv2和imfilter的区别
conv2(A,h,'same') = imfilter(A,h,'conv')都是实行卷积运算,计算过程中会翻转卷积核。
先定义一个矩阵A,和卷积核h如下:
A = magic(5)
A =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
h = (-1,0,1);
imfilter
比其他一些滤波函数更节省内存,因为它输出的数组与输入图像数组具有相同的数据类型。
B = imfilter(A,h,'corr/conv','same/full') 根据一个或多个指定的选项执行多维滤波。
当输入的类为 double
时,imfilter
的输出具有负值。为避免负值,请在调用 imfilter
之前将图像转换为不同数据类型。例如,当输入类型为 uint8
时,imfilter
将输出值截断为 0
。将图像转换为有符号整数类型可能也是合适的。
imfilter(A,h) %有负值,默认使用相关滤波,不翻转卷积核
ans = 5×5
24 -16 -16 14 -8
5 -16 9 9 -14
6 9 14 9 -20
12 9 9 -16 -21
18 14 -16 -16 -2
A = uint8(magic(5)); %先转成uint8,不会输出负值
imfilter(A,h)
ans = 5x5 uint8 matrix
24 0 0 14 0
5 0 9 9 0
6 9 14 9 0
12 9 9 0 0
18 14 0 0 0
conv2是2维卷积函数,默认情况下输出的是‘full’形式的矩阵
-
'full'
- 返回完整的二维卷积。 -
'same'
- 返回卷积中大小与A
相同的中心部分。 -
'valid'
- 仅返回计算的没有补零边缘的卷积部分。
conv2(A,h)
ans =
-17 -24 16 16 -14 8 15
-23 -5 16 -9 -9 14 16
-4 -6 -9 -14 -9 20 22
-10 -12 -9 -9 16 21 3
-11 -18 -14 16 16 2 9
conv2(A,h,'same')
ans =
-24 16 16 -14 8
-5 16 -9 -9 14
-6 -9 -14 -9 20
-12 -9 -9 16 21
-18 -14 16 16 2
conv2(A,h,'valid')
ans =
16 16 -14
16 -9 -9
-9 -14 -9
-9 -9 16
-14 16 16