数字图像处理--变分法

数字图像处理–变分法

1、主要内容

(1)选取图像,完成图像读取和显示,给图像加上噪声;
(2)编写变分法图像去噪程序;(附参考代码)
(3)用PSNR评价图像去噪结果;
(4)分析并与滤波去噪进行对比。
其中,滤波去噪在博客
链接: https://blog.csdn.net/MZYYZT/article/details/128088676?spm=1001.2014.3001.5501

2、源代码

import matplotlib.pyplot as plt
import cv2
import math

import numpy as np
import matplotlib.pyplot as plt
import cv2
import math

def Gaussion(image):
    img = np.float64(np.copy(image))
    h = img.shape[0]
    w = img.shape[1]
    noise = np.random.randn(h, w) * 25
    noisy_img = np.zeros(img.shape, np.float64)

    if len(img.shape) == 2:
        noisy_img = img + noise
    else:
        noisy_img[:, :, 0] = img[:, :, 0] + noise
        noisy_img[:, :, 1] = img[:, :, 1] + noise
        noisy_img[:, :, 2] = img[:, :, 2] + noise

    return noisy_img

def TV_denoising(size,gray,itermax = 20,n = 0,t = 0.1,lamda = 0,ep = 1,divp = 0):
    imtmp = gray.copy()
    imnew = np.zeros([size[0], size[1]])
    for loop in range(0, itermax):
        print(" %d iter" % (loop))

        for y in range(1, size[0] - 1):
            for x in range(1, size[1] - 1):

                ux = (imtmp[y, x + 1] - imtmp[y, x - 1]) / 2
                uy = (imtmp[y + 1, x] - imtmp[y - 1, x]) / 2
                uxx = imtmp[y, x + 1] + imtmp[y, x - 1] - imtmp[y, x] - imtmp[y, x]
                uyy = imtmp[y + 1, x] + imtmp[y - 1, x] - imtmp[y, x] - imtmp[y, x]

                uxy = (imtmp[y + 1, x + 1] + imtmp[y - 1, x - 1] - imtmp[y + 1, x - 1] - imtmp[y - 1, x + 1]) / 4

                divp = ((uy * uy + ep) * uxx - 2 * ux * uy * uxy + (ux * ux + ep) * uyy) / (
                (ux * ux + uy * uy + ep))

                imnew[y, x] = imtmp[y, x] + t * (lamda * (gray[y, x] - imtmp[y, x]) + divp)
                dv = 1 * t * lamda * (gray[y, x] - imtmp[y, x])

                if x == 25 and y == 15:
                    print('dp=%d,div=%d,im=%d' % (divp, dv, imnew[y, x]))


        imtmp = imnew.copy()

    return imnew

def psnr(img1, img2):
    mse = np.mean( (img1 - img2) ** 2 )
    if mse == 0:
        return 100
    PIXEL_MAX = 255.0
    return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))

#读取图片
rose = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
#添加高斯噪声
rose_Gaussian = Gaussion(rose)

plt.subplot(121),plt.imshow(rose,cmap='gray'),plt.title('Origianal')
plt.subplot(122),plt.imshow(rose_Gaussian,cmap='gray'),plt.title('Rose_with_Gaussion')

#变差法--全变分TV模型去噪参数设置
#迭代次数:itermax = 20
#松弛因子:lamba = 0.03

size = rose.shape
After_denoising = TV_denoising(size,rose_Gaussian,itermax = 20,n = 0,t = 0.1,lamda = 0.03,ep = 1,divp = 0)

#PSNR评价指标
rose = cv2.imread('2.png',cv2.IMREAD_GRAYSCALE)
PSNR = psnr(rose,After_denoising)
print('PSNR:',PSNR)

plt.rcParams["font.sans-serif"]=["SimHei"]
plt.rcParams["axes.unicode_minus"]=False

plt.figure(2)
plt.imshow(After_denoising,cmap='gray'),plt.title('After_denoising')


plt.show()

3、实现结果

3.1 添加高斯噪声
本实验中,通过自定义高斯函数对源图像添加高斯噪声。其读取并显示源图像,以及加噪后的图像,如下图所示。
数字图像处理--变分法_第1张图片

添加高斯噪声后,与源图像相比,灰度值发生了变化,整体变暗。

3.2 变分法—TV去噪
基于变分法的思想,利用数学进行图像去噪的方法,实现了对图像的去噪效果。在本实验中,应用全变分TV模型方法。这类方法的关键是找到合适的能量方程,保证演化的稳定性,使得图像达到平滑状态。从而,获得理想的结果。其算法参考代码已经放在上述源程序中的TV_denoising函数中。TV去噪效果如下图所示。
数字图像处理--变分法_第2张图片

这是迭代了10轮后达到的去噪效果,可以看出图像中主体部分得到了一定的增强。
数字图像处理--变分法_第3张图片
这是迭代了20轮后达到的去噪效果,相比10轮迭代效果要好一些。虽然有一些模糊,但是去噪效果还是很明显的,主要是对噪点部分做了一定的平滑。

3.3 PSNR评价指标
一般来说,PSNR越大,代表着图像质量越好。通过PSNR评价指标对上述实验结果进行评价得出,10轮迭代的PSNR等于24.625782008239202,20轮迭代的PSNR等于25.2857204324090。其结果如下图所示。

在这里插入图片描述

在这里插入图片描述
从上图可知,迭代轮次的增加会提高图像的质量,但是,并不太明显,很容易会达到瓶颈。
3.4 对比
首先,本实验将前者实验中进行滤波去噪的结果图截取过来。如下图所示。
数字图像处理--变分法_第4张图片
对比可知,空域滤波是在原图像上直接进行数据运算,对像素的灰度值进行处理。其边界模糊效应明显、细节丢失比较严重;无法去掉噪声,只能微弱的减弱
而本实验中采用变分法思想的TV模型通过不断迭代,实现最小化工作,逐渐趋于源图像,从而,完成去噪。同时,此方法能够在去除图像噪声的同时,保护图像的边缘和细节不受损失,适用的图像类型是图像中的对象尺寸都比较大,且没有微小细节,因此,对这类图像除噪效果会较好。

小白记录!!!

你可能感兴趣的:(数字图像处理,opencv,计算机视觉,python,图像处理)