「图像处理」图像的复原
介绍
图像在形成、记录、处理和传输过程中,由于成像系统、记录设备、传输介质和处理方法的问题,导致图像质量下降,这种现象叫图像退化。 而图像复原就是对退化的图像进行处理,尽可能的复原图像的本来面目。
如图,先对图片进行模糊处理
代码解释
//图像恢复
public int[] imRestore(int[] pixels, int iw, int ih)
{
double[] newPixels = new double [iw*ih];
double[] newKernel = new double [iw*ih];
//初始化
for(int j = 0; j < ih; j++)
{
for(int i = 0; i < iw; i++)
{
newPixels[i+j*iw] = pixels[i+j*iw]&0xff;
if((i<5) && (j<5))
newKernel[i+j*iw] = 1.0/25;
else
newKernel[i+j*iw] = 0;
}
}
//初始化
Complex[] complex = new Complex[iw*ih];
Complex[] comKernel = new Complex[iw*ih];
for(int i = 0;i < iw*ih; i++)
{
complex[i] = new Complex(0,0);
comKernel[i] = new Complex(0,0);
}
//对原图像进行FFT (快速傅氏变换)
fft2 = new FFT2();
fft2.setData2(iw, ih, newPixels);
complex = fft2.getFFT2();
//对卷积核进行FFT
fft2 = new FFT2();
fft2.setData2(iw, ih, newKernel);
comKernel = fft2.getFFT2();
//逆滤波复原
for(int j = 0;j < ih; j++)
{
for(int i = 0; i < iw; i++)
{
double re = complex[i+j*iw].re;
double im = complex[i+j*iw].im;
double reKernel = comKernel[i+j*iw].re;
double imKernel = comKernel[i+j*iw].im;
double x = reKernel*reKernel+imKernel*imKernel;
if(x > 1e-3)
{
double r = (re*reKernel+im*imKernel)/x;
double m = (im*reKernel-re*imKernel)/x;
complex[i+j*iw].re = r;
complex[i+j*iw].im = m;
}
}
}
//进行FFT反变换
fft2 = new FFT2();
fft2.setData2i(iw, ih, complex);
pixels = fft2.getPixels2i();
return pixels;
}