1. 程式人生 > >OpenCV二點陣圖像的DFT

OpenCV二點陣圖像的DFT

#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include "math.h"
#pragma comment(lib, "cv.lib")
#pragma comment(lib, "cxcore.lib")
#pragma comment(lib, "highgui.lib")
 
// Rearrange the quadrants of Fourier image so that the origin is at
// the image center
// src & dst arrays of equal size & type
void cvShiftDFT(CvArr * src_arr, CvArr * dst_arr )
{
    CvMat * tmp;
    CvMat q1stub, q2stub;
    CvMat q3stub, q4stub;
    CvMat d1stub, d2stub;
    CvMat d3stub, d4stub;
    CvMat * q1, * q2, * q3, * q4;
    CvMat * d1, * d2, * d3, * d4;
 
    CvSize size = cvGetSize(src_arr);
    CvSize dst_size = cvGetSize(dst_arr);
    int cx, cy;
 
    if(dst_size.width != size.width || 
       dst_size.height != size.height){
        cvError( CV_StsUnmatchedSizes, "cvShiftDFT", "Source and Destination arrays must have equal sizes", __FILE__, __LINE__ );   
    }
 
    if(src_arr==dst_arr){
        tmp = cvCreateMat(size.height/2, size.width/2, cvGetElemType(src_arr));
    }
 
    cx = size.width/2;
    cy = size.height/2; // image center
 
    q1 = cvGetSubRect( src_arr, &q1stub, cvRect(0,0,cx, cy) );
    q2 = cvGetSubRect( src_arr, &q2stub, cvRect(cx,0,cx,cy) );
    q3 = cvGetSubRect( src_arr, &q3stub, cvRect(cx,cy,cx,cy) );
    q4 = cvGetSubRect( src_arr, &q4stub, cvRect(0,cy,cx,cy) );
    d1 = cvGetSubRect( dst_arr, &d1stub, cvRect(0,0,cx,cy) );
    d2 = cvGetSubRect( dst_arr, &d2stub, cvRect(cx,0,cx,cy) );
    d3 = cvGetSubRect( dst_arr, &d3stub, cvRect(cx,cy,cx,cy) );
    d4 = cvGetSubRect( dst_arr, &d4stub, cvRect(0,cy,cx,cy) );
 
    if(src_arr!=dst_arr){
        if( !CV_ARE_TYPES_EQ( q1, d1 )){
            cvError( CV_StsUnmatchedFormats, "cvShiftDFT", "Source and Destination arrays must have the same format", __FILE__, __LINE__ ); 
        }
        cvCopy(q3, d1, 0);
        cvCopy(q4, d2, 0);
        cvCopy(q1, d3, 0);
        cvCopy(q2, d4, 0);
    }
    else{
        cvCopy(q3, tmp, 0);
        cvCopy(q1, q3, 0);
        cvCopy(tmp, q1, 0);
        cvCopy(q4, tmp, 0);
        cvCopy(q2, q4, 0);
        cvCopy(tmp, q2, 0);
    }
}
 
int main(int argc, char ** argv)
{
    const char* filename = argc >=2 ? argv[1] : "lena.jpg";
    IplImage * im;
 
    IplImage * realInput;
    IplImage * imaginaryInput;
    IplImage * complexInput;
    int dft_M, dft_N;
    CvMat* dft_A, tmp;
    IplImage * image_Re;
    IplImage * image_Im;
    double m, M;
 
    im = cvLoadImage( filename, CV_LOAD_IMAGE_GRAYSCALE );
    if( !im )
        return -1;
 
    realInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 1);
    imaginaryInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 1);
    complexInput = cvCreateImage( cvGetSize(im), IPL_DEPTH_64F, 2);
 
    cvScale(im, realInput, 1.0, 0.0);
    cvZero(imaginaryInput);
    cvMerge(realInput, imaginaryInput, NULL, NULL, complexInput);
 
    dft_M = cvGetOptimalDFTSize( im->height - 1 );
    dft_N = cvGetOptimalDFTSize( im->width - 1 );
 
    dft_A = cvCreateMat( dft_M, dft_N, CV_64FC2 );
    image_Re = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);
    image_Im = cvCreateImage( cvSize(dft_N, dft_M), IPL_DEPTH_64F, 1);
 
    // copy A to dft_A and pad dft_A with zeros
    cvGetSubRect( dft_A, &tmp, cvRect(0,0, im->width, im->height));
    cvCopy( complexInput, &tmp, NULL );
    if( dft_A->cols > im->width )
    {
        cvGetSubRect( dft_A, &tmp, cvRect(im->width,0, dft_A->cols - im->width, im->height));
        cvZero( &tmp );
    }
 
    // no need to pad bottom part of dft_A with zeros because of
    // use nonzero_rows parameter in cvDFT() call below
 
    cvDFT( dft_A, dft_A, CV_DXT_FORWARD, complexInput->height );
 
    cvNamedWindow("win", 0);
    cvNamedWindow("magnitude", 0);
    cvShowImage("win", im);
 
    // Split Fourier in real and imaginary parts
    cvSplit( dft_A, image_Re, image_Im, 0, 0 );
 
    // Compute the magnitude of the spectrum Mag = sqrt(Re^2 + Im^2)
    cvPow( image_Re, image_Re, 2.0);
    cvPow( image_Im, image_Im, 2.0);
    cvAdd( image_Re, image_Im, image_Re, NULL);
    cvPow( image_Re, image_Re, 0.5 );
 
    // Compute log(1 + Mag)
    cvAddS( image_Re, cvScalarAll(1.0), image_Re, NULL ); // 1 + Mag
    cvLog( image_Re, image_Re ); // log(1 + Mag)
 
 
    // Rearrange the quadrants of Fourier image so that the origin is at
    // the image center
    cvShiftDFT( image_Re, image_Re );
 
    cvMinMaxLoc(image_Re, &m, &M, NULL, NULL, NULL);
    cvScale(image_Re, image_Re, 1.0/(M-m), 1.0*(-m)/(M-m));
    cvShowImage("magnitude", image_Re);
 
    cvWaitKey(-1);
    return 0;
}

原影象與程式效果如下:


相關推薦

OpenCV點陣DFT

#include "cv.h" #include "cxcore.h" #include "highgui.h" #include "math.h" #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib

SSE影象演算法優化系列十五:值影象的Euclidean distance map(EDM)特徵計算及其優化。 SSE影象演算法優化系列九:靈活運用SIMD指令16倍提升Sobel邊緣檢測的速度(4000*3000的24點陣圖像時間由480ms降低到30ms)

  Euclidean distance map(EDM)這個概念可能聽過的人也很少,其主要是用在二值影象中,作為一個很有效的中間處理手段存在。一般的處理都是將灰度圖處理成二值圖或者一個二值圖處理成另外一個二值圖,而EDM演算法確是由一幅二值圖生成一幅灰度圖。其核心定義如下:   The definitio

opencv 讀取32點陣

#include <opencv2/opencv.hpp> #include <iostream> #include <windows.h> using namespace std; using namespace cv; int m

的投影和重建分析之傅裏葉變換法

-1 image 得到 logs 關鍵字 blog 通過 對數 jpg 二維圖像的投影和圖像重建分析之傅裏葉變換法 摘要:圖像重建有變換法和叠代法,本文主要分析變換法。根據二維圖像的投影,與其傅裏葉變換之間的關系,得出圖像重建的4種方法,直接傅裏葉反變換、先反投影後濾波

的三角形變換算法解釋

相對 還需 接受 矩陣運算 都在 線程 位置 所在 理解 http://blog.csdn.net/aqua_aqua/article/details/407660 對於二維圖像的變形,最簡單直接的方式就是將需要變形的不規則區域進行三角形劃分,使復雜多邊形由1到N個三角形組

opencv之SURF匹配

draw 空間變換 設置 extract mes 基於 scene body contain 1.概述 前面介紹模板匹配的時候已經提到模板匹配時一種基於灰度的匹配方

opencv截取中某一區域的方法

存儲 BE ring fff 截取 copy pen key jpg Mat圖像存儲:   Mat image= imread(image);   Rect rect(10, 20, 100, 50);   Mat image_roi = image(rect); IplI

Opencv-Python:尺寸、的讀取、顯示、保存與復制

常用 BE color reat size title enc creat alt Opencv-Python:圖像尺寸、圖像的讀取、顯示、保存與復制 原創 2017年11月23日 21:30:49 4440 在使用opencv的方法時,首先必須導入opencv

cs231n學習筆記(分類

根據 stanford nbsp 學習筆記 cif 線性分類 這一 差異 測距 圖像分類可說是計算機視覺中的基礎任務同時也是核心任務,做好分類可為檢測,分割等高階任務打好基礎。 本節課主要講了兩個內容,K近鄰和線性分類器,都是以貓的分類為例。 一.  K近鄰 以貓的分

實現基於C語言的連通域標記算法

ror mem main hair return pop incr one get 實現基於C語言的二值圖像連通域標記算法 1 #include <stdio.h> 2 #include <stdarg.h> 3 #include &l

存入值數組

spa stride epo als pan for span .get eight 因項目需要,需要用一個將二值圖像保存在二維數組中的算法,在網上找了很久都沒找到,只能自己動手寫了。 #region 讀取二值圖像存入二值數組 publi

opencv-python 繪製直方圖及直方圖均衡化

1. 繪製圖像的直方圖   下面的程式給出瞭如何繪製一幅影象整體的直方圖和每個通道的直方圖 #-*- coding:utf-8 -*- import cv2 from matplotlib import pyplot as plt def whole_hist(image):

opencv孔洞填充演算法(方法系轉載)

方法原文見:http://geniusshare.i.sohu.com/blog/view/149854097.htm 作者:天才的自省  孔洞者,不與大背景聯通卻具有大背景顏色的畫素也,所以思路如下:將大背景全部用前景色(白色)填充(cvFloodFill函式,一(0

16點陣轉換為8點陣(c++,python)

如之前所說,我們需要將16點陣圖像轉換為8點陣圖像;16點陣圖像的畫素值一共有:2^16=65536種顏色;而8位點陣圖像只有:2^8=256種顏色,傳統的位數轉換都是:畫素值*256/65536,比如photoshop,以及matlab的im2uint8函式都是如此,在一般

點陣中畫素座標的方法(matlab)

1. ginput [x,y] = ginput(n),n為你想選的點的個數,滑鼠點的那些點的橫座標和縱座標就會儲存到[x,y]中 或者直接輸入ginput,最後以回車結尾 2. impixelinfo(更為方便) 顯示影象後,直接在命令視窗輸入impixelinfo敲回車

OpenCV基礎(三)---混合

als ace tar put ios named enc 通道數 相同 圖像混合 圖像混合,產生的效果跨越了時間空間. 原理如下面公式,兩張原始圖像按權重相加,最終生成新圖像. 函數介紹:addWeighted() 函數原型:void addWeighted

OpenCV基礎(四)---對比度,亮度調整

user foo 情況下 取圖 可選 演示 mage con enc 圖像對比度,亮度調整 圖像對比度,指不同像素間的差值,差值越大,對比度越大. 圖像亮度,對於RGB圖像,亮度最大為(255,255,255),最暗為(0,0,0). 調整公式如上,f(x)為源圖

OpenCV基礎(六)---濾波

bim height 空間 int 空域濾波 edwin 思路 idt med 圖像濾波 對圖像進行單個像素操作,主要是進行對比度和閾值處理 而圖像濾波在像素鄰域間進行,一來達到我們希望的效果,二來進一步進行圖像特征提取 濾波分為空間域和頻域濾波,空間域濾波又分線性

opencv中的SVM分類(

proc 文本 c_str lec 源碼 open right tle 特征描述 opencv中的SVM圖像分類(二) 標簽: svm圖像 2015-07-30 08:45 8296人閱讀 評論(35) 收藏 舉報 分類: 【opencv應用】(5) 版

python-opencv 值化,自適應閾值處理

csdn 領域 image tle tps wid 無聊 src ima 定義:圖像的二值化,就是將圖像上的像素點的灰度值設置為0或255,也就是將整個圖像呈現出明顯的只有黑和白的視覺效果。 一幅圖像包括目標物體、背景還有噪聲,要想從多值的數字圖像中直