imfilter
多维图像的 N 维滤波
说明
示例
创建并应用滤波器
将一个彩色图像读入工作区中并显示该图像。
originalRGB = imread('peppers.png');
imshow(originalRGB)
使用 fspecial
函数创建一个运动模糊滤波器。
h = fspecial('motion', 50, 45);
将该滤波器应用于原始图像,以创建一个具有运动模糊的图像。请注意,imfilter
比其他一些滤波函数更节省内存,因为它输出的数组与输入图像数组具有相同的数据类型。在此示例中,输出是 uint8
数组。
filteredRGB = imfilter(originalRGB, h); figure, imshow(filteredRGB)
再次对图像进行滤波,这次指定复制边界选项。
boundaryReplicateRGB = imfilter(originalRGB, h, 'replicate');
figure, imshow(boundaryReplicateRGB)
使用 imfilter 和卷积对图像进行滤波
默认情况下,imfilter
使用相关性,因为工具箱滤波器设计函数生成相关性核。使用可选参数以使用卷积。
创建一个示例矩阵。
A = magic(5)
A = 5×5
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(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
使用卷积进行滤波,用可选参数指定 imfilter
。
imfilter(A,h,'conv')
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
转换图像类以避免负输出值
在此示例中,当输入的类为 double
时,imfilter
的输出具有负值。为避免负值,请在调用 imfilter
之前将图像转换为不同数据类型。例如,当输入类型为 uint8
时,imfilter
将输出值截断为 0
。将图像转换为有符号整数类型可能也是合适的。
A = magic(5)
A = 5×5
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
用 imfilter
对图像进行滤波。
h = [-1 0 1]; 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
请注意,结果包含负值。为避免输出图像中出现负值,请在执行滤波之前将输入图像转换为 uint8
类型。由于 imfilter
的输入的类为 uint8
,输出的类也为 uint8
,因此 imfilter
将负值截断为 0
。
A = uint8(magic(5)); 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
输入参数
A
— 要滤波的图像
数值数组
要滤波的图像,指定为维度的数值数组。
数据类型: single
| double
| int8
| int16
| int32
| uint8
| uint16
| uint32
| logical
h
— 多维滤波器
数据类型为 double
的 N 维数组
多维滤波器,指定为数据类型为 double
的 N 维数组。
数据类型: double
options
— 控制滤波运算的选项
字符向量 | 字符串标量 | 数值标量
控制滤波运算的选项,指定为字符向量、字符串标量或数值标量。下表列出了所有支持的选项。
边界选项
选项 | 描述 |
---|---|
填充选项 | |
数值标量, | 数组边界之外的输入数组值被赋予值 |
| 数组边界之外的输入数组值是通过沿数组边界对数组进行镜面反射得到。 |
| 数组边界之外的输入数组值假定为等于最近的数组边界值。 |
| 数组边界之外的输入数组值是通过隐式假设输入数组具有周期性来计算的。 |
输出大小 | |
| 输出数组与输入数组大小相同。这是未指定输出大小选项时的默认行为。 |
| 输出数组是完全滤波后的结果,因此比输入数组大。 |
相关性和卷积选项 | |
|
|
|
|
提示
此函数可以使用针对数据类型
uint8
、uint16
、int16
、single
和double
的硬件优化来加快运行速度。
算法
imfilter
函数使用双精度浮点算术来计算每个输出像素的值。如果结果超出数据类型的范围,则imfilter
会将结果截断到数据类型的允许范围。如果它是整数数据类型,则imfilter
对小数值进行舍入。如果指定偶数大小的核
h
,则核的中心是floor((size(h) + 1)/2)
。例如,四元素滤波器
[0.25 0.75 -0.75 -0.25]
的中心是第二个元素0.75
。此滤波器与五元素滤波器[0 0.25 0.75 -0.75 -0.25]
的滤波结果相同。
扩展功能
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
imfilter
支持 C 代码生成(需要 MATLAB® Coder™)。请注意,如果您选择通用的MATLAB Host Computer
目标平台,imfilter
生成的代码将使用平台特定的预编译共享库。使用共享库可保留性能上的优化,但适用范围仅限于生成的代码所适用的目标平台。有关详细信息,请参阅Image Processing Toolbox 中代码生成支持的类型。生成代码时,输入图像
A
必须为二维或三维。输入参量options
的值必须为编译时常量。如果您指定大核
h
(即包含大值的核),或指定包含大值的图像,您可以看到对于浮点数据类型,MATLAB 和生成的代码之间会产生不同结果。发生这种情况是因为不同算法实现会导致累积误差。
GPU 代码生成
使用 GPU Coder™ 为 NVIDIA® GPU 生成 CUDA® 代码。
用法说明和限制:
生成代码时,输入图像
A
必须为二维或三维。输入参量options
的值必须为编译时常量。如果您指定大核
h
(即包含大值的核),或指定包含大值的图像,您可以看到对于浮点数据类型,MATLAB 和生成的代码之间会产生不同结果。发生这种情况是因为不同算法实现会导致累积误差。使用 CUDA® 工具包 v9.0 时,NVIDIA® 优化中的一个 Bug 导致生成代码与 MATLAB 的结果之间出现数值不匹配。作为一种解决方法,请在生成代码之前,通过向配置对象 (
cfg
) 传递以下标志来关闭优化。cfg.GpuConfig.CompilerFlags = ‘-Xptxas -O0’
NVIDIA 预计将在 CUDA 工具包 v9.1 中修复此 Bug。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
滤波核
h
必须是数据类型为double
的向量或二维矩阵。如果使用 GPU 对图像进行滤波,则
imfilter
根据A
的数据类型,使用单精度或双精度浮点计算每个输出像素的值。如果A
包含双精度或uint32
值,则imfilter
使用双精度值。对于所有其他数据类型,imfilter
使用单精度。如果A
是整数数组或逻辑数组,则imfilter
会截断超出给定类型范围的输出元素,并对小数值进行舍入。
有关详细信息,请参阅GPU 上的图像处理。
版本历史记录
在 R2006a 之前推出R2022b: 支持基于线程的环境
imfilter
现在支持基于线程的环境。
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)