码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV官方文档学习记录(6)

时间:2014-12-05 19:19:20      阅读:287      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   on   

离散傅里叶变换:DFT,文档p165

 

代码如下:

 1 #include <opencv2\opencv.hpp>
 2 #include <iostream>
 3 #include <string>
 4 
 5 #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
 6 
 7 #define NUMBER 20
 8 
 9 using namespace std;
10 using namespace cv;
11 
12 void Show(std::string name,Mat img)
13 {
14     namedWindow(name, CV_WINDOW_AUTOSIZE);
15     imshow(name, img);
16 }
17 
18 
19 int main()
20 {
21 
22     //离散傅里叶变换DFT
23     char *filename = "test.png";
24 
25     Mat I = imread(filename, CV_LOAD_IMAGE_GRAYSCALE);
26     if (I.empty())
27     {
28         return -1;
29     }
30 
31     Mat padded;//拓展图像到最佳尺寸
32     int m = getOptimalDFTSize(I.rows);//获取行最优
33     int n = getOptimalDFTSize(I.cols);//获取列最优
34 
35     //在图像的边缘添加zero,四个数字参数就是图像在四个方向拓宽的像素数
36     copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));
37 
38     //声明两个图像数组
39     Mat planes[] = { Mat_<float>(padded), Mat::zeros(padded.size(), CV_32F) };
40     //这是混合后要输出到的数组
41     Mat complexI;
42     //混合参数1的所有单通道图像到一个多通道上,2这个参数是前面数组有多少个矩阵要进行混合
43     merge(planes, 2, complexI);
44 
45     //进行离散傅里叶变换,参数分别是输入和输出的图像
46     dft(complexI, complexI);
47 
48 
49     //计算级数并转换成对数形式
50     //log(1+sqrt(Re(DFT(I))^2+Im(DFT(I)^2)
51     
52     split(complexI, planes);//将实部和虚部分离,此时planes[0]是实部矩阵,planes[1]是虚部矩阵
53 
54     magnitude(planes[0], planes[1], planes[0]);//计算幅度,就是复数的模,并将结果保存到实数矩阵中
55 
56     Mat magI = planes[0];//将模矩阵另存
57 
58     //进行对数变换,取自然对数
59     magI += Scalar::all(1);
60     log(magI, magI);
61 
62     //裁切出偶数像素的矩阵
63     magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
64 
65     //重新排列象限。令原点位于中央
66     int cx = magI.cols / 2;
67     int cy = magI.rows / 2;
68 
69     //获取四个象限分割矩阵
70     Mat q0(magI, Rect(0, 0, cx, cy));
71     Mat q1(magI, Rect(cx, 0, cx, cy));
72     Mat q2(magI, Rect(0, cy, cx, cy));
73     Mat q3(magI, Rect(cx, cy, cx, cy));
74 
75     //进行斜线交换
76     //交换0和3
77     Mat tmp;
78     q0.copyTo(tmp);
79     q3.copyTo(q0);
80     tmp.copyTo(q3);
81 
82     //交换1和2
83     q1.copyTo(tmp);
84     q2.copyTo(q1);
85     tmp.copyTo(q2);
86 
87     //正常化输出图像
88     normalize(magI, magI, 0, 1, CV_MINMAX);
89 
90     Show("Input Img", I);
91     Show("Output Img", magI);
92     waitKey();
93     return 0;
94 }

 

具体实现不明,但是用法是可以调试文本的垂线角度:

譬如本例中我用的图像是:

bubuko.com,布布扣

 

得到的结果是:

bubuko.com,布布扣

 

与示例的说明相一致。

 

OpenCV官方文档学习记录(6)

标签:style   blog   http   io   ar   color   os   sp   on   

原文地址:http://www.cnblogs.com/lhyz/p/4147250.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!