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