逆滤波的实现(VC++)

news/2024/7/6 1:42:50 标签: vc++, winapi, fft, delete, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left"> #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr

color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">  //参数说明:
//LPSTR lpDIBBits    - 指向源DIB图像指针
//LONG  lWidth       - 源图像宽度(象素数࿰c;必须是4的倍数)
//LONG  lHeight      - 源图像高度(象素数)
/
//函数说明:
//该函数用来对BlurDIB()生成的DIB图像进行复原操作。
BOOL WINAPI RestoreDIB (LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
{
 // 指向源图像的指针
 LPSTR lpSrc;
 //循环变量
 long i;
 long j;
 //像素值
 unsigned char pixel;
 // 图像每行的字节数
 LONG lLineBytes;
 //用于做FFT的数组
 double *class="tags" href="/tags/FFT.html" title=fft>fftSrc,*class="tags" href="/tags/FFT.html" title=fft>fftKernel;
 double a,b,c,d;
 //二维FFT的长度和宽度
 unsigned long nn[3];
 //图像归一化因子
 double MaxNum;
 // 计算图像每行的字节数
 lLineBytes = WIDTHBYTES(lWidth * 8);
 double dPower = log((double)lLineBytes)/log(2.0);
 if(dPower != (int) dPower)
 {
  return false;
 }
 dPower = log((double)lHeight)/log(2.0);
 if(dPower != (int) dPower)
 {
  return false;
 }
 class="tags" href="/tags/FFT.html" title=fft>fftSrc = new double [lHeight*lLineBytes*2+1];
 class="tags" href="/tags/FFT.html" title=fft>fftKernel = new double [lHeight*lLineBytes*2+1];
 nn[1] = lHeight;
 nn[2] = lLineBytes;
 for (j = 0;j < lHeight ;j++)
 {
  for(i = 0;i < lLineBytes ;i++)
  {
   // 指向源图像倒数第j行࿰c;第i个象素的指针   
   lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
   
   pixel = (unsigned char)*lpSrc;
   
   class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1] = (double)pixel;
   class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 2] = 0.0;
   
   if(i < 5 && j == 0)
   {
    class="tags" href="/tags/FFT.html" title=fft>fftKernel[(2*lLineBytes)*j + 2*i + 1] = 1/5.0;
   }
   else
   {
    class="tags" href="/tags/FFT.html" title=fft>fftKernel[(2*lLineBytes)*j + 2*i + 1] = 0.0;
   }
   class="tags" href="/tags/FFT.html" title=fft>fftKernel[(2*lLineBytes)*j + 2*i + 2] = 0.0;
  }
 }
 
 //对源图像进行FFT
 fourn(class="tags" href="/tags/FFT.html" title=fft>fftSrc,nn,2,1);
 //对卷积核图像进行FFT
 fourn(class="tags" href="/tags/FFT.html" title=fft>fftKernel,nn,2,1);
 for (j = 0;j < lHeight ;j++)
 {
  for(i = 0;i < lLineBytes ;i++)
  {
   a = class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1];
   b = class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 2];
   c = class="tags" href="/tags/FFT.html" title=fft>fftKernel[(2*lLineBytes)*j + 2*i + 1];
   d = class="tags" href="/tags/FFT.html" title=fft>fftKernel[(2*lLineBytes)*j + 2*i + 2];
   if (c*c + d*d > 1e-3)
   {
    class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1] = ( a*c + b*d ) / ( c*c + d*d );
    class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 2] = ( b*c - a*d ) / ( c*c + d*d );
   }
  }
 }
 //对结果图像进行反FFT
 fourn(class="tags" href="/tags/FFT.html" title=fft>fftSrc,nn,2,-1);
 
 //确定归一化因子
 MaxNum = 0.0;
 for (j = 0;j < lHeight ;j++)
 {
  for(i = 0;i < lLineBytes ;i++)
  {
   class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1] = 
    sqrt(class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1] * class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1]/
    +class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 2] * class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 2]);
   if( MaxNum < class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1])
    MaxNum = class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1];
  }
 }
 
 //转换为图像
 for (j = 0;j < lHeight ;j++)
 {
  for(i = 0;i < lLineBytes ;i++)
  {
   // 指向源图像倒数第j行࿰c;第i个象素的指针   
   lpSrc = (char *)lpDIBBits + lLineBytes * j + i;
   
   *lpSrc = (unsigned char) (class="tags" href="/tags/FFT.html" title=fft>fftSrc[(2*lLineBytes)*j + 2*i + 1]*255.0/MaxNum);
  }
 }
 class="tags" href="/tags/DELETE.html" title=delete>delete class="tags" href="/tags/FFT.html" title=fft>fftSrc;
 class="tags" href="/tags/DELETE.html" title=delete>delete class="tags" href="/tags/FFT.html" title=fft>fftKernel;
 // 返回
 return true;
}

color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">  

color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left"> BOOL fourn(double * data/*psrc*/, unsigned long nn[]/*w*/, int ndim/*2*/, int isign)
{
 int idim;
 unsigned long i1,i2,i3,i2rev,i3rev,ip1,ip2,ip3,ifp1,ifp2;
 unsigned long ibit,k1,k2,n,nprev,nrem,ntot;
 double tempi,tempr;
 double theta,wi,wpi,wpr,wr,wtemp;

color:rgb(51,51,51); font-family:Arial; font-size:14px; line-height:26px; text-align:left">  for (ntot=1,idim=1;idim<=ndim;idim++)
  ntot *= nn[idim];
 nprev=1;
 for (idim=ndim;idim>=1;idim--) {
  n=nn[idim];
  nrem=ntot/(n*nprev);
  ip1=nprev << 1;
  ip2=ip1*n;
  ip3=ip2*nrem;
  i2rev=1;
  for (i2=1;i2<=ip2;i2+=ip1) {
   if (i2 < i2rev) {
    for (i1=i2;i1<=i2+ip1-2;i1+=2) {
     for (i3=i1;i3<=ip3;i3+=ip2) {
      i3rev=i2rev+i3-i2;
      SWAP(data[i3],data[i3rev]);
      SWAP(data[i3+1],data[i3rev+1]);
     }
    }
   }
   ibit=ip2 >> 1;
   while (ibit >= ip1 && i2rev > ibit) {
    i2rev -= ibit;
    ibit >>= 1;
   }
   i2rev += ibit;
  }
  ifp1=ip1;
  while (ifp1 < ip2) {
   ifp2=ifp1 << 1;
   theta=isign*6.28318530717959/(ifp2/ip1);
   wtemp=sin(0.5*theta);
   wpr = -2.0*wtemp*wtemp;
   wpi=sin(theta);
   wr=1.0;
   wi=0.0;
   for (i3=1;i3<=ifp1;i3+=ip1) {
    for (i1=i3;i1<=i3+ip1-2;i1+=2) {
     for (i2=i1;i2<=ip3;i2+=ifp2) {
      k1=i2;
      k2=k1+ifp1;
      tempr=wr*data[k2]-wi*data[k2+1];
      tempi=wr*data[k2+1]+wi*data[k2];
      data[k2]=data[k1]-tempr;
      data[k2+1]=data[k1+1]-tempi;
      data[k1] += tempr;
      data[k1+1] += tempi;
     }
    }
    wr=(wtemp=wr)*wpr-wi*wpi+wr;
    wi=wi*wpr+wtemp*wpi+wi;
   }
   ifp1=ifp2;
  }
  nprev *= n;
 }
 return true;
}

cle>

http://www.niftyadmin.cn/n/790723.html

相关文章

维纳滤波实现(VC++)

本代码中涉及到的相关函数见上篇“逆滤波的实现&#xff08;VC&#xff09;” //参数说明: //LPSTR lpDIBBits:指向源DIB图像指针//LONG lWidth:源图像宽度&#xff08;象素数&#xff09;//LONG lHeight:源图像高度&#xff08;象素数&#xff09;//函数说明://该函数用来对…

运动模糊实现(VC++)

bool MotionBlur(IplImage* src){// 指向目标图像的指针unsigned char * LPsrc;//图象的宽度和高度int Width src->width;int Height src->height;int LineBytessrc->width*src->nChannels;int iColumn, jRow;//循环变量int temp,m;//临时变量double p,q;//…

OpenCV实现傅里叶变换

#include <stdio.h> #include <cv.h> #include <cxcore.h> #include <highgui.h>/************************************************************************** //傅里叶变换 //src IPL_DEPTH_8U //dst IPL_DEPTH_64F /****************************…

【Visual C++】关于无法打开包括文件:“StdAfx.h”或者意外结尾的错误解决方案

最近有朋友在编译我提供的【Visual C】游戏开发某一节笔记的源代码的时候&#xff0c;提到出现 “fatal error C1083: 无法打开包括文件:“StdAfx.h”这个错误。这里我专门找了点资料&#xff0c;然后部分修改&#xff0c;写成了一篇博文发出来&#xff0c;希望能对出现这个问…

openCV平滑函数----cvSmooth

openCV平滑函数 [cpp] view plaincopyprint? void cvSmooth( const CvArr* src, CvArr* dst, int smooth CV_GAUSSIAN, int param1 3, int param2 0, int param3 0, int param4 0 ); 注解&#xff1a; (1)可能大家啊对CvA…

C++预编译头文件讲解

为什么所有的 cpp 都必须 #include "stdafx.h" 也许请教了别的高手之后&#xff0c;他们会告诉你&#xff0c;这是预编译头&#xff0c;必须包含。可是&#xff0c;这到底是为什么呢&#xff1f;预编译头有什么用呢&#xff1f; 这得从头文件的编译原理讲起。其实头文…

防止头文件重复包含引起的变量重复定义

test-1.0使用#ifndef只是防止了头文件被重复包含(其实本例中只有一个头件&#xff0c;不会存在重复包含的问题)&#xff0c;但是无法防止变量被重复定义。 # vi test.c-------------------------------#include <stdio.h>#include "test.h"extern i;extern voi…

C++函数对象与函数指针不同之处

在C编程语言中&#xff0c;有很多功能都与C语言相通&#xff0c;比如指针的应用等等。在这里我们介绍的则是一种类似于函数指针的C函数对象的相关介绍。C函数对象不是函数指针。但是&#xff0c;在程序代码中&#xff0c;它的调用方式与函数指针一样&#xff0c;后面加个括号就…