OpenCV图像添加椒盐噪声与高斯滤波去噪原理及Python手写实现

栗子
栗子
发布时间:2026-10-16 | 5人浏览过
原创

本文详细解析OpenCV中椒盐噪声的生成机制与高斯滤波的去噪原理。通过Python手写实现从添加随机椒盐噪声到高斯模板计算及卷积滤波的全过程,并对比OpenCV内置函数的调用方法。文章涵盖灰度与彩色图像处理逻辑,展示参数对去噪效果的影响,为图像预处理提供完整的技术参考。

一、噪声

在图像处理领域,我们常听到平滑处理(即去噪)与锐化处理,这两者作用相反。那么,究竟什么是噪声?图像噪声是指存在于图像数据中不必要的或多余的干扰信息,它的存在会严重降低图像质量。从理论角度看,噪声具有“不可预测”的特性,因此我们通常只能借助概率论的方法来认识和处理这些随机误差。

二、噪声的分类

常见的噪声来源包括光电管噪声、摄像管噪声以及摄像机噪声等。在数字图像中,椒盐噪声尤为常见,它表现为图像上随机出现的黑色和白色像素点。

三、图像中添加椒盐噪声

椒盐噪声也被称为脉冲噪声,它会随机改变图像中的像素值。这种噪声通常由相机成像、图像传输或解码处理等过程产生,表现为黑白相间的亮暗点,外观如同在图像上随机撒上了盐粒和黑胡椒粒,故得名椒盐噪声。

代码如下:

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 相关产品和应用

全部下载

专题列表