还是以前学习图像处理的时候写的函数呀!
编程环境:windows下结合opencv库。
//傅里叶频谱的中心转换
//void ShiftDFT(IplImage* src, IplImage* dst);
void ShiftDFT(CvArr* src, CvArr* dst);
//傅里叶变换的频谱图
void DFTP(IplImage* src, IplImage* dst);
//傅里叶频谱的中心转换
/*
原理解释:利用频谱图像的对称性
源频谱左上角部分->目标频谱右下角部分
源频谱左下角部分->目标频谱右上角部分
源频谱右上角部分->目标频谱左下角部分
源频谱右下角部分->目标频谱左上角部分
利用上述转换生成目标中心对称频谱
*/
void ShiftDFT(CvArr* src, CvArr* dst)
{
if (!src || !dst)
{
return;
}
int nWidth;
int nHeight;
CvMat tmp1;
CvMat tmp2;
//src可能会出现指向CvMat与IplImage两种不同类型的指针,故进行判断后分别执行不同的程序
if (CV_IS_MAT_HDR(src))//src指向CvMat类型指针
{
CvMat* pMatSrc = (CvMat*)src;
nWidth = pMatSrc->width;
nHeight = pMatSrc->height;
//可能会出现src与dst相同的情况,这里保存src以便复制时出现问题
CvMat* pMatSrcTmp = cvCreateMat(nHeight, nWidth, pMatSrc->type);
cvCopy(src, pMatSrcTmp);
//右下角部分装换
cvGetSubRect(src, &tmp1, cvRect(0, 0, nWidth / 2, nHeight / 2));//源图像左上角
cvGetSubRect(dst, &tmp2, cvRect(nWidth / 2, nHeight / 2, nWidth / 2, nHeight / 2));目标图像右下角
cvCopy(&tmp1, &tmp2);//目标图像右下角设定
//右上角部分装换
cvGetSubRect(src, &tmp1, cvRect(0, nHeight / 2, nWidth / 2, nHeight / 2));//源图像左下角
cvGetSubRect(dst, &tmp2, cvRect(nW