する#include <opencv2 \コア\ core.hpp>
の#include <opencv2 \のHighGUI \ highgui.hpp>
の#include <opencv2 \ imgproc \ imgproc.hpp>
使用して 名前空間STD;
使用 名前空間CV;
int型のmain()
{
文字列のパス= " 1.png " ;
マットSRC =関数imread(パス、0 );
// [1]の複素行列、フーリエ変換を記憶するマトリクスは、変換作成する
INT R&LT = getOptimalDFTSize(src.rows);
int型 C = getOptimalDFTSize(SRCを。 colsの); // 最適なサイズの取得
マットパディングを;
//( - src.rows、0、R画像のSRC拡張エッジが大きくなる - 、C src.cols) それぞれ垂直及び水平、
copyMakeBorder(SRC、パッド入り、0、R&LT - src.rows、0、C - SRC .cols、BORDER_CONSTANTは、スカラー:: ::すべて(0 ));
// 複雑なマトリックス、[0]、平面の虚部が[1] 0充填平面の実数部作成
マット面[] = {Mat_ < フロート > (パディング)、マット::ゼロ(padded.size()、CV_32F)};
// [2]フーリエ変換
マットcomplexImgを、
マージ(プレーン、2、complexImgは); // 固体(2つのチャンネルに組み合わせとして理解することができます+虚数部)画像
DFT(complexImg、complexImg); //は、元のDFTは、追加のメモリ、それにデータをコピー、complexImgは複素行列である
INT CX = complexImg.cols / 2 。
INT CY = complexImg.rows / 2 ;
マットM1(complexImg、CV ::のRect(0、0、CX、CY)); // 左上部分
マットM2(complexImg、CV ::のRect(CX、0、CX、CY )); // 右上部
マットM3(complexImg、CV ::のRect(0、CY、CX、CY)); // 左下部分
マットM4(complexImg、CV ::のRect (CX、CY、CX、CY)) ; // 右下部の
マットTEMP;
m1.copyTo(TEMP);
m4.copyTo(M1);
temp.copyTo(M4);
m2.copyTo(TEMP);
m3.copyTo(M2);
temp.copyTo(M3) ;
マットpartFrequencyImg。
complexImg.copyTo(partFrequencyImg)。
// 变换频率
int型 NX1 = INT(0.5F * padded.cols)。
int型 NX2 = INT(0.5F * padded.cols)。
int型 NY1 = INT(0.5F * padded.rows)。
int型 NY2 = INT(0.5F * padded.rows)。
// 逆变换
partFrequencyImg.colRange(NX1、NX2 + 1).setTo(スカラー::全て(0 ))。
partFrequencyImg.rowRange(NY1、NY2 + 1).setTo(スカラー::全て(0 ))。
マットiPartDft [] = {マット::ゼロ(padded.size()、CV_32F)、マット::ゼロ(padded.size()、CV_32F)}。
IDFT(partFrequencyImg、partFrequencyImg)。
スプリット(partFrequencyImg、iPartDft)。
マグニチュード(iPartDft [ 0 ]、iPartDft [ 1 ]、iPartDft [ 0 ])。
CV ::正規化(iPartDft [ 0 ]、iPartDft [ 0 ]、1、0 、CV_MINMAX)。
マットL = iPartDft [ 0 ]。
関数imshow(" L " 、L)。
waitKey(0 )。
}