今天学了中值滤波还是懵懵懂懂的,求一段加权中值滤波的原图与滤波图对比代码,不要那种直接用库实现的,想弄明白这个东西的道理
import numpy as np
import cv2 as cv
def median_filter(input_image, kernel, stride=1, padding=False):
"""
中值滤波/最大滤波/均值滤波
:param input_image: 输入图像
:param filter_size: 滤波器大小
:return:
"""
# 填充(默认为1)
padding_num = 1
if padding:
padding_num = int((kernel.shape[0] - 1) / 2)
input_image = np.pad(input_image, (padding_num, padding_num), mode="constant", constant_values=0)
out_image = np.copy(input_image)
# 填充后的图像大小
w, h = input_image.shape
print(input_image.shape, padding_num)
for i in range(padding_num, w - padding_num, stride):
for j in range(padding_num, h - padding_num, stride):
region = input_image[i - padding_num:i + padding_num + 1, j - padding_num:j + padding_num + 1]
print(i, j)
print(region.shape, kernel.shape)
# 确保 图像提取的局部区域 与 核大小 一致
assert (region.shape == kernel.shape)
# 中值滤波np.median, 最大值滤波 np.maximum 均值滤波: np.mean
out_image[i, j] = np.median(np.dot(region, kernel))
# 裁剪原图像大小
if padding:
out_image = out_image[padding_num:w - padding_num, padding_num:h - padding_num]
return out_image
if __name__ == '__main__':
# 随机浮点数, 模仿灰度图
src = cv.imread("chair.png")
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) # 图像二值化
cv.imshow("binary", binary)
cv.waitKey(0)
input_image = np.random.rand(16, 16)
input_image = binary
# 标准正态分布
kernel = np.random.rand(3, 3)
print(input_image.shape, kernel.shape)
output = median_filter(input_image, kernel)
print(output.shape)
cv.imshow("input_image", output)
cv.waitKey(0)
原图
滤波前
滤波后
您的采纳就是对我最大的动力,谢谢!!!
关注一下,共同学习。