第五章 图像复原

        本章主要内容为图像退化模型与噪声模型、图像的空域复原和频域复原方法、退化函数的估计方法、逆滤波、维纳滤波、约束最小二乘滤波。

        本章要求重点掌握的内容为四种典型的图像噪声的表现特点;图像退化的数学模型;三种典型的退化函数;退化函数的估计方法。

        本章科普内容为图像退化过程的产生原因;图像退化函数的辨识;Wiener滤波。

5.1 图像噪声

5.1.1 白噪声(White Noise)

        白噪声具有常量的功率谱,其一个特例是高斯噪声(Gaussian Noise),其直方图曲线服从一维高斯模型分布:

\large p(x)=\frac{1}{\sqrt{2\pi}\sigma }e^{-\frac{(x-\mu )^{2}}{2\sigma^{2}}}

        \large \mu,\sigma 为均值与标准差。MATLAB函数为 J=imnoise(I, 'gaussian', M, V),M,V为均值和标准差。

 5.1.2 椒盐噪声(Pepper & Salt Noise)

        椒盐噪声是一种在图像中产生黑色、白色点的脉冲噪声。该噪声在图像中显现较为明显,对图像分割边缘检测特征提取等后续处理具有严重破坏作用。

        MATLAB函数为J=IMNOISE(I, 'salt & pepper', D),D为噪声密度。

 5.1.3 乘性噪声(Multiplication Noise)

        乘性噪声与加性噪声对应,加性噪声一般指热噪声、散弹噪声等,它们与原始信号的关系是相加,不管有没有原始信号,噪声都存在。而乘性噪声一般由信道不理想引起,它们与信号的关系是相乘,依附于信号而存在。

        MATLAB产生函数为J=imnoise(I, 'speckle', V),V为噪声方差。

 5.1.4 量化噪声(Quatization Noise)

        在量化级别不同时出现的噪声。例如,将图像的亮度级别减少到1/16时会出现伪轮廓。量化噪声可以从直方图分布予以分析。

5.2 图像退化 

5.2.1 图像退化形式、图像复原目的

        图像复原是早期图像处理的主要内容之一,目的在于消除或减轻在图像获取及传输过程中造成的图像品质下降即退化现象,恢复图像的本来面目。

        退化包括由成像系统光学特性造成的歧变,以及噪声相对运动造成的模糊等情况。

        图像复原是试图利用退化过程的先验知识,去恢复已被退化图像的本来面目。

        图像复原的基本思路是先建立退化的数学模型然后根据该模型对退化图像进行拟合。图像复原可以在空域进行处理,也可以在频域进行处理。

5.2.2 图像退化产生原因

        图像退化产生过程包括:光学系统的像差大气流的扰动效应摄影胶片的非线性图像运动造成的模糊光学系统中的几何畸变传感器非线性

 5.2.3 图像退化的数学模型

        设一成像系统的物像映射关系(或说退化图像)为:

\large g(x,y)=T[f(x,y)]

        模型表示为:

\large f(x,y)\rightarrow T[]\rightarrow g(x,y)

        \large T[]可以理解为成像系统作用的运算符,实际成像系统在一定条件下可近似看作线性移不变系统,图像恢复过程中往往使用线性移不系统模型

        复杂激励f(x, y) 等于无数个\large \delta函数激励之和。   

        \large \delta函数选择性:

\large f(x,y)=\int \int f(\alpha, \beta)\delta(x-\alpha,y-\beta)d\alpha d\beta

\large g(x,y)=\int \int f(\alpha, \beta)h(x,y,\alpha,\beta)d\alpha d\beta

        系统脉冲响应(点扩散函数,PSF: Point-Spread Function):

\large h(x,y,\alpha, \beta)=T[\delta(x-\alpha, y-\beta)]

        先求出系统对基元函数的响应(输出)表达式(即系统脉冲响应),再乘以相应权重因子后求和,就可以得到退化图像。

        根据移不变性质:

\large h(x,y,\alpha,\beta)=h(x-\alpha,y-\beta)

        近代光学中用成像概念来描述的退化图像(degraded image)的数学表达式。

\large g(x,y)=\int \int f(\alpha, \beta)h(x-\alpha, y-\beta)d\alpha d\beta=f(x,y)*h(x,y)

        图像退化过程一般看作是噪声的污染过程,且假定噪声是加性白噪声,这时退化后的图像为:

\large g(x,y)=H[f(x,y)]+n(x,y)

        模型表示为:

         H[]可理解为综合所有退化因素的函数,实际成像系统在一定条件下可近似看作是线性以不变系统,图像恢复过程中往往使用线性移不变的系统模型,利用矩阵模型表示为:

\large g=Hf+n

        g, f, n为图像排成的列向量。

        图像频域的退化公式:

\large G(u,v)=H(u,v)F(u,v)+N(u,v)

        模型表示为: 

        利用FFT,可以将g, f, n转化到频域:

 5.2.4 常见退化函数

 5.2.4.1 线性运动退化函数

        由于目标成像系统间的相对匀速直线运动形成的退化。水平方向的线性运动可表示为:

\large h(m,n)= \left\{\begin{matrix} 1/d;0\leqslant m\leqslant d, n=0 & \\ 0\ \ ; \qquad \qquad other & \end{matrix}\right.

 5.2.4.2 焦散退化函数

        几何光学分析表明,光学系统焦散造成的图像退化对应的点扩散函数应该是一个均匀分布的圆形光斑,可表示为:

\large \left \{ \begin{matrix} 1/(\pi R^{2});\qquad u^{2}+v^{2} & \\ 0; \qquad \qquad other& \end{matrix} \right.

 5.2.4.3 高斯退化函数

         高斯退化函数是许多光学测量系统和成像系统最常见的退化函数。在这些系统中,由于决定系统点扩散函数的因素较多,其综合效果往往使最终的点扩散函数趋近于高斯型

\large \left\{\begin{matrix} K*exp(-s(m^{2}+n^{2})) \qquad (m,n) \leqslant C & \\ 0 \qquad \qquad \qquad \qquad \quad other & \end{matrix}\right.

        其中K是归一化常数,是一个正常数,C是圆形支持域。下图为高斯退化图像。

5.3 图像退化函数的辨识

5.3.1图像观察法

        对于一幅模糊图像,首先提取包含简单结构的一小部分图像,然后根据这部分图像中目标和背景的灰度级,就可以构建一幅不模糊的图像,该图像与观察到的子图像具有相同的大小和特性

        \large H_{s}(u,v)=\frac{G_{s}(u,v)}{\hat{F}_{s}(u,v)}\rightarrow H(u,v)

5.3.2 试验估计法

        使用与获取退化图像的设备相似的设备,那么利用相同的系统设置,就可以由成像一个脉冲(小亮点)得到退化函数的冲击响应。亮点必须尽可能的亮,达到减少噪声干扰的目的。由于冲激响应的DFT为常量,有:

\large H(u,v)=\frac{G(u,v)}{A}

5.3.3 数学建模法

        利用引起退化的物理环境来建立退化模型,如Hufnagel和Stanley提出的基于大气湍流图例推行的退化模型:

\large H(u,v)=exp{\{-k(u^{2}+v^{2})^{(5/6)}}\}

5.4 图像恢复

5.4.1 无约束恢复和有约束恢复

5.4.1.1 无约束恢复

        从前面建立的模型可知,无约束是令||n||²最小:

\large g=Hf+n \rightarrow n = g-Hf \rightarrow||n||^{2}=||g-H\hat{f}||^{2}

\large J(\hat{f})=||g-H\hat{f}||^{2}

\large \hat{f}=(H^{T}H)^{-1}H^{T}g

\large if \qquad M=N

\large \hat{f}=H^{-1}(H^{T})^{-1}H^{T}g=H^{-1}g

5.4.1.2 有约束恢复

·        令Q是f的线性算子,有约束是令||Qf||²最小:

\large J(\hat{f})=||Q\hat{f}||^{2}+\alpha(||g-H\hat{f}||^{2}-||n||^{2})

\large \hat{f}=(H^{2}H+\frac{1}{\alpha Q^{T}Q})^{-1}H^{T}g

5.4.2 维纳滤波

        令 \large R_{f},R_{n} 是原始图像和噪声的相关矩阵,其中:

\large R_f = E[f,f^{T}]

\large R_n=E[n,n^{T}]

\large Q^{T}Q=R^{-1}_fR_n

        则原始图像在最小均方误差准则下的最佳恢复解为:

\large \hat{f}=(H^{T}H+\frac{1}{\alpha R^{-1}_f R_n})^{-1}H^{T}g

         维纳滤波的频域表示:

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像复原是一项复杂的任务,C语言作为一种高效的编程语言,也可以用于图像处理。这里我为您提供一个基于C语言的图像复原示例代码,实现的是维纳滤波算法,该算法可以用于去除图像中的模糊和噪声。 示例代码如下: ```c #include <stdlib.h> #include <stdio.h> #include <math.h> #define PI 3.14159265358979323846 // 定义一个结构体,用于表示图像 typedef struct { int width; int height; float *data; } Image; // 读取图像函数 Image *readImage(const char *filename) { FILE *file; int width, height; Image *image; file = fopen(filename, "rb"); if (!file) { fprintf(stderr, "Error: unable to open %s\n", filename); return NULL; } // 读取图像宽度和高度 fscanf(file, "%d %d", &width, &height); // 创建图像结构体 image = (Image *) malloc(sizeof(Image)); image->width = width; image->height = height; image->data = (float *) malloc(sizeof(float) * width * height); // 读取图像数据 for (int i = 0; i < width * height; i++) { fscanf(file, "%f", &image->data[i]); } fclose(file); return image; } // 保存图像函数 void saveImage(const char *filename, Image *image) { FILE *file; file = fopen(filename, "wb"); if (!file) { fprintf(stderr, "Error: unable to open %s\n", filename); return; } // 写入图像宽度和高度 fprintf(file, "%d %d\n", image->width, image->height); // 写入图像数据 for (int i = 0; i < image->width * image->height; i++) { fprintf(file, "%f ", image->data[i]); } fclose(file); } // 维纳滤波函数 Image *weinerFilter(Image *input, float k, float l) { int width = input->width; int height = input->height; Image *output = (Image *) malloc(sizeof(Image)); output->width = width; output->height = height; output->data = (float *) malloc(sizeof(float) * width * height); float *tmp = (float *) malloc(sizeof(float) * width * height); for (int i = 0; i < width * height; i++) { tmp[i] = pow(input->data[i], 2.0) / l; } float *h = (float *) malloc(sizeof(float) * width * height); for (int i = 0; i < width * height; i++) { h[i] = exp(-k * tmp[i]); } float *g = (float *) malloc(sizeof(float) * width * height); for (int i = 0; i < width * height; i++) { g[i] = h[i] / (h[i] + 1.0 / l); } for (int i = 0; i < width * height; i++) { output->data[i] = g[i] * input->data[i]; } free(tmp); free(h); free(g); return output; } int main(int argc, char *argv[]) { if (argc < 4) { printf("Usage: %s input output k l\n", argv[0]); return 1; } // 读取输入图像 Image *input = readImage(argv[1]); if (!input) { return 1; } // 解析参数 float k = atof(argv[3]); float l = atof(argv[4]); // 进行维纳滤波 Image *output = weinerFilter(input, k, l); // 保存输出图像 saveImage(argv[2], output); // 释放内存 free(input->data); free(input); free(output->data); free(output); return 0; } ``` 在这个代码中,首先定义了一个结构体 `Image`,用于表示图像。然后定义了读取图像函数 `readImage()` 和保存图像函数 `saveImage()`,这两个函数分别用于读取图像和保存处理后的图像。接着定义了维纳滤波函数 `weinerFilter()`,用于进行图像复原。最后在 `main()` 函数中读取输入图像,解析参数,进行维纳滤波,并保存输出图像。 需要注意的是,这个代码中的图像数据类型是 `float`,而不是常见的 `unsigned char`。这是因为在进行维纳滤波时需要对图像像素进行平方运算,而这个运算可能导致数据溢出,因此需要使用浮点数类型来避免这个问题。另外,这个代码只是一个示例,实际使用时还需要进行一些改进,比如增加图像处理的鲁棒性和效率等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值