opencv-图像去噪-滤波处理

# -*- coding:utf-8 -*-
"""
作者:ZhiWei
日期:2022年02月17日
"""
import math
import cv2
import random
import numpy as np
# 加载matplotlib.pyplot进行图像显示
import matplotlib.pyplot as plt

def jiazai(src):
    # 设置画布尺寸
    plt.figure(figsize=(8,10))
    # 将图像转换为RGB模式显示
    plt.imshow(cv2.cvtColor(src, cv2.COLOR_BGR2RGB))
    # 显示图片
    plt.show()

# 加载原图
src = cv2.imread("image/4.jpg")
jiazai(src)

def sp_noise(image,prob):
    # 添加椒盐噪声
    # prob:噪声比例
    output = np.zeros(image.shape,np.uint8)
    thres = 1-prob
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            rdn = random.random()
            if rdn<prob:
                output[i][j] = 0
            elif rdn>thres:
                output[i][j]=255
            else:
                output[i][j]=image[i][j]
    return output

# 设置噪声比例,比例越大,噪点越多
output1=sp_noise(src,0.02)
# 设置画布尺寸
jiazai(output1)

# 指定卷积核为3*3 对图像进行均值滤波
dst1 = cv2.blur(output1,(3,3))
jiazai(dst1)

# 指定卷积核为5*5
dst2=cv2.medianBlur(output1,5)
jiazai(dst2)

# 止颜色超出取色范围
def clamp(pv):
    if pv>255:
        return 255
    elif pv<0:
        return 0
    else:
        return pv

# 给图片增加高斯噪声
def gaussian_noise(src):
    image=src
    h,w,c=image.shape
    for row in range(h):
        for col in range(w):
            # 获取三个高斯随机数
            # 第一个参数:概率分布的均值,对应着整个分布的中心
            # 第二个参数:概率分布的标准差,对应于分布的宽度
            # 第三个参数:生成高斯随机数数量
            s=np.random.normal(0,20,3)
            # 获取每个像素点的bgr值
            b=image[row,col,0]# blue
            g=image[row,col,1]# green
            r=image[row,col,2]# red
            # 给每个像素点设置新的bgr值
            image[row,col,0]=clamp(b+s[0])
            image[row,col,1]=clamp(g+s[1])
            image[row,col,2]=clamp(r+s[2])
    return image

# 向原图像增加高斯噪声
output2=gaussian_noise(src)
jiazai(output2)

# 设置卷积核为3*3,X/Y标准差均为15
dst3=cv2.GaussianBlur(output2,(3,3),sigmaX=15)
jiazai(dst3)

def gd(x,mu=0,sigma_quad=1):
    left=1/(np.sqrt(2*math.pi)*np.sqrt(sigma_quad))
    right=np.exp(-(x-mu)**2/(2*sigma_quad))
    return left*right
if __name__=='__main__':
    # 自变量
    x=np.arange(-4,5,0.1)
    # 因变量(不同的均值或方差)
    y_1=gd(x,0,0.2)
    y_2=gd(x,0,1.0)
    y_3=gd(x,0,5.0)
    y_4=gd(x,-2,0.5)

    # 绘图
    plt.plot(x,y_1,color='green')
    plt.plot(x,y_2,color='blue')
    plt.plot(x,y_3,color='gray')
    plt.plot(x,y_4,color='red')

    # 设置坐标系
    plt.xlim(-5.0, 5.0)
    plt.ylim(-0.2, 1)

    ax=plt.gca()
    ax.spines['right'].set_color('none')
    ax.spines['top'].set_color('none')
    ax.xaxis.set_ticks_position('bottom')
    ax.spines['bottom'].set_position(('data',0))
    ax.yaxis.set_ticks_position('left')
    ax.spines['left'].set_position(('data',0))
    plt.legend(labels=['$\mu=0,\sigma^2=0.2$',
                       '$\mu=0,\sigma^2=1.0$',
                       '$\mu=0,\sigma^2=5.0$',
                       '$\mu=-2,\sigma^2=0.5$'])
    # 显示图像
    plt.show()

# 7.双边滤波 设置每个像素邻域直径为9 bilateralFilter(src,d,sigmaColor,sigmaSpace)
# sigmaColor 色彩空间的标准方差,尽可能大,较大的参数值意味着像素邻域内较远的颜色会混合在一起
# sigmaSpace 表示坐标空间的标准方差(像素单位),尽可能小,参数越大意味着只要它们的颜色足够接近,
# 再远的像素都会相互影响
dst4 = cv2.bilateralFilter(output2,9,200,75)
jiazai(dst4)

# 8.人脸美颜特效,通过结合高斯模糊与双边过滤,我们可以对肖像照片实现美艳特效
# 通过设置sigmaColor参数,是像素邻域内较远的颜色会混合在一起,从而产生半等色区域,从而实现
# 将皮肤上的斑点(有色像素)与皮肤融合在一起
dst5=cv2.bilateralFilter(src,9,75,75)
jiazai(dst5)

你可能感兴趣的:(opencv,计算机视觉,python)