中值滤波,顾名思义就是取中间值来代替原来像素值的过程。定义一个3*3的模板,在这个模板中总共有9个像素,我们把这9个像素进行排序。排序完之后,我们选取中间的一个值替换掉原来的像素值。还是通过源代码的形式来给大家实现这样一个过程。
collect是一个数组。这个数组中装载的就是这9个元素。我们要对9个元素进行排序,并获取它的中间值。所以它的大小为9,数据类型仍然是uint8。我们使用两层for循环的形式来遍历图像上的每一个点。k描述的是下面我们即将装取数据的下标。我们使用m和n来表示当前的这个3*3模板的行和列。既然是一个3*3,所以我们从-1开始,到2结束。那么它包括-1、0、1这样三个点。
两层for循环完之后,3*3的模板我们已经完成了当前所有像素到collect的数值中的装载。
我们使用for循环来遍历一下当前的9个元素,完成大小的排序。我们同样也是定义两层for循环。这个排序算法非常的简单,先来给大家讲一下这个排序算法的原理。我们先拿第一个元素0和剩下8个元素进行比较,如果这个元素最大或者最小,那么我们就把它放到最后面去。0比较完了之后我们再来比较1,1的话我们再和1后面所有的元素进行比较。如果1这个元素比后面的元素都小,那么1这个元素依次往后移。这个是比较经典的排序算法。设置mid中间值,完成数据的交换。
# 中值滤波 3*3 import cv2 import numpy as np img = cv2.imread('image11.jpg',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.imshow('src',img) dst = np.zeros((height,width,3),np.uint8) collect = np.zeros(9,np.uint8) for i in range(0,height): for j in range(0,width): k = 0 for m in range(-1,2): for n in range(-1,2): gray = img[i+m,j+n] collect[k] = gray k = k+1 # 0 1 2 3 4 5 6 7 8 # 1 for k in range(0,9): p1 = collect[k] for t in range(k+1,9): if p1<collect[t]: mid = collect[t] collect[t] = p1 p1 = mid dst[i,j] = collect[4] cv2.imshow('dst',dst) cv2.waitKey(0)
# 中值滤波 3*3 import cv2 import numpy as np img = cv2.imread('image11.jpg',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.imshow('src',img) dst = np.zeros((height,width,3),np.uint8) collect = np.zeros(9,np.uint8) #for i in range(0,height): #for j in range(0,width): for i in range(1,height-1): for j in range(1,width-1): k = 0 for m in range(-1,2): for n in range(-1,2): gray = img[i+m,j+n] collect[k] = gray k = k+1 # 0 1 2 3 4 5 6 7 8 # 1 for k in range(0,9): p1 = collect[k] for t in range(k+1,9): if p1<collect[t]: mid = collect[t] collect[t] = p1 p1 = mid dst[i,j] = collect[4] cv2.imshow('dst',dst) cv2.waitKey(0)
# 中值滤波 3*3 import cv2 import numpy as np img = cv2.imread('image13.jpg',1) imgInfo = img.shape height = imgInfo[0] width = imgInfo[1] img = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) cv2.imshow('src',img) dst = np.zeros((height,width,3),np.uint8) collect = np.zeros(9,np.uint8) #for i in range(0,height): #for j in range(0,width): for i in range(1,height-1): for j in range(1,width-1): k = 0 for m in range(-1,2): for n in range(-1,2): gray = img[i+m,j+n] collect[k] = gray k = k+1 # 0 1 2 3 4 5 6 7 8 # 1 for k in range(0,9): p1 = collect[k] for t in range(k+1,9): if p1<collect[t]: mid = collect[t] collect[t] = p1 p1 = mid dst[i,j] = collect[4] cv2.imshow('dst',dst) cv2.waitKey(0)