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

 更新时间:2022年09月26日 11:43:50   作者:泡泡怡  
椒盐噪声的特征非常明显,为图像上有黑色和白色的点,下面这篇文章主要给大家介绍了关于Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

一、噪声 

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

二、噪声的分类

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

三、图像中添加椒盐噪声

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

代码如下:

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

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

测试:

img=cv2.imread("C:/Users/bwy/Desktop/peppers.JPG")
im=img.copy()
im2=img.copy()
im3=img.copy()
im=add_sp_noise(im,0.05)
im2=add_sp_noise(im2,0.1)
im3=add_sp_noise(im3,0.3)
r=np.hstack((img,im,im2,im3))
cv_show('r',r)

结果如图所示:

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

四、基于滤波器方法去噪

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

计算过程:

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

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

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

def gaosi_f(img,k_size,sigma):
    ##滤波图片的尺寸
    h=img.shape[0]
    w=img.shape[1]
    ##用0填充边缘
    pad=k_size//2
    transform_img=np.zeros((h+2*pad,w+2*pad))
    transform_img[pad:h+pad,pad:w+pad]=img
    new_img=np.zeros((h,w))
    
    ##先计算高斯滤波核
    gaosi_filter=np.zeros((k_size,k_size))
    for x in range(-pad,-pad+k_size):
        for y in range(-pad,-pad+k_size):
            gaosi_filter[y+pad,x+pad]=np.exp(-(x**2+y**2)/(2*sigma**2))/(2*np.pi*sigma**2)
    gaosi_filter=gaosi_filter/np.sum(gaosi_filter)
    
    ##计算滤波后的图片
    for i in range(pad,h+pad):
        for j in range(pad,w+pad):
            ##取图像k_size x k_size的像素值
            p_img=transform_img[i-pad:i+pad+1,j-pad:j+pad+1]
            ##进行高斯滤波
            value=np.sum(np.multiply(p_img,gaosi_filter))
            new_img[i-pad,j-pad]=value
    ##对滤波后的图片中的像素值取整
    new_img=np.round(new_img).astype(np.uint8)
    
    return new_img

彩色图像高斯滤波:

def gaosi_fS(img,k_size,sigma):
    h=img.shape[0]
    w=img.shape[1]
    imShape=img.shape
    dim=len(imShape)
    if dim==2:
        eim=gaosi_f(img,k_size,sigma)
    else:
        imR=img[:,:,0]
        imG=img[:,:,1]
        imB=img[:,:,2]
        eim=np.zeros((h,w,3))
        eimr=gaosi_f(imR,k_size,sigma)
        eimg=gaosi_f(imG,k_size,sigma)
        eimb=gaosi_f(imB,k_size,sigma)
        eim[:,:,0]=eimr
        eim[:,:,1]=eimg
        eim[:,:,2]=eimb
    return eim

测试:

new_img=gaosi_fS(im,3,0.5)
cv_show("new_img",new_img)
cv_show("im",im)

结果如图所示:

五、opencv高斯滤波调包 

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

结果如图所示:

总结 

到此这篇关于Opencv图像添加椒盐噪声、高斯滤波去除噪声原理以及手写Python代码实现方法的文章就介绍到这了,更多相关Opencv添加椒盐噪声高斯滤波去除噪声内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python读取键盘输入的2种方法

    Python读取键盘输入的2种方法

    这篇文章主要介绍了Python读取键盘输入的2种方法,主要使用的就是raw_input函数和input函数,本文分别给出使用实例,需要的朋友可以参考下
    2015-06-06
  • Pytorch:dtype不一致问题(expected dtype Double but got dtype Float)

    Pytorch:dtype不一致问题(expected dtype Double but&

    这篇文章主要介绍了Pytorch:dtype不一致问题(expected dtype Double but got dtype Float),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python处理RSS、ATOM模块FEEDPARSER介绍

    Python处理RSS、ATOM模块FEEDPARSER介绍

    这篇文章主要介绍了Python处理RSS、ATOM模块FEEDPARSER介绍,本文只是做个入门级的简洁介绍,需要的朋友可以参考下
    2015-02-02
  • django时区问题的解决

    django时区问题的解决

    我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我们希望存储在数据库中的时间就是本地时间(东八区的时间),那么应该怎么设置,就一起来了解一下
    2021-05-05
  • python周期任务调度工具Schedule使用详解

    python周期任务调度工具Schedule使用详解

    这篇文章主要为大家介绍了python周期任务调度工具Schedule的使用及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • Python中闭包与lambda的作用域解析

    Python中闭包与lambda的作用域解析

    这篇文章主要介绍了Python中闭包与lambda的作用域解析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python 代码在函数中运行得更快的原因解析

    Python 代码在函数中运行得更快的原因解析

    我们知道,python 是一种解释型语言,它会逐行读取并执行代码,小伙伴们可能会有这个疑问:为什么在函数中运行的 Python 代码速度更快,今天这篇文章将会解答大家心中的疑惑
    2023-09-09
  • 基于django micro搭建网站实现加水印功能

    基于django micro搭建网站实现加水印功能

    这篇文章主要介绍了基于django micro搭建网站实现加水印功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南

    TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南

    这篇文章主要介绍了TensorFlow2.1.0安装时setuptools、wrapt等相关错误指南,本文通过安装错误分析给出大家解决方案,感兴趣的朋友跟随小编一起看看吧
    2020-04-04
  • arcgis使用Python脚本进行批量截图功能实现

    arcgis使用Python脚本进行批量截图功能实现

    最近公司数据部那边有个需求,需要结合矢量数据和影像数据,进行批量截图,并且截图中只能有一个图斑,还要添加上相应的水印,这篇文章主要介绍了arcgis使用Python脚本进行批量截图,需要的朋友可以参考下
    2023-01-01

最新评论