10 篇文章 7 订阅

平滑线性滤波器

1. 高斯噪声，
2. 白噪声，
3. 胡椒噪声，

1. 不(或者是非刻意)保边缘
2. 保边缘

均值滤波

1. 假如当前点为平滑区域的点，那么与周围像素一起算均值后，其值必定保持不变
2. 假如当前点为噪声点，那么与周围像素一起算均值后，其值必定减小，达到去噪效果
3. 如果当前点为边缘区域的点，那么与周围像素一起算均值后，其值必定减小，则使得边缘变得模糊

import cv2
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np

def show(f, s, a, b, c):
plt.subplot(a, b, c)
plt.imshow(f, "gray")
plt.axis('on')
plt.title(s)

# 高斯噪声函数单行
def wgn(x, snr):
snr = 10 ** (snr / 10.0)
xpower = np.sum(x ** 2) / len(x)
npower = xpower / snr
return np.random.randn(len(x)) * np.sqrt(npower)

def main():
rows, cols = original.shape
original_noise = original.copy().astype(np.float64)

# 生成噪声图像，信噪比为10
for i in range(cols):
original_noise[:, i] += wgn(original_noise[:, i], 10)

ImageDenoise = np.zeros(original.shape)
for i in range(1, rows - 1):
for j in range(1, cols - 1):
ImageDenoise[i, j] = np.mean(original[i - 1:i + 2, j - 1:j + 2] * mask)

plt.figure()
show(original, "original", 2, 2, 1)
show(original_noise, "original_noise", 2, 2, 2)
show(ImageDenoise, "ImageDenoise", 2, 2, 3)
show(original - ImageDenoise, "original - ImageDenoise", 2, 2, 4)
plt.show()

if __name__ == '__main__':
main()



有选择保边缘平滑滤波(保边缘)


# 添加椒盐噪声
def pepperNoise(count, I):
rows, cols = I.shape
newI = np.copy(I)
for i in range(count):
if i % 2 == 0:
newI[random.randint(0, rows - 1)][random.randint(0, cols - 1)] = 0
else:
newI[random.randint(0, rows - 1)][random.randint(0, cols - 1)] = 255
return newI

# 有选择保边缘平滑方法
def edgeFilter(noise):
rows, cols = noise.shape
deNoise = np.zeros(noise.shape)
# 生成滤波模板下标数组

maskPentTop = np.array([1, 1, 1, 1, 1, 1, 0, 1, 0]).reshape(3, 3)
maskPentLeft = np.array([1, 1, 0, 1, 1, 1, 1, 1, 0]).reshape(3, 3)
maskPentBottom = np.array([0, 1, 0, 1, 1, 1, 1, 1, 1]).reshape(3, 3)
maskPentRight = np.array([0, 1, 1, 1, 1, 1, 0, 1, 1]).reshape(3, 3)

maskHexagon1 = np.array([1, 1, 0, 1, 1, 1, 0, 1, 1]).reshape(3, 3)
maskHexagon2 = np.array([0, 1, 1, 1, 1, 1, 1, 1, 0]).reshape(3, 3)
maskHexagon3 = np.array([0, 1, 1, 1, 1, 1, 1, 1, 0]).reshape(3, 3)
maskHexagon4 = np.array([1, 1, 0, 1, 1, 1, 0, 1, 1]).reshape(3, 3)

for i in range(2, rows - 2):
for j in range(2, cols - 2):
array_var = []
maskList.append(noise[i - 2:i + 1, j - 2:j + 1] * maskHexagon1)
maskList.append(noise[i - 2:i + 1, j - 1:j + 2] * maskPentTop)
maskList.append(noise[i - 1:i + 2, j - 2:j + 1] * maskPentLeft)
maskList.append(noise[i - 1:i + 2, j - 1:j + 2] * maskRect)

array_var.append(np.var(noise[i - 2:i + 1, j - 2:j + 1] * maskHexagon1))
array_var.append(np.var(noise[i - 2:i + 1, j - 1:j + 2] * maskPentTop))
array_var.append(np.var(noise[i - 2:i + 1, j:j + 3] * maskHexagon2))
array_var.append(np.var(noise[i - 1:i + 2, j - 2:j + 1] * maskPentLeft))
array_var.append(np.var(noise[i - 1:i + 2, j - 1:j + 2] * maskRect))
array_var.append(np.var(noise[i - 1:i + 2, j:j + 3] * maskPentRight))
array_var.append(np.var(noise[i:i + 3, j - 2:j + 1] * maskHexagon3))
array_var.append(np.var(noise[i:i + 3, j - 1:j + 2] * maskPentBottom))
array_var.append(np.var(noise[i:i + 3, j:j + 3] * maskHexagon4))

return deNoise


• 6
点赞
• 16
收藏
觉得还不错? 一键收藏
• 打赏
• 0
评论
02-12 1633
12-29 379
06-07 1万+
09-02 5万+

“相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

¥2 ¥4 ¥6 ¥10 ¥20

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、C币套餐、付费专栏及课程。