imfilter
多维图像的N-D滤波
描述
例子
创建过滤器并应用它
将彩色图像读入工作区并显示它。
originalRGB = imread(“peppers.png”);imshow (originalRGB)
属性创建一个运动模糊滤镜fspecial
函数。
H = fspecial(“运动”, 50, 45);
将滤镜应用于原始图像以创建具有运动模糊的图像。请注意,imfilter
比其他一些过滤函数更节省内存,因为它输出与输入图像数组具有相同数据类型的数组。在本例中,输出为数组uint8
.
filteredRGB = imfilter(originalRGB, h);图中,imshow (filteredRGB)
再次过滤图像,这一次指定复制边界选项。
boundaryReplicateRGB = imfilter(originalRGB, h,“复制”);图中,imshow (boundaryReplicateRGB)
使用卷积滤波过滤图像
默认情况下,imfilter
使用相关性是因为工具箱过滤器设计函数产生相关性内核。使用可选参数来使用卷积。
创建一个样本矩阵。
A =魔术(5)
一个=5×517 24 18 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×524 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -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
转换图像类以避免负输出值
在本例中,的输出imfilter
当输入为类时,值为负值双
.要避免为负值,请在调用之前将图像转换为不同的数据类型imfilter
.例如,当输入类型为uint8
,imfilter
将输出值截断为0
.将图像转换为有符号整数类型也可能是合适的。
A =魔术(5)
一个=5×517 24 18 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×524 -16 -16 14 -8 5 -16 9 9 -14 6 9 14 9 -20 12 9 9 -16 -21 18 14 -16 -16 -16 -2
注意,结果为负值。若要避免输出图像中的负值,请将输入图像转换为uint8
在进行过滤之前。因为输入imfilter
是一流的uint8
,输出也是一流的uint8
,imfilter
将负值截断为0
.
A = uint8(magic(5));imfilter (A, h)
ans =5x5 uint8矩阵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 0 0 0
输入参数
一个
- - - - - -待过滤图像
数字数组
要过滤的图像,指定为尺寸的数字数组。
数据类型:单
|双
|int8
|int16
|int32
|uint8
|uint16
|uint32
|逻辑
h
- - - - - -多维过滤器
N-D数组的数据类型双
多维过滤器,指定为数据类型的N-D数组双
.
数据类型:双
选项
- - - - - -控制筛选操作的选项
特征向量|字符串标量|数字标量
控制筛选操作的选项,该操作指定为字符向量、字符串标量或数字标量。下表列出了所有支持的选项。万博1manbetx
边界的选择
选项 |
描述 |
---|---|
填充选项 | |
数字标量, |
超出数组边界的输入数组值将被赋值 |
|
数组边界之外的输入数组值通过在数组边界上镜像反射数组来计算。 |
|
假定超出数组边界的输入数组值等于最近的数组边界值。 |
|
在数组边界之外的输入数组值通过隐式假设输入数组是周期性的来计算。 |
输出的大小 | |
|
输出数组与输入数组大小相同。这是没有指定输出大小选项时的默认行为。 |
|
输出数组是完全过滤的结果,因此比输入数组大。 |
相关和卷积选项 | |
|
|
|
|
提示
此函数可以利用数据类型的硬件优化
uint8
,uint16
,int16
,单
,双
跑得更快。
算法
的
imfilter
函数使用双精度浮点算法计算每个输出像素的值。如果结果超出了数据类型的范围,则imfilter
将结果截断为数据类型允许的范围。如果是整数数据类型,则imfilter
小数值四舍五入。如果您指定一个均匀大小的内核
h
,则核的中心为地板((尺寸(h) + 1)/2)
.例如,4元滤波器的中心
[0.25 0.75 -0.75 -0.25]
是第二个元素,0.75
.该滤波器与5元滤波器的滤波结果相同[0 0.25 0.75 -0.75 -0.25]
.
扩展功能
C/ c++代码生成
使用MATLAB®Coder™生成C和c++代码。
使用注意事项和限制:
imfilter
万博1manbetx支持生成C代码(需要MATLAB®编码器™).请注意,如果您选择通用的MATLAB主机
目标平台,imfilter
生成使用预编译的、特定于平台的共享库的代码。使用共享库可以保持性能优化,但限制了可以为其生成代码的目标平台。有关更多信息,请参见图像处理工具箱中支持的代码生成类型万博1manbetx.在生成代码时,输入图像,
一个
,必须是二维或三维的。输入参数的值,选项
,必须是编译时常数。如果指定了一个大内核
h
,一个包含大值的内核,或者指定一个包含大值的图像,您可以看到MATLAB和为浮点数据类型生成的代码之间的不同结果。这是因为不同的算法实现导致了累积错误。
GPU代码生成
使用GPU Coder™为NVIDIA®GPU生成CUDA®代码。
使用注意事项和限制:
在生成代码时,输入图像,
一个
,必须是二维或三维的。输入参数的值,选项
,必须是编译时常数。如果指定了一个大内核
h
,一个包含大值的内核,或者指定一个包含大值的图像,您可以看到MATLAB和为浮点数据类型生成的代码之间的不同结果。这是因为不同的算法实现导致了累积错误。使用CUDA®工具包v9.0, NVIDIA的一个bug®优化会导致生成代码的结果与MATLAB的数值不匹配。作为一种变通方法,通过将以下标志传递给配置对象来关闭优化(
cfg
),然后生成代码。cfg. gpconfig . compilerflags = ' -Xptxas -O0 '
预计NVIDIA将在CUDA工具包v9.1中修复此错误。
线程环境
使用MATLAB®在后台运行代码backgroundPool
或使用并行计算工具箱™加速代码ThreadPool
.
这个函数完全支持基于线程的环境。万博1manbetx有关更多信息,请参见在线程环境中运行MATLAB函数.
GPU数组
通过使用并行计算工具箱™在图形处理单元(GPU)上运行来加速代码。
使用注意事项和限制:
滤波核
h
必须是数据类型的向量或2-D矩阵双
.如果图像是使用GPU过滤的,那么
imfilter
类型的数据类型,使用单精度浮点或双精度浮点计算每个输出像素的值一个
.如果一个
包含双精度或uint32
值,然后imfilter
使用双精度值。对于所有其他数据类型,imfilter
使用单精度。如果一个
是整数还是逻辑数组imfilter
截断超出给定类型范围的输出元素,并舍入小数值。
有关更多信息,请参见图形处理器图像处理.
版本历史
R2006a之前介绍R2022b:万博1manbetx支持基于线程的环境
imfilter
现在支持万博1manbetx基于线程的环境。
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。万博1manbetx
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。