python数字图像处理(五) 图像的退化和复原

import cv2
import numpy as np
import matplotlib.pyplot as plt
import scipy
import scipy.stats
%matplotlib inline

读入我们需要的图像

apple = cv2.imread("apple.jpg")
apple = cv2.resize(cv2.cvtColor(apple,cv2.COLOR_BGR2RGB),(200,200))
plt.imshow(apple)
plt.axis("off")
plt.show()

png

噪声

高斯噪声

简介

高斯噪声是指它的概率密度函数服从高斯分布(即正态分布)的一类噪声

与椒盐噪声相似(Salt And Pepper Noise),高斯噪声(gauss noise)也是数字图像的一个常见噪声。

椒盐噪声是出现在随机位置、噪点深度基本固定的噪声,高斯噪声与其相反,是几乎每个点上都出现噪声、噪点深度随机的噪声。

正如上面的简介我们只要实现一个随机矩阵,矩阵中值总体来说符合高斯分布,与原图像想加,就可以实现高斯噪声了,python中的random提供了产生高斯随机数的方法,但是numpy提供了直接生成随机高斯矩阵的方法。

我们这里使用numpy即可

gauss = np.random.normal(mean,sigma,(row,col,ch))

因此我们可以得出产生高斯噪声的方式

def GaussieNoisy(image,sigma):
    row,col,ch= image.shape
    mean = 0
    gauss = np.random.normal(mean,sigma,(row,col,ch))
    gauss = gauss.reshape(row,col,ch)
    noisy = image + gauss
    return noisy.astype(np.uint8)
plt.imshow(GaussieNoisy(apple,25))
plt.show()

png

上图为施加sigma为25的高斯噪声的效果

椒盐噪声

相比高斯噪声,椒盐噪声的概念非常简单,即在图像中随机选点,使其为0或255

def spNoisy(image,s_vs_p = 0.5,amount = 0.004):
    row,col,ch = image.shape

    out = np.copy(image)
    num_salt = np.ceil(amount * image.size * s_vs_p)
    coords = [np.random.randint(0, i - 1, int(num_salt))  for i in image.shape]
    out[coords] = 1
    num_pepper = np.ceil(amount* image.size * (1. - s_vs_p))
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    out[coords] = 0
    return out
plt.imshow(spNoisy(apple))
plt.show()

png

滤波

算术均值滤波

算术均值滤波器即求某一范围内图像的均值,代替范围中心点的值,在前面已经实现过。

def ArithmeticMeanOperator(roi):
    return np.mean(roi)
def ArithmeticMeanAlogrithm(image):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    for i in range(1,image.shape[0]-1):
        for j in range(1,image.shape[1]-1):
            new_image[i-1,j-1] = ArithmeticMeanOperator(image[i-1:i+2,j-1:j+2])
    new_image = (new_image-np.min(image))*(255/np.max(image))
    return new_image.astype(np.uint8)
def rgbArithmeticMean(image):
    r,g,b = cv2.split(image)
    r = ArithmeticMeanAlogrithm(r)
    g = ArithmeticMeanAlogrithm(g)
    b = ArithmeticMeanAlogrithm(b)
    return cv2.merge([r,g,b])
plt.imshow(rgbArithmeticMean(apple))
plt.show()

0069Secoly1fmiv35uieyj3079070q4g.jpg

几何均值滤波

几何均值公式如下
\[ f(x,y) = [\prod_{(s,t)\in S_{x,y}}{g(s,t)}]^{\frac 1{mn}} \]

def GeometricMeanOperator(roi):
    roi = roi.astype(np.float64)
    p = np.prod(roi)
    return p**(1/(roi.shape[0]*roi.shape[1]))
    
def GeometricMeanAlogrithm(image):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    for i in range(1,image.shape[0]-1):
        for j in range(1,image.shape[1]-1):
            new_image[i-1,j-1] = GeometricMeanOperator(image[i-1:i+2,j-1:j+2])
    new_image = (new_image-np.min(image))*(255/np.max(image))
    return new_image.astype(np.uint8)
def rgbGemotriccMean(image):
    r,g,b = cv2.split(image)
    r = GeometricMeanAlogrithm(r)
    g = GeometricMeanAlogrithm(g)
    b = GeometricMeanAlogrithm(b)
    return cv2.merge([r,g,b])
plt.imshow(rgbGemotriccMean(apple))
plt.show()

0069Secoly1fmiv3utbvwj3079070q4g.jpg

谐波均值

谐波均值公式定义如下
\[ H = \frac{n} {\frac{1}{x_1}+\frac{1}{x_2}+\frac{1}{x_3}\ldots \frac{1}{x_n}} \]

这里需要注意的是,谐波均值处理的数必须大于0,当x存在为0的数是,趋近于无穷,则H=0
因此我们此处当存在x大于0的数时,就返回0

def HMeanOperator(roi):
    roi = roi.astype(np.float64)
    if 0 in roi:
        roi = 0
    else:
        roi = scipy.stats.hmean(roi.reshape(-1))
    return roi
def HMeanAlogrithm(image):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    for i in range(1,image.shape[0]-1):
        for j in range(1,image.shape[1]-1):
            new_image[i-1,j-1] =HMeanOperator(image[i-1:i+2,j-1:j+2])
    new_image = (new_image-np.min(image))*(255/np.max(image))
    return new_image.astype(np.uint8)
def rgbHMean(image):
    r,g,b = cv2.split(image)
    r = HMeanAlogrithm(r)
    g = HMeanAlogrithm(g)
    b = HMeanAlogrithm(b)
    return cv2.merge([r,g,b])
plt.imshow(rgbHMean(apple))
plt.show()

0069Secoly1fmiv44zu52j3079070ta8.jpg

逆谐波均值

公式如下
\[ f(x,y) = \frac{\sum_{(s,t)\in S_{xy}}{g(s,t)^{Q+1}}} {\sum_{(s,t)\in S_{xy}}{g(s,t)^{Q}}} \]
因此使用python实现如下

def IHMeanOperator(roi,q):
    roi = roi.astype(np.float64)
    return np.mean((roi)**(q+1))/np.mean((roi)**(q))
def IHMeanAlogrithm(image,q):
    new_image = np.zeros(image.shape)
    image = cv2.copyMakeBorder(image,1,1,1,1,cv2.BORDER_DEFAULT)
    for i in range(1,image.shape[0]-1):
        for j in range(1,image.shape[1]-1):
            new_image[i-1,j-1] = IHMeanOperator(image[i-1:i+2,j-1:j+2],q)
    new_image = (new_image-np.min(image))*(255/np.max(image))
    return new_image.astype(np.uint8)
def rgbIHMean(image,q):
    r,g,b = cv2.split(image)
    r = IHMeanAlogrithm(r,q)
    g = IHMeanAlogrithm(g,q)
    b = IHMeanAlogrithm(b,q)
    return cv2.merge([r,g,b])
plt.imshow(rgbIHMean(apple,2))
plt.show()

0069Secoly1fmiv4g394qj3079070q4g.jpg

图像的复原

下面我们将试着对加了高斯噪声和椒盐噪声的图像进行复原

spApple = spNoisy(apple,0.5,0.1)
gaussApple = GaussieNoisy(apple,25)
plt.subplot(121)
plt.title("Salt And peper Image")
plt.imshow(spApple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gaussApple)
plt.axis("off")
plt.title("Gauss noise Image")
plt.show()

0069Secoly1fmiv4nyy9dj30ap05j423.jpg

arith_sp_apple = rgbArithmeticMean(spApple)
gemo_sp_apple = rgbGemotriccMean(spApple)
plt.subplot(121)
plt.title("Arithmatic to spImage")
plt.imshow(arith_sp_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_sp_apple)
plt.axis("off")
plt.title("Geomotric to spImage")
plt.show()

0069Secoly1fmiv4y7yelj30ap05jmzs.jpg

arith_gs_apple = rgbArithmeticMean(gaussApple)
gemo_gs_apple = rgbGemotriccMean(gaussApple)
plt.subplot(121)
plt.title("Arithmatic to gsImage")
plt.imshow(arith_gs_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_gs_apple)
plt.axis("off")
plt.title("Geomotric to gsImage")
plt.show()

0069Secoly1fmiv54ro1uj30ap05j419.jpg

算术均值能略微去除椒盐噪声产生的点,几何均值效果却有些奇怪。

对于高斯噪声,二者的效果都非常弱

arith_sp_apple = rgbHMean(spApple)
gemo_sp_apple = rgbIHMean(spApple,3)
plt.subplot(121)
plt.title("H Mean to spImage")
plt.imshow(arith_sp_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_sp_apple)
plt.axis("off")
plt.title("IH mean to spImage")
plt.show()

0069Secoly1fmiv5edmp7j30ap05jmz8.jpg

arith_gs_apple = rgbHMean(gaussApple)
gemo_gs_apple = rgbIHMean(gaussApple,3)
plt.subplot(121)
plt.title("HMean to gsImage")
plt.imshow(arith_gs_apple)
plt.axis("off")
plt.subplot(122)
plt.imshow(gemo_gs_apple)
plt.axis("off")
plt.title("IHMean to gsImage")
plt.show()

0069Secoly1fmiv5ozfdaj30ap05jdil.jpg

如图,IHMEAN的效果要比Hmean好很多,即使是高斯造神也能达到良好的去噪效果

转载于:https://www.cnblogs.com/lynsyklate/p/8047510.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数字图像在获取的过程中,由于光学系统的像差、 光学成像衍射、 成像系统的非线性畸变、 摄影胶片的感光的非线性、 成像过程的相对运动、 大气的湍流效应、环境随机噪声等原因, 图像会产生一定程度的退化。因此,必须采取一定的方法尽可能地减少或消除图像质量的下降,恢复图像的本来面目, 这就是图像复原, 也称为图像恢复。 图像复原图像增强有类似的地方, 都是为了改善图像。但是它们又有着明显的不同。图像复原是试图利用退化过程的先验知识使已退化图像恢复本来面目,即根据退化的原因, 分析引起退化的环境因素,建立相应的数学模型, 并沿着使图 像降质的逆过程恢复图像。从图像质量评价的角度来看, 图像 复原就是提高图像的可理解性。而图像增强的目的是提高视感 质量,图像增强的过程基本上是一个探索的过程, 它利用人的心理状态和视觉系统去控制图像质量, 直到人们的视觉系统满意为止。 图像复原是利用退化现象的某种先验知识,建立退化现象的数学模型,再根据模型进行反向的推演运算,以恢复原来的景物图像。因而,图像复原可以理解为图像降质过程的反向过程。建立图像复原的反向过程的数学模型,就是图像复原的主 要任务。经过反向过程的数学模型的运算,要想恢复全真的景物图像比较困难。所以, 图像复原本身往往需要有一个质量标 准, 即衡量接近全真景物图像的程度,或者说,对原图像的估 计是否到达最佳的程度。 由于引起退化的因素众多而且性质不同,为了描述图像退化过程所建立的数学模型往往多种多样,而恢复的质量标准也往往存在差异性,因此图像复原是一个复杂的数学过程,图像复原的方法、技术也各不相同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值