opencv-python数字图像处理学习4:对一副图像加噪声(高斯,椒盐等),进行平滑,锐化,观察其图像变化

一、在开始之前

知识点

本次教程涉及到的知识点:
噪声:
噪声可以理解为灰度值的随机变化,即拍照过程中引入的一些不想要的像素点。噪声可分为椒盐噪声,高斯噪声,加性噪声和乘性噪声等
高斯噪声Gaussian noise:
指服从高斯分布(正态分布)的一类噪声,通常是因为不良照明和高温引起的传感器噪声。通常在RGB图像中,显现比较明显
椒盐噪声Salt and pepper noise:
椒盐噪声也称为脉冲噪声,是图像中经常见到的一种噪声,它是一种随机出现的白点或者黑点,可能是亮的区域有黑色像素或是在暗的区域有白色像素(或是两者皆有)。椒盐噪声的成因可能是影像讯号受到突如其来的强烈干扰而产生、类比数位转换器或位元传输错误等。;
噪声主要通过平滑进行抑制和去除,包括基于二维离散卷积的高斯平滑,均值平滑,基于统计学的中值平滑,以及能够保持图像边缘的双边滤波,导向滤波算法等

码云代码地址:https://gitee.com/steveqobs/opencv
chapter4

二、开始

import cv2
import numpy as np
import random

先定义三个函数,后面调用

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


def gaussian_noise(image, mean=0, var=0.001):
    # 添加高斯噪声
    # mean : 均值
    # var : 方差
    image = np.array(image / 255, dtype=float)
    noise = np.random.normal(mean, var ** 0.5, image.shape)
    out = image + noise
    if out.min() < 0:
        low_clip = -1.
    else:
        low_clip = 0.
    out = np.clip(out, low_clip, 1.0)
    out = np.uint8(out * 255)
    return out


def sharpen(image):
    # 锐化
    kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) 
    out = cv2.filter2D(image, -1, kernel=kernel)
    return out

三、对一副图像加高斯噪声、椒盐

以下代码对图像添加了噪声,并显示原图和已经加噪声的图片,进行对比。
sp_noise(src, 0.05)和gaussian_noise(src, 0.1, 0.03)的数字参数可自行调整查看变化

src = cv2.imread('img/lena.png')
img_sp = sp_noise(src, 0.05)
img_gaussian = gaussian_noise(src, 0.1, 0.03)

cv2.imshow('src', src)
cv2.imshow('img_sp', img_sp)
cv2.imshow('img_gaussian', img_gaussian)
cv2.waitKey(0)

下面显示的依次是原图、椒盐噪声、高斯噪声
在这里插入图片描述

四、对已加高斯噪声、椒盐的图像进行平滑、锐化处理

1、对已加高斯噪声、椒盐的图像进行平滑处理

注意这里的代码要和上面的连贯,平滑处理的是已经加了噪声的img_sp,
可以更换平滑的方法和参数,看一下不同的效果

# cv2.medianBlur是中值平滑,blur()是均值平滑,gaussianianBlur()高斯平滑
# https://www.cnblogs.com/silence-cho/p/11027218.html有对各种平滑函数有详细讲解
# cv2.medianBlur的第二个参数5,可以修改 数字不一样 平滑效果也不一样
img_sp_medianblur = cv2.medianBlur(img_sp,5)
img_gaussian_medianblur = cv2.medianBlur(img_gaussian, 5)
# img_gaussian_gaussianBlur= cv2.gaussianBlur(img_gaussian,(0,0),2)

# 下面把有椒盐噪声的图片和对它进行平滑的图片 对比
cv2.imshow('img_sp', img_sp)
cv2.imshow('img_sp_medianblur', img_sp_medianblur)

# 下面把有椒盐噪声的图片和对它进行平滑的图片 对比
cv2.imshow('img_gaussian', img_gaussian)
cv2.imshow('img_gaussian_medianblur', img_gaussian_medianblur)
cv2.waitKey(0)

下图是椒盐噪声和平滑处理的对比图
平滑处理

下图是高斯噪声和平滑处理的对比图
在这里插入图片描述

1、对已加高斯噪声、椒盐的图像进行锐化处理

img_sharpen=sharpen(src)
img_sp_sharpen=sharpen(img_sp)
img_gaussian_sharpen=sharpen(img_gaussian)
# img_sp_medianblur_sharpen=sharpen(img_sp_medianblur)
# img_gaussian_medianblur_sharpen=sharpen(img_gaussian_medianblur)
cv2.imshow('img_sharpen', img_sharpen)
cv2.imshow('img_sp_sharpen', img_sp_sharpen)
cv2.imshow('img_gaussian_sharpen', img_gaussian_sharpen)
# cv2.imshow('img_sp_medianblur_sharpen', img_sp_medianblur_sharpen)
# cv2.imshow('img_gaussian_medianblur_sharpen', img_gaussian_medianblur_sharpen)
cv2.waitKey(0)

依次为原图、 对有椒盐噪声的锐化、对有高斯噪声的锐化
在这里插入图片描述

2、对已加高斯噪声、椒盐的 进行过平滑处理的图像进行锐化处理

把上面的代码注释取消。
下图是依次对有椒盐噪声的平滑处理过的锐化、对有高斯噪声的平滑处理过的锐化
能看出下面左边的效果还可以,是对噪声平滑处理之后再锐化处理的,噪点已经看不到了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42112618/article/details/120798578
今日推荐