几种常见的图像模糊处理

由于成像系统散焦、设备与物体的相对运动等因素易造成对成像系统影响,同时设备本身的缺陷或部分图像存在异物遮挡,也常常会导致图像质量无法达到理想化水平。

图像复原基本原理

图像退化是指图像受采集设备、光线等影响,在生成、传输过程中出现质量下降、信息丢失的现象。理论上,图像退化是图像主动或被动融入噪声。因此,图像x在噪声n的作用下,形成模糊图像y的数学表达如下:
y = x ⨂ k + n y=x\bigotimes k+n y=xk+n
其中, k称为点扩散函数,反应了光源成像系统对点源的解析能力。

通过图像复原技术,能够得到表达效果好、清晰度高的新图像。由上式可知,要想得到一个清晰的图像 ,通常需要对公式求解逆过程。因此,可视作对积分方程的逆变换。由于模糊核 k和噪声 n 未知,得到的 x不唯一。

图像退化和复原的基本流程如下图所示。受到各种因素的影响,清晰图像形成降质退化或模糊图像,分别研究退化模型和去模糊算法,进而对图像进行复原,生成清晰图像。常见的模糊图像类型包括高斯模糊、椒盐模糊、运动模糊等。

在这里插入图片描述

高斯模糊图像

高斯模糊图像是依据高斯曲线对图像周围像素进行加权平均处理去掉图像细节使图像变得模糊。高斯模糊的数学公式如下:
h ( x , y ) = 1 2 π σ e x p ⁡ ( − x 2 + y 2 ( 2 σ 2 ) h(x,y)=\frac{1}{\sqrt{2πσ}} exp⁡(-\frac{x^2+y^2}{(2σ^2}) h(x,y)=2πσ 1exp((2σ2x2+y2)
其中, h ( x , y ) h(x,y) h(x,y) 为高斯模糊函数, σ \sigma σ 为标准差, x、y 为模糊点d 相对坐标。如图所示,中心点(0,0)附近坐标如下。

在这里插入图片描述

椒盐模糊图像

椒盐噪声也称为脉冲噪声,表现为在图像中随机出现白/黑点。其中,未受到污染的像素仍会保留原始信息,不会影响原有图像的所有像素以及结构等信息。定义如下:
p ( x ) = { p a , x = a p b , x = b 0 , o t h e r {} p(x)=\left\{ \begin{array}{lr} p_a, x=a \\ p_b, x=b \\ 0, other \end{array} \right . {} p(x)=pa,x=apb,x=b0,other
其中,a,b均为常数,表示像素值的取值范围。当 p a = 0 p_a=0 pa=0 p b = 0 p_b=0 pb=0时,表示单极脉冲,当 p a ≠ 0 、 p b ≠ 0 p_a\neq 0、p_b \neq 0 pa=0pb=0 p a ≈ p b p_a \approx p_b papb时,称之为椒盐噪声。

运动模糊图像

运动模糊通常是物体与相机的相对运动引起的,其中最简单的就是匀速直线运动。用公式表示如下:
h ( x , y ) = { 1 d , y = x t a n θ , 0 ≤ x ≤ d c o s θ 0 {} h(x,y)=\left\{ \begin{array}{lr} \frac{1}{d}, y=xtan\theta,0\leq x \leq dcos\theta \\ 0 \end{array} \right . {} h(x,y)={d1,y=xtanθ,0xdcosθ0
其中,d表示运动的距离, θ \theta θ表示运动方向。但是在实际生活中除速度、角度等变化外,运动模糊产生的原因往往比较复杂。

模糊图像仿真

Lean图像下载,对于高斯模糊采取的模糊策略是模糊半径为2px;对于椒盐噪声采取的模糊策略是添加10%噪声;对于运动模糊,采取的模糊策略是模糊距离为10px;对于异物遮挡图像采取的模糊策略是用黑色遮挡30*30px的图像区域。

仿真结果

在这里插入图片描述

仿真代码

import os
import cv2
import pylab
import random
import numpy as np
from skimage import io
from matplotlib import pyplot as plt
from PIL import Image, ImageFilter, ImageDraw



#默认10%的椒盐噪声
def salt_and_pepper_noise(noise_img, proportion=0.1):
    height, width, _ = noise_img.shape
    num = int(height * width * proportion)  # 多少个像素点添加椒盐噪声
    for i in range(num):
        w = random.randint(0, width - 1)
        h = random.randint(0, height - 1)
        if random.randint(0, 1) == 0:
            noise_img[h, w] = 0
        else:
            noise_img[h, w] = 255
    return noise_img


'''
生成运动模糊图像 模糊距离10px
'''

def motion_blur(image, degree=10, angle=45):
    image = np.array(image)

    # 这里生成任意角度的运动模糊kernel的矩阵, degree越大,模糊程度越高
    M = cv2.getRotationMatrix2D((degree / 2, degree / 2), angle, 1)
    motion_blur_kernel = np.diag(np.ones(degree))
    motion_blur_kernel = cv2.warpAffine(motion_blur_kernel, M, (degree, degree))

    motion_blur_kernel = motion_blur_kernel / degree
    blurred = cv2.filter2D(image, -1, motion_blur_kernel)

    # convert to uint8
    cv2.normalize(blurred, blurred, 0, 255, cv2.NORM_MINMAX)
    blurred = np.array(blurred, dtype=np.uint8)
    return blurred

'''
 生成马赛克图像
:param rgb_img
:param int x :  马赛克左顶点
:param int y:  马赛克左顶点
:param int w:  马赛克宽
:param int h:  马赛克高
:param int neighbor:  马赛克每一块的宽
'''

def do_mosaic(img, x, y, w, h, neighbor=9):
    for i in range(0, h , neighbor):
        for j in range(0, w , neighbor):
            rect = [j + x, i + y]
            color = img[i + y][j + x].tolist()  # 关键点1 tolist
            left_up = (rect[0], rect[1])
            x2=rect[0] + neighbor - 1   # 关键点2 减去一个像素
            y2=rect[1] + neighbor - 1
            if x2>x+w:
                x2=x+w
            if y2>y+h:
                y2=y+h
            right_down = (x2,y2)
            cv2.rectangle(img, left_up, right_down, color, -1)   #替换为为一个颜值值
    return img


def main():

    #对before文件夹下的所有图片加入噪声,保存到after_salt文件夹中
    # for root, dirs, files in os.walk(r"../dataset/before/"):
    #     for file in files:
    #         img = io.imread(os.path.join(root, file))
    #         noise_img = salt_and_pepper_noise(img)
    #         io.imsave(os.path.join('../dataset/after_salt/', file),noise_img)

    #原lena图像路径
    path='./lena512color.tiff'

    #高斯模糊仿真
    im = Image.open(path)
    im = im.filter(ImageFilter.GaussianBlur(radius=2))
    im.save('./lena_gaussian.png')

    #椒盐噪声模糊仿真
    img = io.imread(path)
    lean_noise=salt_and_pepper_noise(img)
    io.imsave('./lena_noise.png',lean_noise)

    #运动模糊仿真
    img = cv2.imread(path)
    motion_img = motion_blur(img)
    cv2.imwrite('./lena_motion.png',motion_img)

    #遮挡图像仿真(图像裁剪)
    im = Image.open(path)
    draw = ImageDraw.Draw(im)
    #裁剪矩形,左上角和右下角的坐标,像素用0填充
    draw.rectangle((70, 100, 100, 130), fill=(0))
    im.save('./lena_crop.png')

    #马赛克图像仿真
    img=cv2.imread(path)
    lena_mosaic=do_mosaic(img, 200, 200, 200, 200, neighbor=10)
    cv2.imwrite('./lena_mosaic.png',lena_mosaic)


if __name__ == '__main__':
    main()
为了深入理解图像复原技术并有效应对退化图像的复原,建议参考《数字图像处理中的图像复原技术详解》一书。在图像退化模型的识别和复原过程中,频率域滤波器扮演着重要的角色。 参考资源链接:[数字图像处理中的图像复原技术详解](https://wenku.csdn.net/doc/2gk8ucncw4?spm=1055.2569.3001.10343) 首先,图像退化模型的确定是复原的第一步。针对散焦退化,可以使用高斯模糊模型;对于运动模糊,则通常假设图像的模糊是由于摄像机与场景相对运动的积分效应引起的,可以用线性运动模型来描述。确定了退化模型后,可以设计相应的逆滤波器或者最小均方误差滤波器来复原图像。 逆滤波器是基于退化模型直接应用逆运算来复原图像的方法。具体操作是首先将图像从空间域变换到频率域,然后利用已知的退化模型计算频域内的逆滤波器传递函数。例如,若退化模型为线性运动模糊,其傅里叶变换在频率域中表现为乘以一个特定的函数。逆滤波的过程就是将退化图像的傅里叶变换除以这个函数。然而,逆滤波器对噪声非常敏感,因此实际应用中常常会遇到问题。 为了克服逆滤波器的缺陷,可以采用最小均方误差滤波器,如维纳滤波器。维纳滤波器在复原时考虑了图像信号和噪声的统计特性,可以平衡退化图像的恢复和噪声抑制。设计维纳滤波器通常需要知道退化过程的PSF(点扩散函数)以及图像和噪声的功率谱密度。 在实际操作中,复原流程大致为:首先获取退化图像,然后通过实验或估计得到退化模型参数,接着变换到频率域,设计合适的滤波器并进行滤波操作,最后将结果变换回空间域,得到复原后的图像。 总之,频率域滤波器在图像复原中非常有效,特别是对于退化模型已知的情况。但在实际应用中,必须仔细考虑模型的准确性、噪声的存在及其特性,以及滤波器设计的合理性,才能实现高质量的图像复原。如果您对图像复原技术的细节和实践应用有进一步的兴趣和需求,推荐详细阅读《数字图像处理中的图像复原技术详解》。该书不仅为您提供了复原技术的理论基础,还包含丰富的案例分析和实际应用指导,为您的深入学习和研究提供了全面支持。 参考资源链接:[数字图像处理中的图像复原技术详解](https://wenku.csdn.net/doc/2gk8ucncw4?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

z2bns

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值