形态学操作"/>
图像滤波与形态学操作
图像滤波
==&mid=2247591782&idx=2&sn=0e8d98fe35ec1599affefd5551468bb9&chksm=fb54858acc230c9c18f0e1b042dfbc18bdee6f911c2eaf3f5228b1957384369963bec0f38793&scene=27
修改像素值,改变像素周围像素值:去噪、平滑、锐化
应用
* 去噪声
* 锐化、平滑
* 边缘检测
* 形态学处理:处理二值图像
* 图像重构:强化重点,弱化其他内容(语义上的去噪声)
分类
线性:通过将目标像素周围的像素进行加权平均或者求和,得到目标像素的灰度值。**卷积核**
* 均值滤波:
用每一个像素周围的像素的平均值代替自身
均值滤波与卷积
卷积
`cv2.filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]]) -> dst`
- src:输入图像
- ddepth:输出图像的深度,如果为-1,则输出图像的深度与输入图像一致。
- kernel:卷积核
- dst:输出图像
- anchor:卷积核中心的位置,默认值为(-1, -1),表示卷积核的中心点为卷积核的中心。
- delta:可选的增量,用于调整卷积的结果。
- borderType:边界填充方式,默认值为cv2.BORDER_DEFAULT。
import cv2img = cv2.imread("../../dataset/noise_lena.png", 0)
h, w = img.shape
# 定义滤波核
kernel_size = 11
kernel = np.ones((kernel_size, kernel_size), dtype=np.float32)
# 方案一
# 添加pand
padding = kernel_size // 2
# 对图像进行填充,这里使用了复制边界的方式
img_pad = cv2.copyMakeBorder(img, padding, padding, padding, padding, cv2.BORDER_REPLICATE)
print(img_pad.shape, img.shape)
# 构建输出图像
img_out = np.zeros((h, w), dtype=np.uint8)
# 进行卷积操作
for i in range(padding, h+padding):for j in range(padding, w+padding):# 对于每个像素,取它周围kernel_size*kernel_size个像素的平均值,作为它的输出值roi = img[i-padding:i+padding+1, j-padding:j+padding+1]img_out[i-padding, j-padding] = np.mean(roi, axis=(0, 1))
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(img_out)
plt.show()
# 方案二
# 定义均值卷积核
kernel = np.ones((kernel_size, kernel_size), np.float32) / kernel_size**2
# 对图像进行卷积操作
img_out = cv2.filter2D(img, -1, kernel)
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.subplot(1, 2, 2)
plt.imshow(img_out)
plt.show()
* 中值滤波(非线性):
处理椒盐噪声(雪花点)和斑点
* 高斯滤波:
去除高斯噪声,
更多推荐
图像滤波与形态学操作
发布评论