# How Do I Calculates The Angle Of Orientation Of The Image With The Fourier Transform?

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
#include <opencv2\opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <stdint.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace cv;
using namespace std;
/// Global variables
int edgeThresh = 1;
int lowThreshold;
int const max_lowThreshold = 100;
int ratio = 3;
int kernel_size = 3;
char* window_name = "Edge Map";
void CannyThreshold(int, void*)
{
blur( src_gray, detected_edges, Size(3,3) );
Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size );
dst = Scalar::all(0);
src.copyTo( dst, detected_edges);
imshow( window_name, dst );
int m = getOptimalDFTSize( dst.rows );
int n = getOptimalDFTSize( dst.cols );
copyMakeBorder(dst, padded, 0, m - dst.rows, 0, n - dst.cols, BORDER_CONSTANT, Scalar::all(0));
Mat complexdst;
merge(planes, 2, complexdst);
dft(complexdst, complexdst);

split(complexdst, planes);
magnitude(planes[0], planes[1], planes[0]);
Mat magdst = planes[0];
magdst += Scalar::all(1);
log(magdst, magdst);
magdst = magdst(Rect(0, 0, magdst.cols & -2, magdst.rows & -2));
int cx = magdst.cols/2;
int cy = magdst.rows/2;
Mat q0(magdst, Rect(0, 0, cx, cy));
Mat q1(magdst, Rect(cx, 0, cx, cy));
Mat q2(magdst, Rect(0, cy, cx, cy));
Mat q3(magdst, Rect(cx, cy, cx, cy));
Mat tmp;
q0.copyTo(tmp);
q3.copyTo(q0);
tmp.copyTo(q3);

q1.copyTo(tmp);
q2.copyTo(q1);
tmp.copyTo(q2);

normalize(magdst, magdst, 0, 1, CV_MINMAX);
imshow("spectrum magnitude", magdst);
}

int main( int argc, char** argv )
{
resize(src, src, Size(), 0.2, 0.2, INTER_LANCZOS4);

if( !src.data )
{ return -1; }

dst.create( src.size(), src.type() );

cvtColor( src, src_gray, CV_BGR2GRAY );

namedWindow( window_name, CV_WINDOW_AUTOSIZE );

createTrackbar( "Min Threshold:", window_name, &lowThreshold, max_lowThreshold, CannyThreshold );

CannyThreshold(0, 0);

waitKey(0);

return 0;
}

edit retag close merge delete

Hello, I have an image I applied the fourier transform for the orientation angle,but i face here channels problem.When i build this program,it shows success but it's not run.It is showing "Open cv Error: Assertion failed <_tp>::channels==m.channels<>>in unknown function, file c:\opencv\opencv\build\include\opencv2/core/mat.hpp,line890" i used Breakpoint in this code when it comes this line "Mat planes[] = {Mat_(padded), Mat::zeros(padded.size(), CV_32F)};"then it break.Personally I do not know how i solve this problem because I have no error! Please help me

( 2014-05-15 18:58:29 -0500 )edit

Sort by ยป oldest newest most voted

The error you got was due to the fact that you worked with src image, which is a multi channels image. If you change the line:

src.copyTo( dst, detected_edges);


to:

src_gray.copyTo( dst, detected_edges);


the error gone. In case you wish to do the dft with a multi channels image, you have to proceed with each channel individually, and merge the results to get what you want. Plus, you should check if the image was opened before carrying out any operation on it:

if( !src.data )
{
return -1;
}
resize(src, src, Size(), 0.2, 0.2, INTER_LANCZOS4);

more

So now the OP has a DFT that works (as I do), how do you find the angle from the result?

( 2015-03-30 12:52:04 -0500 )edit
1

For computing the orientation part, right after the split statement:

split(complexdst, planes);


phase(planes[0], planes[1], phasePart);


Then, the other needed code is the same as you did with the magnitude part. Additionally, do not overwrite the planes[0] component as you wrote:

 magnitude(planes[0], planes[1], planes[0]);


Instead, you should do like that:

magnitude(planes[0], planes[1], magPart);

( 2015-03-31 00:02:39 -0500 )edit

OK, pulled out phasePart, but it is still just snow (see above). I am thinking of doing a polar histogram on just magnitude of one quadrant, the biggest pile will be in the direction I care about (maybe).

( 2015-03-31 16:01:01 -0500 )edit

Well, the Assertion is saying that the number of channels is wrong. Best guess is that you still have color when you need to go either grey (or extract one of the BGR components). I thought the imread should have handled that but the flag to convert to grey is not explicit. Try src = imread("Filename", 0); //0 for grey, 1 for color.

The step you reference (line numbers please!) is where the complex dimension gets added to the image data. It looks like you copied the tutorial verbatim. Is padded bigger than I at this point as it should be?

Otherwise, I'm just trying to read through the tutorial. It looks like you copied that anyway, why not run that with your image? Then let me know how you get the angle!

EDIT

I think the spirit of the original question was how to interpret results like these:

EDIT Pulling out phase as suggested. Similar quadrant swap but not log scale of course.

more

The best way is to create a orientated band pass filter and filter the image with it. I made an online app where you can play around with FFT filters called 'Fourifier'

http://www.ejectamenta.com/Imaging-Ex...

This approach is also used with Steerable Filters, see the work of Freeman, Adelson, Castleman for example

http://people.csail.mit.edu/billf/pub...

http://www.tka4.org/materials/lib/Art...

You can also get the orientations directly from a steerable filter, look at page 17 of

http://persci.mit.edu/pub_pdfs/freema...

This is what I did with them, before I ran out of postdoc funding!

http://www.ejectamenta.com/Imaging-Ex...

more

Official site

GitHub

Wiki

Documentation