数字图像处理总结(六)

本文总结了数字图像处理的频域滤波部分,包括2D DFT与IDFT的基本思想和加速算法,特别是FFT shift的目的。讨论了同态滤波的原理及其处理流程,介绍了带阻和带通滤波的应用与陷波滤波器的工作原理。在图像恢复章节,探讨了降级模型以及逆滤波在应对线性失真中的作用。
摘要由CSDN通过智能技术生成

Part8 频域滤波 filtering in the frequency domain

主要内容包括一些点、线、边缘的检测算子和检测原理。

2D DFT IDFT

基本思想

前向传播和反向传播

在这里插入图片描述

Complex DFT(Complex[,]f,int u,int v)
{
   int M = f.GetLength(0);
   int N = f.GetLength(1);

   Complex Fuv = new Complex(0,0);

   for (int x=0;x<M;x++)
      for (int y=0;y<N;y++)
      {
          double a = -2*Math.PI*((double)u*x/M+(double)v*y/N); 
          Fuv += f[x,y]*new Complex(Cos(a),Sin(a));
       }

   return Fuv;
}

Complex[,] DFT(Complex[,] f)
{
    int M = f.GetLength(0);
    int N = f.GetLength(1);
    Complex[,] F = new Complex[M, N];

    double Pi = 3.1415926;

    for (int u = 0; u < M; u++)
        for (int v = 0; v < N; v++)
        {
            F[u, v] = new Complex(0, 0);

            for (int x = 0; x < M; x++)
                for (int y = 0; y < N; y++)
                {
                    
                    double a = 2*Pi * ((double)u * x / M + (double)v * y / N);
                    F[u, v] += f[x, y] * new Complex(Math.Cos(-a), Math.Sin(-a));
                }
        }

    return F;
}

Complex[,] IDFT(Complex[,] F)
{
    int M = F.GetLength(0);
    int N = F.GetLength(1);
    Complex[,] f = new Complex[M, N];

    double Pi = 3.1415926;

    for (int x = 0; x < M; x++)
        for (int y = 0; y < N; y++)
        {
            f[x, y] = new Complex(0, 0);

            for (int u = 0; u < M; u++)
                for (int v = 0; v < N; v++)
                {
                    
                    double a = 2*Pi *((double)u * x / M + (double)v * y / N);
                    f[x, y] += F[u, v] * new Complex(Math.Cos(a), Math.Sin(a));
                }

            f[x, y] *= 1.0 / (M * N);
        }

            
    return f;
}

byte[,] ToByte(Complex[,] f)
{
    int w = f.GetLength(0);
    int h = f.GetLength(1);

    byte[,] g = new byte[w, h];

    for (int y = 0; y < h; y++)
        for (int x = 0; x < w; x++)
        {
            g[x, y] = SByte(f[x, y].Real);
        }

    return g;
}

Complex[,] ToComplex(byte[,] f)
{
    int w = f.GetLength(0);
    int h = f.GetLength(1);

    Complex[,] g = new Complex[w, h];

    for (int y = 0; y < h; y++)
        for (int x = 0; x < w; x++)
        {
            g[x, y] = new Complex(f[x, y], 0);
        }

    return g;
}

byte SByte(double v)
{
    if (v > 255) return 255;
    if (v < 0) return 0;
    return (byte)v;
}



void main()
{
   byte[,] f = LoadImg();
   ShowImg("f",f);

   DateTime t0 = DateTime.Now;

   Complex[,] F = DFT(ToComplex(f));
   byte[,] f_ = ToByte(IDFT(F)); 

   DateTime t1 = DateTime.Now;

   print((t1-t0));


   ShowImg("f_",f_);
}

加速算法

void DFT(Complex[] f, Complex[] F)  // 1D DFT
{
    int N = f.GetLength(0);
    double Pi = 3.1415926;

    for (int u = 0; u < N; u++)
    {
        F[u] = new Complex(0, 0);

        for (int n = 0; n < N; n++)
        {
            double a = 2*Pi*((double)u * n / N);
            F[u] += f[n] * new Complex(Math.Cos(-a), Math.Sin(-a));
        }
    }
}

Complex[,] DFT_V(Complex[,] f)   //求垂直方向的1D DFT
{
    int M = f.GetLength(0);
    int N = f.GetLength(1);
    Complex[,] F = new Complex[M, N];

    Complex[] f_ = new Complex[N];
    Complex[] F_ = new Complex[N];

    for (int x=0;x<M;x++)
    {
       for (int y=0;y<N;y++)
          f_[y] = f[x,y];

       DFT(f_,F_);

       for (int y=0;y<N;y++)
          F[x,y] = F_[y];
     }

  return F;
}

Complex[,] DFT_H(Complex[,] f)  //求水平方向的1D DFT
{
    int M = f.GetLength(0);
    int N = f.GetLength(1);
    Complex[,] F = new Complex[M, N];

    Complex[] f_ = new Complex[M];
    Complex[] F_ = new Complex[M];

    for (int y=0;y<N;y++)
    {
       for (int x=0;x<M;x++)
          f_[x] = f[x,y];

       DFT(f_,F_);

       for (int x=0;x<M;x++)
          F[x,y] = F_[x];
     }

  return F;
}

Complex[,] DFT(Complex[,] f)  // 结合起来
{
    return DFT_H(DFT_V(f));
}


Complex[,] IDFT(Complex[,] F)
{
    int M = F.GetLength(0);
    int N = F.GetLength(1);
    Complex[,] f = new Complex[M, N];

    double Pi = 3.1415926;

    for (int x = 0; x < M; x++)
        for (int y = 0; y < N; y++)
        {
            f[x, y] = new Complex(0, 0);

            for (int u = 0; u < M; u++)
                for (int v = 0; v < N; v++)
                {
                    
                    double a = 2*Pi *((double)u * x / M + (double)v * y / N);
                    f[x, y] += F[u, v] * new Complex(Math.Cos(a), Math.Sin(a));
                }

            f[x, y] *= 1.0 / (M * N);
        }

            
    return f;
}

byte[,] ToByte(Complex[,] f)
{
    int w = f.GetLength(0);
    int h = f.GetLength(1);

    byte[,] g = new byte[w, h];

    for (int y = 0; y < h; y++)
        for (int x = 0; x < w; x++)
        {
            g[x, y] = SByte(f[x, y].Real);
        }

    return g;
}

Complex[,] ToComplex(byte[,] f)
{
    int w = f.GetLength(0);
    int h = f.GetLength(1);

    Complex[,] g = new Complex[w, h];

    for (int y = 0; y < h; y++)
        for (int x = 0; x < w; x++)
        {
            g[x, y] = new Complex(f[x, y], 0);
        }

    return g;
}

byte SByte(double v)
{
    if (v > 255) return 255;
    if (v < 0) return 0;
    return (byte)v;
}



void main()
{
   byte[,] f = LoadImg();
   ShowImg("f",f);

   DateTime t0 = DateTime.Now;

   Complex[,] F = DFT(ToComplex(f));
   byte[,] f_ = ToByte(IDFT(F)); 

   DateTime t1 = DateTime.Now;

   print((t1-t0));


   ShowImg("f_",f_);
}

FFT shift

在这里插入图片描述
目的:四周是低频,中间是高频,所以他的目的就是把低频放到中间去好处理一点
在这里插入图片描述

同态滤波 Homomorphic Filtering

基本原理:对于图像而言,可以表示为照射和反射两个分量,如下:
在这里插入图片描述
然后按照下面的流程对图片进行处理即可;H是滤波器

在这里插入图片描述

  1. 首先先取ln
  2. 进行DFT变换,如下图F0
  3. FFTshift 将低频从四周移到中间,如下图F
  4. H进行滤波,去除中间的低频分量,如下图H和G
  5. FFTshift回去
  6. exp变换,下图g

在这里插入图片描述

Bandreject & Bandpass 带阻和带通滤波

图示

在这里插入图片描述
常见的空频域对应图:

在这里插入图片描述
在这里插入图片描述

带阻 带通应用和原理

其表达式如下:

在这里插入图片描述
应用:
在这里插入图片描述

byte[,] GBandReject(int w,int h,double D0,double w0)
{
   byte[,] g = new byte[w,h];

   for (int y=0;y<h;y++)
       for (int x=0;x<w;x++)
       {
            double D = Sqrt((x-w/2)*(x-w/2)+(y-h/2)*(y-h/2));

            g[x,y] = (byte)(255-255*Exp(-(D-D0)*(D-D0)/(2*w0*w0)));
       } 

  return g;
}
byte[,] GBandPass(int w,int h,double D0,double w0)
{
   byte[,] g = new byte[w,h];

   for (int y=0;y<h;y++)
       for (int x=0;x<w;x++)
       {
            double D = Sqrt((x-w/2)*(x-w/2)+(y-h/2)*(y-h/2));

            g[x,y] = (byte)(255*Exp(-(D-D0)*(D-D0)/(2*w0*w0)));
       } 

  return g;
}

陷波滤波器 Notch reject or pass

通过构造这种陷波对,来对图像中的一些干扰频率进行滤波
在这里插入图片描述

原理

每个陷波对都是成对出现,其中心为(uk,vk)(-uk,-vk)(根据图像中心M/2,N/2来决定)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
带通的话,用1-带阻即可

Part9 图像恢复 image restoration

降级模型

在这里插入图片描述
在这里插入图片描述
同之前一样,可以使用如下的操作,来对图像进行滤波
在这里插入图片描述
频域的话是这两个???
在这里插入图片描述

逆滤波(针对线性失真)

在这里插入图片描述

在这里插入图片描述

主要参考

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

百年后封笔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值