噪声干扰图像的合成、滤波及滤波性能评价

请按照如下过程,完成指定工作任务。

 

1. 读取原始 256 级的灰度图像,将其映射至 0~1 的浮点值。

2. 针对上述输入图像(即真值图像),编程实现两种类型噪声干扰后的图像合成。

(1)加性高斯噪声干扰(均值 0,方差 0.5; 方差 1)

(2)椒盐开关噪声干扰(噪声密度 0.2;噪声密度 0.6) 体会如何控制每种类型噪声对真值图像的干扰程度; 并可视化噪声干扰前、后的图像;估计噪声干扰 图像相对于真值图像的 MSE 值、PSNR 值、SSIM 值。

3. 针对上述噪声干扰的图像,分别实现基于不同大小模板(如 3*3,7*7)的高斯滤波、中值滤波的图像 平滑,显示并保存滤波结果;并且估计这些滤波后的图像相对于真值图像的 MSE 值、PSNR 值、以及 SSIM 值.

代码实现:

from PIL import Image
from pylab import *
import cv2
import numpy as np
from skimage.metrics import structural_similarity as compare_ssim
from skimage.metrics import peak_signal_noise_ratio as compare_psnr
from skimage.metrics import mean_squared_error as compare_mse
# 高版本用法


def gauss_noise(img, mean=0, sigma=25):
    image = np.array(img / 255, dtype=float)  # 将原始图像的像素值进行归一化
    # 创建一个均值为mean,方差为sigma,呈高斯分布的图像矩阵
    noise = np.random.normal(mean, sigma / 255.0, image.shape)
    out = image + noise  # 将噪声和原始图像进行相加得到加噪后的图像
    res_img = np.clip(out, 0.0, 1.0)
    res_img = np.uint8(res_img * 255.0)

    return res_img


def noise(img,snr):
    h=img.shape[0]
    w=img.shape[1]
    img1=img.copy()
    sp=h*w   # 计算图像像素点个数
    NP=int(sp*(1-snr))   # 计算图像椒盐噪声点个数
    for i in range (NP):
        randx=np.random.randint(1,h-1)   # 生成一个 1 至 h-1 之间的随机整数
        randy=np.random.randint(1,w-1)   # 生成一个 1 至 w-1 之间的随机整数
        if np.random.random()<=0.5:   # np.random.random()生成一个 0 至 1 之间的浮点数
            img1[randx,randy]=0
        else:
            img1[randx,randy]=255
    return img1

im = array(Image.open('./lena.bmp'))
img = im
im[:,:,0] = im[:,:,1] = im[:,:,2] = (im[:,:,0] * 0.3 + im[:,:,1] * 0.59 + im[:,:,2] * 0.11)
#imshow(im)
#show()

gaussimg = gauss_noise(im)
#cv2.imshow('gauss',gaussimg)
#cv2.imwrite('./gauss.png'.format(len(gaussimg)),gaussimg)
psnr = compare_psnr(img, gaussimg)
ssim = compare_ssim(img, gaussimg, channel_axis=-1)
mse = compare_mse(img, gaussimg)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))

noiseimage_2 = noise(im,0.2)
noiseimage_6 = noise(im,0.6)
#cv2.imshow('noise 0.2',noiseimage_2)
#cv2.imwrite('./noiseimage_2.png'.format(len(noiseimage_2)),noiseimage_2)
psnr = compare_psnr(img, noiseimage_2)
ssim = compare_ssim(img, noiseimage_2, channel_axis=-1)
mse = compare_mse(img, noiseimage_2)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))

#cv2.imshow('noise 0.6',noiseimage_6)
#cv2.imwrite('./noiseimage_6.png'.format(len(noiseimage_6)),noiseimage_6)
psnr = compare_psnr(img, noiseimage_6)
ssim = compare_ssim(img, noiseimage_6, channel_axis=-1)
mse = compare_mse(img, noiseimage_6)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))

img1 = np.hstack((gaussimg,noiseimage_2,noiseimage_6))

print("基于高斯滤波_3*3")
tmp1 = cv2.GaussianBlur(gaussimg, (3,3), 1)
tmp2 = cv2.GaussianBlur(noiseimage_2, (3,3), 1)
tmp3 = cv2.GaussianBlur(noiseimage_6, (3,3), 1)
res1 = np.hstack((tmp1, tmp2, tmp3))
cv2.imshow("res1",res1)
cv2.imwrite('./gauss_3.png'.format(len(res1)),res1)
psnr = compare_psnr(img1, res1)
ssim = compare_ssim(img1, res1, channel_axis=-1)
mse = compare_mse(img1, res1)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))
cv2.waitKey(0)
cv2.destroyAllWindows()


print("基于高斯滤波_7*7")
tmp1 = cv2.GaussianBlur(gaussimg, (7,7), 1)
tmp2 = cv2.GaussianBlur(noiseimage_2, (7,7), 1)
tmp3 = cv2.GaussianBlur(noiseimage_6, (7,7), 1)
res2 = np.hstack((tmp1, tmp2, tmp3))
cv2.imshow("res2",res2)
cv2.imwrite('./gauss_7.png'.format(len(res2)),res2)
psnr = compare_psnr(img1, res2)
ssim = compare_ssim(img1, res2, channel_axis=-1)
mse = compare_mse(img1, res2)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))
cv2.waitKey(0)
cv2.destroyAllWindows()

print("中值滤波")
tmp1 = cv2.medianBlur(gaussimg, 5)
tmp2 = cv2.medianBlur(noiseimage_2, 5)
tmp3 = cv2.medianBlur(noiseimage_6, 5)
res3 = np.hstack((tmp1, tmp2, tmp3))
cv2.imshow("res3",res3)
cv2.imwrite('./Median.png'.format(len(res3)),res3)
psnr = compare_psnr(img1, res3)
ssim = compare_ssim(img1, res3, channel_axis=-1)
mse = compare_mse(img1, res3)
print('PSNR:{},SSIM:{},MSE:{}'.format(psnr, ssim, mse))
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值