• Opencv——图像添加椒盐噪声、高斯滤波去除噪声原理及手写Python代码实现


    一、噪声 

     我们将常会听到平滑(去噪),锐化(和平滑是相反的),那我们就会有疑惑?什么是噪声呢?图像噪声是指存在于图像数据中不必要的或多余的干扰信息,噪声的存在严重影响了图像的质量。噪声在理论上是”不可预测“的,所以我们只能用概率论方法认识“随机误差”。

    二、噪声的分类

    光电管的噪声、摄像管噪声、摄像机噪声、椒盐噪声(数字图像常见的噪声,椒盐噪声就是在图像上随机出现黑色白色的像素)等等。

    三、图像中添加椒盐噪声

    椒盐噪声又被称作脉冲噪声,它会随机改变图像中的像素值,是由相机成像、图像传输、解码处理等过程产生的黑白相间的亮暗点噪声,其样子就像在图像上随机的撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。

    代码如下:

    1. import numpy as np
    2. import cv2
    3. def cv_show(name,img):
    4. cv2.imshow(name,img)
    5. cv2.waitKey(0)
    6. cv2.destroyAllWindows()
    7. def add_sp_noise(img,sp_number):
    8. new_image=img
    9. row,col,channel=img.shape#获取行列,通道信息
    10. s=int(sp_number*img.size/channel)#根据sp_number确定椒盐噪声
    11. #确定要扫椒盐的像素值
    12. change=np.concatenate((np.random.randint(0,row,size=(s,1)),np.random.randint(0,col,size=(s,1))),axis=1)
    13. for i in range(s):
    14. r=np.random.randint(0,2)#确定撒椒(0)还是盐(1)
    15. for j in range(channel):
    16. new_image[change[i,0],change[i,1],j]=r
    17. return new_image

    注意:在进行实验的时候,我们需要注意要进行拷贝不然原图会被破坏。

    测试:

    1. img=cv2.imread("C:/Users/bwy/Desktop/peppers.JPG")
    2. im=img.copy()
    3. im2=img.copy()
    4. im3=img.copy()
    5. im=add_sp_noise(im,0.05)
    6. im2=add_sp_noise(im2,0.1)
    7. im3=add_sp_noise(im3,0.3)
    8. r=np.hstack((img,im,im2,im3))
    9. cv_show('r',r)

    结果如图所示:

     从图上看出,sp_number越大,噪声点越多。

    四、基于滤波器方法去噪

    高斯滤波(手写代码):滤掉噪声的代价就是图像会有所模糊。

    计算过程:

    此时还要确保这九个点加起来为1(高斯模板的特性),这9个点的权重为0.4787147,因此将9个值都除以0.4787147,得到最终的高斯模板。

    再与图像像素进行乘积,四周加和代替中间的。

    (1)灰度图像高斯滤波:

    1. def gaosi_f(img,k_size,sigma):
    2. ##滤波图片的尺寸
    3. h=img.shape[0]
    4. w=img.shape[1]
    5. ##用0填充边缘
    6. pad=k_size//2
    7. transform_img=np.zeros((h+2*pad,w+2*pad))
    8. transform_img[pad:h+pad,pad:w+pad]=img
    9. new_img=np.zeros((h,w))
    10. ##先计算高斯滤波核
    11. gaosi_filter=np.zeros((k_size,k_size))
    12. for x in range(-pad,-pad+k_size):
    13. for y in range(-pad,-pad+k_size):
    14. gaosi_filter[y+pad,x+pad]=np.exp(-(x**2+y**2)/(2*sigma**2))/(2*np.pi*sigma**2)
    15. gaosi_filter=gaosi_filter/np.sum(gaosi_filter)
    16. ##计算滤波后的图片
    17. for i in range(pad,h+pad):
    18. for j in range(pad,w+pad):
    19. ##取图像k_size x k_size的像素值
    20. p_img=transform_img[i-pad:i+pad+1,j-pad:j+pad+1]
    21. ##进行高斯滤波
    22. value=np.sum(np.multiply(p_img,gaosi_filter))
    23. new_img[i-pad,j-pad]=value
    24. ##对滤波后的图片中的像素值取整
    25. new_img=np.round(new_img).astype(np.uint8)
    26. return new_img

    彩色图像高斯滤波:

    1. def gaosi_fS(img,k_size,sigma):
    2. h=img.shape[0]
    3. w=img.shape[1]
    4. imShape=img.shape
    5. dim=len(imShape)
    6. if dim==2:
    7. eim=gaosi_f(img,k_size,sigma)
    8. else:
    9. imR=img[:,:,0]
    10. imG=img[:,:,1]
    11. imB=img[:,:,2]
    12. eim=np.zeros((h,w,3))
    13. eimr=gaosi_f(imR,k_size,sigma)
    14. eimg=gaosi_f(imG,k_size,sigma)
    15. eimb=gaosi_f(imB,k_size,sigma)
    16. eim[:,:,0]=eimr
    17. eim[:,:,1]=eimg
    18. eim[:,:,2]=eimb
    19. return eim

    测试:

    1. new_img=gaosi_fS(im,3,0.5)
    2. cv_show("new_img",new_img)
    3. cv_show("im",im)

    结果如图所示:

    五、opencv高斯滤波调包 

    1. aussian = cv2.GaussianBlur(im, (5,5), 1)
    2. cv_show("aussian",aussian)

    结果如图所示:

  • 相关阅读:
    【无标题】
    生成对抗网络Generative Adversarial Network,GAN
    公司实战 ElasticSearch+Kafka+Redis+MySQL
    C++算法 —— 分治(2)归并
    DcatAdmin使用模版文件时模板标签不生效
    C语言的学习快速入门
    随笔记:计算机基础及进制计数法
    QT实战之翻金币游戏【详细过程及介绍】
    Redis的各数据类型及其用法
    408必胜宝典
  • 原文地址:https://blog.csdn.net/m0_72662900/article/details/126799509