5-11 高斯均值滤波

其中高斯滤波我们将直接使用opencv API的方式来调用,均值滤波我们将使用源码的形式来给大家解释。其实滤波和我们之前讲的边缘检测有点类似。就是用一个滤波核与我们的图像进行卷积运算。既然是要滤波,就说明原来图片肯定是有问题的。

原图片中有很多小点,这些点都是一些噪源造成。

高斯滤波是一个类似于模糊的效果。而模糊的话就可以把原来我们图片中所有的这些噪声点给大家删除掉。至于这些参数我们会在讲解高斯和的时候为大家详细地介绍。

因为在这个小节中我们的算法很复杂,而且比较多。

import cv2
import numpy as np
img = cv2.imread('image11.jpg',1)
cv2.imshow('src',img)
dst = cv2.GaussianBlur(img,(5,5),1.5)
cv2.imshow('dst',dst)
cv2.waitKey(0)


接下来我们要实现均值滤波。我们首先要定义一个6*6的模板,它的数据全是为1。用这个全为1的数据我们乘以一个6*6矩阵中所有的图像数据,乘完之后然后再除以1个36,这样我们就得到一个均值。我们把这个均值替换到中心的这样一个元素,那么也就实现了均值滤波。我们想定义一个均值模板大小是6*6,所以它的一半就是3*3。在我们这门课程中,我们所有的边缘点都没有为大家处理,其实大家可以把这个边缘点处理一下。既然是一个彩色图片,所以我们要分成RGB三种形式来进行讨论。sum_b、sum_g、sum_r是用来统计模板中所有的均值。

# 均值 6*6 1 。 * 【6*6】 /36 = mean -》P
import cv2
import numpy as np
img = cv2.imread('image11.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width,3),np.uint8) # dst中装载的就是我们最终的数据
# 使用两层for循环的形式遍历图片上的每一个点
for i in range(3,height-3):
    for j in range(3,width-3):
        sum_b = int(0)
        sum_g = int(0)
        sum_r = int(0)
        for m in range(-3,3):#-3 -2 -1 0 1 2 
            for n in range(-3,3):#-3 -2 -1 0 1 2 
                (b,g,r) = img[i+m,j+n]
                sum_b = sum_b+int(b)
                sum_g = sum_g+int(g)
                sum_r = sum_r+int(r)
        
        b = np.uint8(sum_b/36)#
        g = np.uint8(sum_g/36)#
        r = np.uint8(sum_r/36)#
        dst[i,j] = (b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)

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