5-12 中值滤波

中值滤波,顾名思义就是取中间值来代替原来像素值的过程。定义一个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)

原文地址:https://www.cnblogs.com/ZHONGZHENHUA/p/9754535.html