php网站开发实例教程思考题,全椒县建设局网站,wordpress内部服务器,ui设计师为什么干不长久呢图像处理二 滤除噪声干扰三、噪声3.1图像噪声3.2 滤波3.2.1均值滤波#xff08;1#xff09;锚点#xff08;2#xff09;中心点#xff08;下面第3小点会详细解释#xff09;#xff08;3#xff09;核的大小奇偶数的区别#xff08;1#xff09;举例奇偶的例子1锚点2中心点下面第3小点会详细解释3核的大小奇偶数的区别1举例奇偶的例子2验证奇偶数的中心点[ 1 ]奇数[ 2 ] 偶数 4边界处理 3.2.2 方框滤波1实现方框滤波的函数2代码实践一下【1】图片演示对比 【2】利用随机数模拟一下实现过程【3】模拟中的参数 normalize0的演示先说一个plt显示的小东西ChatGPT给出的原因 代码解决方案【两种】 3.2.3 高斯滤波函数 3.2.4 中值滤波函数 3.2.5 双边滤波3.2.6 2D 卷积 滤除噪声干扰 图像平滑处理是一种用于减少图像噪声并模糊图像的技术使图像更加清晰或者更容易进行其他图像处理操作的方法之一。 图像平滑处理的目标之一就是消除或减少这些噪声使图像更清晰、更易于分析或更适合后续处理。不同的平滑技术可以在一定程度上模糊图像从而有助于平滑图像中的不规则性或噪声使图像看起来更加均匀和连续。
例如在数字图像中常见的噪声类型包括高斯噪声服从高斯分布的随机噪声、椒盐噪声随机出现的黑白点等。通过应用滤波器例如均值滤波、高斯滤波、中值滤波等可以有效地消除或减轻这些噪声。
虽然图像平滑处理的主要目的是滤除噪声但它也可能会在某些情况下减少图像的细节或轮廓。因此在应用图像平滑处理时需要根据特定的应用场景和需求权衡噪声滤除和图像细节保留之间的平衡。
三、噪声
OpenCV中噪声通常指的是图像中的不希望的、随机的、无规律的像素值变化。这些变化可能是由于传感器不完美、环境条件不稳定、数据传输过程中的干扰等原因引起的。
噪声可能以各种形式存在包括高斯噪声、椒盐噪声等。3.1图像噪声
由于图像采集、处理、传输等过程不可避免的会受到噪声的污染,妨碍人们对图像理解及分析处理。常见的图像噪声有高斯噪声、椒盐噪声等。 高斯噪声Gaussian Noise 这是一种呈正态分布的噪声它使图像的像素值随机地偏离其原始值。 高斯噪声是指它的概率密度函数服从高斯分布即正态分布的一类噪声。如果一个噪声它的幅度分布服从高斯
高斯噪声是指噪声密度函数服从高斯分布的一类噪声。由于高斯噪声在空间和频域中数学上的易处理性,这种噪声(也称为正态噪声)模型经常被用于实践中。 椒盐噪声Salt-and-Pepper Noise 这是一种由于图像传感器故障或信号传输问题引起的噪声表现为图像中突然出现的明亮或暗的像素。 椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。
椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。例如失效的感应器导致像素值为最小值饱和的感应器导致像素值为最大值。 泊松噪声Poisson Noise 这是由于光子的随机性引起的噪声通常在低光条件下出现。 均匀噪声Uniform Noise 这是在像素值上引入均匀分布的随机噪声。 3.2 滤波 我们用在尽量保证不将图像原本信息破坏的情况下用“滤波”去处理在图像中“突出”的“不平整”的地方抹除过滤。
3.2.1均值滤波
在OpenCV中均值滤波是一种常见的图像滤波技术用于平滑图像并减少噪声。均值滤波的基本思想是用像素周围邻域的平均值来替代每个像素的原始值。
cv2.blur(src, ksize, anchor, borderType) src 输入图像 ksize卷积核的大小 anchor默认值(-1-1)表示核中心 borderType 边界类型 cv2.blur 函数接受两个参数要进行滤波的图像和核的大小。核的大小应该是正奇数因为它需要有一个中心点。核的大小越大平滑效果越明显。 1锚点
在函数 cv2.blur 或 cv2.GaussianBlur 中锚点的默认值是 -1, -1这意味着它将被设置为核的中心。这是因为核的中心通常位于核的尺寸的中间位置。
在使用这些函数时你可以通过设置 anchor 参数来指定锚点的位置。例如如果你希望核的中心位于左上角你可以将 anchor 设置为 (0, 0)。
import cv2
import numpy as np# 读取图像
image cv2.imread(input_image.jpg)# 指定滤波器的大小核的大小通常为奇数
kernel_size 5
anchor_point (0, 0) # 锚点设置为左上角# 应用均值滤波
blur cv2.blur(image, (kernel_size, kernel_size), anchoranchor_point)# 显示原始图像和经过均值滤波后的图像
cv2.imshow(Original Image, image)
cv2.imshow(Blurred Image, blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
通过将 anchor_point 设置为 (0, 0)我们将核的中心点放置在了左上角你可以尝试不同的锚点位置以查看它对滤波结果的影响。在大多数情况下使用默认值 -1, -1 将中心点放在核的中间通常是合适的。
2中心点下面第3小点会详细解释 使用奇数大小的核的优势在于它确保了核的中心点正好位于一个像素上这有助于保持图像的对称性减少不均匀平滑的可能性。此外奇数大小的核通常更容易理解和调整因为中心点确实存在不会落在像素之间。 布OpenCV中当anchor参数设置为(-1, -1)时均值滤波的卷积核kernel通常是一个正方形的核并且中心点位于核的几何中心。对于一个大小为(n,n)的核结构中心点将位于第(n/2,n/2)个像素位置。 奇数大小的核 对于奇数大小的卷积核中心点就是卷积核的中心位置。例如对于3x3的卷积核中心点就在(1, 1)的位置。 偶数大小的核 对于偶数的核结构大小例如对于4x4的核结构你可以通过在每个像素中心周围插入一个额外的像秦来创建一个5x5的核结构并将锚点设置为(-1,-1)的位置。然后进行均值滤波中心点仍然位于核结构的几何中心。
总的来说当anchor参数为(-1, -1)时OpenCV会根据卷积核的大小选择合适的默认中心点位置。 对于一个6x6的核结构来说如果你希望以原点(0,0)为参考锚点设置为(-1,-1)那么核结构的中心点将位于(33)。 即L:6X6的图像想象成7x7的找见7x7的中心点却不要真的认为是7x7的就行吗所以偶数的卷积核可能导致不均匀的平滑效果。 3核的大小奇偶数的区别
在使用均值滤波时核的大小最好选择奇数。这是因为滤波器的中心元素位于核的中心而选择奇数大小的核可以确保中心点周围有相等数量的像素。如果选择偶数大小的核中心点就会落在像素之间可能导致不均匀的平滑效果。
如果你使用偶数大小的核OpenCV会向下取整来选择核的中心点位置。例如如果你指定核的大小为4x4实际上中心点将位于(2, 2)处。这可能会导致图像平滑效果的不均匀性。
1举例奇偶的例子
我们利用随机生成的点数观看如何随机的变成平滑的把某点周围差别较大的替换。
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltxnp.random.randint(0,256,(15,15),dtypenp.uint8)x10cv.blur(x,(3,3))
x100cv.blur(x,(4,4))图像x
图像x10
图像x100
2验证奇偶数的中心点
[ 1 ]奇数 [ 2 ] 偶数
1随机一个图 2随机二图
4边界处理
OpenCV 提供了多种边界处理方式我们可以根据实际需要选用不同的边界处理模式。
# 因此cv2.blur()的一般形式为
dst cv2.blur( src, ksize,)3.2.2 方框滤波
方框滤波Box Filter是一种基本的图像滤波技术也称为均值滤波。它的原理很简单就是用一个固定大小的方框或者说是矩形窗口覆盖图像的每个像素然后取这个窗口内所有像素的平均值来替代原来的像素值。这种操作主要用于平滑图像去除图像中的噪声同时也会使图像变得模糊。 在方框滤波中与均值滤波的主要区别在于是否进行归一化。均值滤波通常涉及计算邻域像素值的平均值而方框滤波允许用户选择是否对平均值进行归一化。 【1】若计算的是邻域像素值的均值,就如同均值滤波像素值需要除以核结构的M和N长宽乘积 【2】如果仅仅计算的是邻域像素值之和不用管他每个像素值 1实现方框滤波的函数
cv2.boxFilter() 是 OpenCV 中用于实现方框滤波的函数。下面是这个函数的基本介绍
cv2.boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) → dstsrc: 输入图像数据类型应为单通道浮点型或整型。ddepth: 输出图像的深度通常设置为-1表示与输入图像的深度相同。ksize: 方框滤波核的大小指定一个 (width, height) 的元组。dst: 可选参数输出图像。anchor: 可选参数表示锚点的位置默认为(-1, -1)即位于核的中心。normalize: 可选参数如果为 True则对输出图像进行归一化处理默认为 True。 当 normalize1 时表示进行归一化处理。在这种情况下cv2.boxFilter() 函数将邻域像素值的和除以邻域的面积得到平均值作为输出图像中对应位置的像素值。 这样做的目的是保持输出图像的整体亮度防止过度增加或减少像素值。 当 normalize0 时表示不进行归一化处理。在这种情况下cv2.boxFilter() 函数直接使用邻域像素值的和作为输出图像中对应位置的像素值而不进行平均化处理。 这样可以保留邻域像素值的总和可能导致输出图像的整体亮度有所改变但有时这种处理方式也是有用的特别是在一些特定的图像处理场景中。 这种灵活性使得方框滤波在一些特定的图像处理场景中具有更多的应用选择因为有时候需要保留邻域像素值的总和而不是其平均值。这样的选择取决于具体的图像处理需求。 borderType: 可选参数边界处理的方式默认为 cv2.BORDER_DEFAULT。
这个函数实现了方框滤波的核心逻辑。方框滤波的原理是在图像的每个像素位置用一个固定大小的方框覆盖该像素周围的区域然后取这个区域内所有像素值的平均值作为该位置的像素值。这样可以达到平滑图像的效果。
下面是一个简单的例子演示如何使用 cv2.boxFilter() 进行方框滤波
import cv2
import numpy as np# 读取图像
image cv2.imread(input_image.jpg)# 定义滤波器的大小这里使用一个5x5的方框
kernel_size (5, 5)# 进行方框滤波
result cv2.boxFilter(image, -1, kernel_size)# 显示原始图像和滤波后的图像
cv2.imshow(Original Image, image)
cv2.imshow(Box Filter Result, result)
cv2.waitKey(0)
cv2.destroyAllWindows()通过调整 kernel_size 和其他参数你可以根据需要对图像进行不同程度的方框滤波。
2代码实践一下
【1】图片演示
原图 import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltimgxcv.imread(img/test_img.jpg)
clurxcv.blur(imgx,(3,3))
r10cv.boxFilter(imgx,-1,(3,3),normalize1)
r100cv.boxFilter(imgx,-1,(3,3),normalize0)
plt.imshow(imgx[:,:,::-1])
print(imgx)#%%
print(clurx)plt.imshow(clurx[:,:,::-1])
print(clurx)#%%
print(r10)
plt.imshow(r10[:,:,::-1])
print(r10)#%%
print(r100)
plt.imshow(r100[:,:,::-1], vmin0, vmax255)
print(r100)对比
均值滤波和normalize1 时表示进行归一化处理。在这种情况下cv2.boxFilter() 函数将邻域像素值的和除以邻域的面积得到平均值作为输出图像中对应位置的像素值。
# 利用判断仅仅返回一个判断矩阵
# 表示其中每一个元素是否对应相等。
print((clurxr10).all())
print((clurxr10).any())【2】利用随机数模拟一下实现过程
import numpy as np
import cv2 as cv
import matplotlib.pyplot as pltxnp.random.randint(0,256,(15,15),dtypenp.uint8)
x10cv.blur(x,(3,3))plt.imshow(x,cmapplt.cm.gray)
print(x)
print(x)r10cv.boxFilter(x,-1,(3,3),normalize1)
r100cv.boxFilter(x,-1,(3,3),normalize0)plt.imshow(r10,cmapplt.cm.gray)
print(r10)【3】模拟中的参数 normalize0的演示
先说一个plt显示的小东西
我们需要限制其最大数否则会无限的黑数字小的就是黑了 当你使用 cmap‘gray’ 时Matplotlib 期望输入是一个类似于 NumPy 数组的 2D 数组结构。在列表的情况下它将每个内部列表解释为图像的一行并尝试根据每行中的强度值分配不同的灰度值。
ChatGPT给出的原因
当 vmin 和 vmax 的值相同时颜色映射范围被压缩为一个点即单一值。在灰度图像的情况下这意味着只有一个颜色被用于表示所有的像素值而这个颜色通常是黑色。 换换数据证明
代码
import numpy as np
import matplotlib.pyplot as plty [[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255],[255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255]]norm plt.Normalize(vmin0,vmax255)plt.imshow(y, cmapgray, normnorm)
plt.colorbar(ticks[0, 255], format%d) # 设置ticks和format
plt.show() 其中全是先255的时候且有norm plt.Normalize()他这个plt.colorbar()在右边显示的是2~280的数值呢 解决方案【两种】
第一
plt.imshow(y_np, cmapgray, vmin0, vmax255)import numpy as np
import matplotlib.pyplot as plt# 创建一个二维数组最小值和最大值相同
data np.array([[3, 3, 3],[3, 3, 3],[3, 3, 3]])# 使用 imshow 显示图像vmin 和 vmax 相同
plt.imshow(data, cmapviridis, vmin3, vmax3)# 显示颜色条
plt.colorbar()# 显示图像
plt.show()
实际上由于整个颜色映射范围被压缩成一个点无论数据的具体值如何颜色都将是相同的。这在可视化上失去了区分性因为整个图像都是同一种颜色。 这涉及到plt.imshow()函数的默认行为以及颜色映射colormap的工作方式。 默认行为 默认情况下plt.imshow() 将数据线性映射到颜色映射的范围。对于灰度图颜色映射的默认范围是 [0, 1]因此如果你不指定 vmin 和 vmaxplt.imshow() 会将数据线性映射到 [0, 1] 的范围。 颜色映射范围 当你指定 vmin0 和 vmax255 时你告诉 plt.imshow() 将数据映射到 [0, 255] 的范围这与灰度图像中的像素值范围一致。这会使得颜色映射正确显示黑白灰。
总之通过设置 vmin0 和 vmax255你确保了数据与颜色映射范围的一致性从而正确地显示了图像。如果你使用默认设置plt.imshow() 将尝试自动归一化数据并可能导致显示不准确。
第二种
plt.imshow(y_np, cmapgray_r)3.2.3 高斯滤波
高斯滤波是一种线性平滑滤波技术它使用高斯函数来计算邻域内各个像素的权重以进行图像的平滑处理。在高斯滤波中离中心点越远的像素拥有更小的权重而中心点的权重通常会被增强。 高斯滤波的主要优点之一是它能够在平滑图像的同时有效地保留图像的边缘信息。这是因为离中心点较远的像素在计算平均值时得到的权重较小从而对图像边缘的影响减小。
函数
cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]])其中
src输入图像可以是灰度图像或彩色图像。ksize高斯核的大小必须是正奇数例如3、5、7…。sigmaXX轴方向上的高斯核标准差。dst输出图像可选参数。如果提供了该参数将把结果存储在这个图像中。sigmaYY轴方向上的高斯核标准差可选参数。如果未提供将默认与 sigmaX 相同。borderType边界处理类型可选参数。默认为 cv2.BORDER_DEFAULT。
使用示例
import cv2
import numpy as np# 读取图像
img cv2.imread(input_image.jpg)# 执行高斯滤波
ksize (5, 5) # 高斯核大小为 5x5
sigmaX 0 # X轴方向上的标准差
blurred_img cv2.GaussianBlur(img, ksize, sigmaX)# 显示原始图像和处理后的图像
cv2.imshow(Original Image, img)
cv2.imshow(Blurred Image, blurred_img)
cv2.waitKey(0)
cv2.destroyAllWindows()在这个示例中GaussianBlur 函数将图像进行了高斯滤波ksize 设置为 (5, 5)sigmaX 设置为 0即只在X轴方向进行滤波。函数返回一个新的图像即经过高斯滤波处理的图像。
3.2.4 中值滤波
中值滤波是一种非线性滤波技术用于去除图像中的噪声。与线性滤波方法例如均值滤波和高斯滤波不同中值滤波不是基于像素的加权平均而是基于邻域内像素值的排序。
中值滤波的基本步骤如下
定义一个滑动窗口通常是正方形或矩形的窗口在图像上进行扫描。将窗口内的像素值按照大小进行排序。将中间值中位数作为窗口中心像素的新值。
中值滤波的优势在于它对图像中的椒盐噪声等离群值具有很好的去除效果。因为中值是在排序后取的它不受极端值的影响而均值滤波等线性滤波对异常值比较敏感。
中值滤波的一些特点和注意事项 去除椒盐噪声 中值滤波在去除椒盐噪声方面效果显著这种噪声是图像中出现的亮或暗的离群值。 保留边缘 相对于线性滤波方法中值滤波在保留图像边缘方面更为出色因为它不会导致像素值的平均化。 计算开销 与线性滤波相比中值滤波的计算开销较大特别是对于大型窗口。这是因为它需要对像素进行排序。
使用Python中的OpenCV库进行中值滤波的示例
import cv2
import numpy as np# 读取图像
img cv2.imread(input_image.jpg)# 中值滤波
median_blur cv2.medianBlur(img, 5) # 第二个参数是窗口大小必须是正奇数# 显示原始图像和中值滤波后的图像
cv2.imshow(Original Image, img)
cv2.imshow(Median Blur, median_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()在这个示例中cv2.medianBlur 函数对图像进行了中值滤波窗口大小为5x5。
函数
cv2.medianBlur 函数是OpenCV中用于进行中值滤波的函数其基本语法如下
dst cv2.medianBlur(src, ksize)其中
src输入图像可以是灰度图像或彩色图像。ksize指定中值滤波的窗口大小必须是正奇数。
该函数返回一个经过中值滤波处理后的图像存储在 dst 变量中。
使用示例
import cv2# 读取图像
img cv2.imread(input_image.jpg)# 中值滤波
ksize 5 # 窗口大小必须是正奇数
median_blur cv2.medianBlur(img, ksize)# 显示原始图像和中值滤波后的图像
cv2.imshow(Original Image, img)
cv2.imshow(Median Blur, median_blur)
cv2.waitKey(0)
cv2.destroyAllWindows()在这个示例中cv2.medianBlur 函数对图像进行了中值滤波窗口大小为5x5。中值滤波是一种有效的去除图像噪声的方法尤其对于椒盐噪声等离群值具有很好的去除效果。
3.2.5 双边滤波
双边滤波Bilateral Filtering是一种非线性滤波技术它可以在平滑图像的同时保留图像的边缘信息。这个滤波方法考虑到了空间域和灰度值域两个方面因此对于图像中存在的不同纹理和边缘有着较好的处理效果。
基本的双边滤波函数如下
dst cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace)其中
src输入图像可以是灰度图像或彩色图像。d控制滤波器的邻域直径。如果设置为 0则根据 sigmaSpace 计算邻域直径。sigmaColor颜色空间中的标准差用于控制颜色相似性。数值越大颜色相似性越高。sigmaSpace坐标空间中的标准差用于控制空间相似性。数值越大空间相似性越高。
双边滤波的一个重要特点是它不仅考虑了像素之间的空间距离空间域还考虑了它们在灰度值上的相似性灰度值域。这使得双边滤波在平滑图像的同时尽可能地保留了图像的边缘和细节信息。
使用示例
import cv2# 读取图像
img cv2.imread(input_image.jpg)# 双边滤波
d 9 # 邻域直径
sigmaColor 75 # 颜色空间标准差
sigmaSpace 75 # 空间域标准差
bilateral_filtered_img cv2.bilateralFilter(img, d, sigmaColor, sigmaSpace)# 显示原始图像和双边滤波后的图像
cv2.imshow(Original Image, img)
cv2.imshow(Bilateral Filtered Image, bilateral_filtered_img)
cv2.waitKey(0)
cv2.destroyAllWindows()在这个示例中cv2.bilateralFilter 函数对图像进行了双边滤波参数 d、sigmaColor 和 sigmaSpace 可以根据需要调整以获得最佳效果。 您对双边滤波的描述非常准确。双边滤波是一种考虑空间距离和颜色信息的非线性滤波方法它在平滑图像的同时保留了边缘信息。让我们进一步强调双边滤波的一些关键特点 空间距离加权 与高斯滤波不同双边滤波不仅考虑像素在空间上的距离而且考虑它们在颜色空间中的距离。像素之间的空间距离越近权重越大像素之间的颜色差别越小权重越大。 颜色信息保护 双边滤波在处理图像时注重保护颜色边缘。当处理到颜色变化较大的区域时权重减小从而减少平滑效果保留颜色边缘信息。 边缘保护 由于权重与空间距离和颜色距离的组合有关双边滤波能够有效地保护图像中的边缘信息不会导致边缘模糊。 计算开销较大 与线性滤波方法相比双边滤波的计算开销较大因为对于每个像素都需要计算其 与周围像素的空间距离和颜色距离这可能导致一些性能上的牺牲。 对于白色边缘点的滤波过程给予白色点较大的权重而对于黑色点由于颜色差异大权重被设置为较小甚至为零。这确保了在平滑过程中对于边缘处的白色点其实际颜色并没有受到太大的影响仍然保持白色从而保留了边缘信息。 同样对于黑色边缘点的滤波过程给予黑色点较大的权重而对于白色点由于颜色差异权重也被设置为较小或零。这样就保证了在平滑过程中对于边缘处的黑色点其实际颜色仍然保持为黑色从而保留了边缘信息。 总体而言双边滤波通过综合考虑空间距离和颜色距离以及相应的权重能够在平滑图像的同时有效地保护边缘信息使得图像保持清晰。这使得双边滤波在一些图像处理任务中特别有用例如去噪声、平滑图像并保留边缘。 总体而言双边滤波通过综合考虑空间距离和颜色距离以及相应的权重能够在平滑图像的同时有效地保护边缘信息使得图像保持清晰。这使得双边滤波在一些图像处理任务中特别有用例如去噪声、平滑图像并保留边缘。 3.2.6 2D 卷积
2D卷积二维卷积是一种图像处理和计算机视觉中常用的操作用于图像滤波、特征提取等任务。它的基本思想是通过将一个小的核或滤波器在图像上滑动将核的权重与图像中对应位置的像素值相乘并将结果相加从而得到卷积的输出。
在OpenCV中cv2.filter2D 函数用于执行2D卷积操作。这个函数的基本语法如下
dst cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])其中
src输入图像可以是单通道灰度图像或多通道彩色图像。ddepth输出图像的深度通常设置为 -1 表示与输入图像的深度相同。kernel卷积核是一个单通道NumPy数组或矩阵。如果想在处理彩色图像时让每个通道使用不 同的核则必须将彩色图像分解后使用不同的核完成操作。dst可选参数输出图像。如果提供了该参数将把结果存储在这个图像中。anchor可选参数表示卷积核的中心位置默认为 (-1, -1)即卷积核的中心。delta可选参数表示在卷积计算结果之前可选的加法操作默认为 0。borderType可选参数表示图像边界的处理方式默认为 cv2.BORDER_DEFAULT。
使用示例
import cv2
import numpy as np# 读取图像
img cv2.imread(input_image.jpg, cv2.IMREAD_GRAYSCALE)# 定义卷积核
kernel np.array([[1, 0, -1],[1, 0, -1],[1, 0, -1]])# 进行2D卷积
result cv2.filter2D(img, -1, kernel)# 显示原始图像和卷积后的图像
cv2.imshow(Original Image, img)
cv2.imshow(2D Convolution Result, result)
cv2.waitKey(0)
cv2.destroyAllWindows()在这个示例中cv2.filter2D 函数用卷积核 kernel 对灰度图像 img 进行了2D卷积操作得到了卷积后的结果 result。这是一种基本的卷积操作可以通过调整卷积核的权重来实现不同的滤波效果。