赞
踩
平滑线性滤波器的输出(响应)是包含在滤波器模板邻域内的像素简单平均值。这些滤波器有时也称为均值滤波器。它使用滤波器模板确定的邻域内像素的平均灰度值代替图像中每个像素的值,这种处理的结果降低了图像灰度的尖锐变化。由于典型的随机噪声由灰度级的急剧变化组成,因此,常见的平滑处理应用就是降低噪声。然而,由于图像边缘也是由图像灰度尖锐变化带来的特性,所以均值滤波处理还是存在着不希望有的边缘模糊的负面效应。
代码实现:
import cv2 as cv import numpy as np import math import copy from skimage import io import random def spilt(a): if a / 2 == 0: x1 = x2 = a / 2 else: x1 = math.floor(a / 2) x2 = a - x1 return -x1,x2 def salt_and_pepper_noise(img, proportion=0.05): noise_img = img height, width = noise_img.shape[0], noise_img.shape[1] num = int(height * width * proportion) # 多少个像素点添加椒盐噪声 for i in range(num): w = random.randint(0, width - 1) h = random.randint(0, height - 1) if random.randint(0, 1) == 0: noise_img[h, w] = 0 else: noise_img[h, w] = 255 return noise_img def original(i, j, k, a, b, img): x1, x2 = spilt(a) y1, y2 = spilt(b) temp = np.zeros(a * b) count = 0 for m in range(x1, x2): for n in range(y1, y2): if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1: temp[count] = img[i, j, k] else: temp[count] = img[i + m, j + n, k] count += 1 return temp def average_function(a, b, img): img0 = copy.copy(img) for i in range(0, img.shape[0]): for j in range(2, img.shape[1]): for k in range(img.shape[2]): temp = original(i, j, k, a, b, img0) img[i, j, k] = int(np.mean(temp)) return img if __name__ == "__main__": img = io.imread(r"E:/pythontupian/5.jpg") cv.imshow("original", img) noise_img = salt_and_pepper_noise(img) cv.imshow("noise_img", noise_img) ave_img = average_function(3, 3, copy.copy( noise_img)) # (3,3)滤波器大小 cv.imshow("ave_img", ave_img) cv.waitKey(0) cv.destroyAllWindows()
结果展示:
原图
加椒盐噪声后
均值滤波后
空间均值处理的一个重要应用是为了对感兴趣的物体得到一个粗略而模糊的一幅图像,这样,那些较小物体的灰度就与背景混合在一起了,较大的物体变的像“斑点”而易于检测。可以看出,均值滤波就是得到了一幅模糊的图像,在降低噪声方面效果不是很好。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。