文章目录
- 1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理
- 2、给图像边缘增加边框
- 3、对图片进行阈值化操作
1、对有椒盐噪声的图片进行均值、方框、高斯、中值滤波处理
-
均值滤波
- cv2.blur是 OpenCV 库中的一个函数,用于对图像进行均值模糊处理。这个函数通过计算图像中每个像素点周围邻域内像素值的平均值,来替换该像素点的值,从而实现模糊效果。这种模糊处理对于去除图像中的噪声或进行图像预处理很有用。
- 参数说明:
- dst = cv2.blur(src, ksize, dst=None, anchor=None, borderType=None)
- src: 输入图像,可以是任意数量的单通道或多通道图像。
- ksize(重要参数): 模糊核的大小,格式为 (宽度, 高度)。宽度和高度都应该是正数和奇数。
- dst: 输出图像,与输入图像具有相同的类型和大小。这个参数是可选的。
- anchor: 锚点;它表示核中心点的位置。默认值是 (-1, -1),表示核的中心位于其几何中心。
- borderType: 边界像素的外推方法。默认是 cv2.BORDER_DEFAULT。
-
方框滤波
- cv2.boxFilter 是 OpenCV 库中的一个函数,用于对图像进行盒式滤波(Box Filtering)。盒式滤波实际上是一种特殊的均值滤波,其中滤波核中的每个元素都相等(通常是1),并且在应用滤波时会进行归一化(即除以核内元素的总数),以确保输出图像的亮度保持不变。然而,在某些实现中,特别是在 OpenCV 的 cv2.boxFilter() 函数中,你可以选择是否进行归一化。
- 参数说明:
- dst = cv2.boxFilter(src, ddepth, ksize, normalize=None, anchor=None, borderType=None)
- src: 输入图像。
- ddepth(重要参数): 输出图像的所需深度。如果为 -1,则输出图像将与输入图像具有相同的深度,但请注意归一化行为的差异(尽管 normalize 参数已被废弃)。对于大多数用途,你可能希望将 ddepth 设置为 cv2.CV_8U、cv2.CV_16U、cv2.CV_16S、cv2.CV_32F 或 cv2.CV_64F 之一,以明确指定输出图像的位数。
- ksize(重要参数): 滤波核的大小,格式为 (宽度, 高度)。宽度和高度都应该是正数和奇数。
- normalize(已废弃): 布尔值,指示是否对结果进行归一化。在 OpenCV 4.x 及更高版本中,此参数已被废弃,因为归一化行为现在通过 ddepth 参数隐式控制。但是,由于它已被废弃,因此在使用新版本时应忽略此参数。
- anchor: 锚点;它表示核中心点的位置。默认值是 (-1, -1),表示核的中心位于其几何中心。
- borderType: 边界像素的外推方法。
-
高斯滤波
- cv2.GaussianBlur 是 OpenCV 库中用于对图像进行高斯模糊的函数。高斯模糊是一种广泛使用的图像模糊技术,它通过为图像中的每个像素点计算其周围像素点的加权平均值来工作,其中权重由高斯函数给出。这种模糊方法在处理图像时能够有效地减少图像噪声和细节层次,同时保持边缘相对清晰。
- 参数说明:
- dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY=0, dst=None, borderType=None)
- src: 输入图像。
- ksize(重要参数): 高斯核的大小,(宽度, 高度)。宽度和高度都应为正数和奇数,或者可以是从零传递的 (sigmaX, sigmaY)。然后从这些 sigma 值中导出窗口大小。如果 sigma 为零,则它们从 ksize.width 和 ksize.height 中计算得出;否则,ksize.width 和 ksize.height 被忽略。
- sigmaX: X 方向上的高斯核标准偏差。
- sigmaY: Y 方向上的高斯核标准偏差;如果 sigmaY 为零,则与 sigmaX 相同;如果两者都为零,则分别从 ksize.width 和 ksize.height 中计算得出。对于大多数用途,可以将 sigmaX 和 sigmaY 设置为相同的值。
- dst: 输出图像;这个参数是可选的。
- borderType: 像素外推法的标志;默认值是 cv2.BORDER_DEFAULT。
-
中值滤波
- cv2.medianBlur 是 OpenCV 库中用于对图像进行中值模糊的函数。中值模糊是一种非线性的滤波技术,它用图像中每个像素点周围邻域内像素值的中位数来替换该像素点的值。这种方法对于去除椒盐噪声(salt-and-pepper noise)特别有效,因为它基于排序操作而不是平均值计算,因此能够更好地保持边缘信息。
- 参数说明:
- dst = cv2.medianBlur(src, ksize)
- src: 输入图像,必须是单通道图像(灰度图)或每个通道分别处理的多通道图像。
- ksize(重要参数): 中值滤波核的大小,必须是大于1的奇数。
# 创建制造椒盐噪声的函数 def add_peppersalt_noise(ManBa, n=10000):result = ManBa.copy()w, h = ManBa.shape[:2] # 获取图片的高和宽for i in range(n): # 生成n个椒盐噪声x = np.random.randint(1, w)y = np.random.randint(1, h)if np.random.randint(0, 2) == 0:result[x, y] = 0else:result[x, y] = 255return resultMB = cv2.imread('kobe.jpg') # 获取原图 ManBa = cv2.resize(MB, dsize=None, fx=0.4, fy=0.4) # 设置图片大小 cv2.imshow('sro', ManBa) cv2.waitKey(0)noise = add_peppersalt_noise(ManBa) # 生成椒盐噪声图片 cv2.imshow('noise', noise) cv2.waitKey(0)"""均值滤波 blur """ blur_1 = cv2.blur(noise, (3, 3)) # 卷积核为3,3 cv2.imshow('blur_1', blur_1) cv2.waitKey(0)"""方框滤波 boxFilter """ boxFilter_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True) # 深度为-1, 滤波核为3*3 cv2.imshow('boxFilter_1', boxFilter_1) cv2.waitKey(0)"""高斯滤波 GaussianBlur """ GaussianBlur_1 = cv2.GaussianBlur(noise, (3, 3), 1)# 高斯核大小为3*3,高斯核标准偏差为1 cv2.imshow('GaussianBlur_1', GaussianBlur_1) cv2.waitKey(0)"""中值滤波 medianBlur """ medianBlur_1 = cv2.medianBlur(noise, 3) # 滤波核为3*3 cv2.imshow('medianBlur_1', medianBlur_1) cv2.waitKey(0) cv2.destroyAllWindows()
-
原图和椒盐噪声图
-
均值滤波和方框滤波处理后的图
-
高斯滤波和中值滤波处理后的图
-
由结果可以看出中值滤波对有椒盐噪声的图片处理的效果最好
2、给图像边缘增加边框
-
cv2.copyMakeBorder是OpenCV库中的一个函数,用于给图像添加额外的边界(padding)
-
它有以下几个参数:
-
cv2.copyMakeBorder(src, top, bottom, left, right, borderType, value=None)
- src:要扩充边界的原始图像
- top, bottom, left, right:相应方向上的边框宽度(以像素为单位)
- borderType:定义要添加边框的类型,它可以是以下的一种:
- cv2.BORDER_CONSTANT:添加的边界框像素值为常数(需要再额外给定一个参数 value -> 指定边框的颜色值)
- cv2.BORDER_REFLECT:添加的边界框像素将是边界元素的镜面反射,类似于-hgfedcba|abcdefgh|hgfedcba (交界处也复制了)
- cv2.BORDER_REFLECT101 或 cv2.BORDER_DEFAULT:和上面类似,但是有一些细微的不同,类似于hgfedcb|abcdefgh|gfedcba (交界处删除了)
- cv2.BORDER_REPLICATE:使用最边界的像素值代替,类似于aaaaaaa|abcdefgh|hhhhhhh
- cv2.BORDER_WRAP:上下两边替换,左右两边替换
- value(可选):当 borderType 为 cv2.BORDER_CONSTANT 时,需要指定边框的颜色,默认为黑色。这是一个与源图像具有相同通道数的数组。
import cv2 MB = cv2.imread('kobe.jpg') # 读取原始图片 ManBa = cv2.resize(MB, dsize=None, fx=0.5, fy=0.5) # 调整一下图片大小(可选,根据原始图片大小决定) top, bottom, left, right = 50, 50, 50, 50 # 设置各方向上的边框宽度constant = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_CONSTANT, value=255) reflect = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REFLECT) reflect101 = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REFLECT101) replicate = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_REPLICATE) wrap = cv2.copyMakeBorder(ManBa, top, bottom, left, right, borderType=cv2.BORDER_WRAP)cv2.imshow('yuantu', ManBa) cv2.waitKey(0) cv2.imshow('constant', constant) cv2.waitKey(0) cv2.imshow('reflect', reflect) cv2.waitKey(0) cv2.imshow('reflect101', reflect101) cv2.waitKey(0) cv2.imshow('replicate', replicate) cv2.waitKey(0) cv2.imshow('wrap', wrap) cv2.waitKey(0)
3、对图片进行阈值化操作
-
cv2.threshold 是 OpenCV 中用于进行阈值化操作的一个非常基础的函数。阈值化是一种简单的图像分割技术,它将图像转换成黑白图像(或二值图像),或者将图像划分为几个区域。这种技术通常用于预处理图像,以便进行进一步的分析,如边缘检测、图像分割等
-
它有以下几个参数:
-
cv2.threshold(src, thresh, maxval, type, dst=None)
- src:要进行阈值处理的源图像,应该是灰度图。
- thresh:阈值的具体值。
- maxval:当像素值超过(或有时是小于,取决于阈值类型)阈值时应该被赋予的新值。
- type:阈值化操作的类型。这个参数决定了函数的行为。常用的值有:
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
- cv2.THRESH_OTSU 和 cv2.THRESH_TRIANGLE 用于自动计算最佳阈值(此时thresh参数被忽略,仅作为占位符)。
- dst:这个参数是可选的,用于存储函数的输出图像。
MB = cv2.imread('kobe.jpg', cv2.IMREAD_GRAYSCALE) # 读取图片,并转换为灰度图 ManBa = cv2.resize(MB, dsize=None, fx=0.4, fy=0.4) # 设置图片大小ret, binary = cv2.threshold(ManBa, 155, 255, cv2.THRESH_BINARY) ret1, binaryinv = cv2.threshold(ManBa, 155, 255, cv2.THRESH_BINARY_INV) ret2, trunc = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TRUNC) ret3, tozero = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TOZERO) ret4, tozeroinv = cv2.threshold(ManBa, 155, 255, cv2.THRESH_TOZERO_INV)cv2.imshow('yuantu', ManBa) cv2.waitKey(0) cv2.imshow('binary', binary) cv2.waitKey(0) cv2.imshow('binaryinv', binaryinv) cv2.waitKey(0) cv2.imshow('trunc', trunc) cv2.waitKey(0) cv2.imshow('tozero', tozero) cv2.waitKey(0) cv2.imshow('tozeroinv', tozeroinv) cv2.waitKey(0)