小白学python(opencv模糊)

796 阅读3分钟

今天稍微学学模糊有关知识,发出来记录以一下。

模糊

#像的模糊是图像处理中比较常用和简单的处理手段之一。那么使用这种手段的原因就是为了给图像进行去噪,便于后面的处理。
#模糊处理的背后的原理其实就是卷积计算。
#单的说,拿一个小方格在图像这个方格上进行滑动,这样我们就可以得到一个新的图像了。
#根据原理的不同,模糊方式有很多种。
#(度娘yyds)

均值模糊

#适用于去随机噪声

#均值滤波从字面意思上就是取平均值,也就是黄色小方格上的系数全是1,与黄色窗体覆盖下的像素值相乘,再去除以9(卷积和大小为3*3),得到平均值,赋值给#中心像素。

#   它的 缺点是在去噪的同时,不能很好的保留图像细节,因为全用均值代替了。

def blur_demo(image):#均值模糊

    dst = cv.blur(image,(100,300))# 前一个为水平方向模糊,后一个为竖直方向模糊
    cv.imshow(" blur_demo",dst)

在这里插入图片描述

中值模糊

#适用于去除椒盐噪点(就是小斑点)

#字面意思的话,就是取中间的值来代替中心像素。和均值滤波类似,只不过均值滤波是取平均值,中值滤波取中间的那个值。中值滤波可以有效的去除椒盐噪声#(比如说你在清水中,撒点盐,这些就是椒盐噪声。对应到图像上,在一副黑色图像上,有很多小白点,这些就是椒盐噪声)。
#(突然很想吃烧烤。。)
def median_blur_demo(image): #中值模糊
    det = cv.medianBlur(image,5)
    cv.imshow("Median_Blur",det)

在这里插入图片描述

自定义模糊

适用于图像增强,锐化

def custom_demo(image):   # 自定义模糊
    kernel = np.ones([5, 5], np.float32)/25 # 保证值不会溢出
    # kernel = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], np.float32)/9
    # kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32)    # 该参数起到锐化效果
    dst = cv.filter2D(image, -1, kernel=kernel) # 第二个参数为目标图像深度,-1则表示和原图像一样
    cv.imshow("custom_demo", dst)

在这里插入图片描述

高斯模糊

#高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,滤波高斯就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
#相对于均值滤波,更好的保留图像的细节。因为高斯函数的特性,会有一定的权重配比。
#**手动加高斯噪音**
def gaussian_noise(image):  # 高斯噪声
    h, w, c = image.shape   # image.shape[0], 图片垂直尺寸;image.shape[1], 图片水平尺寸;image.shape[2], 图片通道数
    for row in range(h):
        for col in range(w):
            s = np.random.normal(0, 20, 3)  # 产生一个正态分布
            '''
            numpy.random.normal(loc=0,scale=1.0,size=shape)
            参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布
            参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦
            参数size(int 或者整数元组):输出的shape,默认为None,这里设置为3,表示输出3个值
            '''
            b = image[row, col, 0]  # blue;row高度,col宽度,0表示通道0,蓝色
            g = image[row, col, 1]  # green;1表示通道1,绿色
            r = image[row, col, 2]  # red
            image[row, col, 0] = clamp(b + s[0])    # 在通道0上加上一个高斯噪声
            image[row, col, 1] = clamp(g + s[1])    # 在通道1上加上一个高斯噪声
            image[row, col, 2] = clamp(r + s[2])    # 在通道2上加上一个高斯噪声
    cv.imshow("gaussian_noise image", image)


def clamp(pv):
    if pv >255:
        return 255
    if pv <255:
        return 0
    else :
        return pv**

opencv高斯模糊

gaussian_noise(src) #手动高斯模糊
dst = cv.GaussianBlur(src, (5, 5), 0)  # opencv的高斯模糊API


'''
def GaussianBlur(src: Any, ksize: Any, sigmaX: Any, dst: Any = None, sigmaY: Any = None, borderType: Any = None)
src:    输入图片,可以使是任意通道数,该函数对通道是独立处理的
ksize:  高斯内核大小。ksize.width和ksize.height允许不相同但他们必须是正奇数。或者等于0,由参数sigma决定。 
sigmaX: 高斯内核在X方向的标准偏差。
sigmaY: 高斯内核在Y方向的标准偏差。如果sigmaY为0,他将和sigmaX的值相同,如果他们都为0,那么他们由ksize.width和ksize.height计算得出。 
borderType:用于判断图像边界的模式。
'''

在这里插入图片描述 《毛玻璃效果》

双边模糊

#双边滤波是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。
#双边滤波避免了边缘信息丢失,保留了图像的轮廓不变。

def bi_demo(image):     # 双边模糊
    dst = cv.bilateralFilter(image, 0, 100, 15)
    '''
    def bilateralFilter(src: Any,       # 原图数据
                    d: Any,             # 表示在过滤过程中每个像素邻域的直径范围。如果这个值是非正数,则函数会从第五个参数sigmaSpace计算该值。
                    sigmaColor: Any,    # 颜色空间过滤器的sigma值,这个参数的值越大,表明该像素邻域内有越宽广的颜色会被混合到一起,产生较大的半相等颜色区域。
                    sigmaSpace: Any,    # 坐标空间中滤波器的sigma值,如果该值较大,则意味着越远的像素将相互影响,从而使更大的区域中足够相似的颜色获取相同的颜色。当d>0时,d指定了邻域大小且与sigmaSpace无关,否则d正比于sigmaSpace
                    dst: Any = None,    # 这里也可以输出图像
                    borderType: Any = None) # 用于推断图像外部像素的某种边界模式
    '''
    cv.imshow("bi_demo image", dst)

(百度真滴香)