- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我刚刚开始学习使用 OpenCV,但在使用 DFT 时遇到了问题。我已经完成了一个使用 MatLab 的信号处理类(class),所以我正在尝试完成我们在该类(class)中所做的一些练习。我正在尝试获取并显示图像的 FT,因此我可以屏蔽一些频率。我希望能够看到英国《金融时报》,所以我知道要制作多大的面具,但当我尝试时,我得到了这样的图像:
而不是喜欢其中之一
alt text http://www.ceremade.dauphine.fr/~peyre/numerical-tour/tours/graphics_synthesis_fourier/index_03.png
我在某处忘记了一步吗?我正在加载图像,将其类型转换为 CV_32FC1,获取它的矩阵,获取 DFT,然后将生成的矩阵转回图像。如果有帮助,我会发布我正在使用的代码吗?
或者,如果有人链接到显示 FT 的示例?我只能找到将它用于卷积的那些。
编辑:我得到图像的相位了吗?
最佳答案
我在尝试使用 OpenCV 可视化图像上 2D DFT 的大小时遇到了类似的麻烦。我终于推出了一个可行的实现方案。我不认为它是很好的代码,它只在 256 x 256 8 位(灰度)单 channel 图像上进行了测试--lenna.png(可能需要调整以适当填充其他图像尺寸)。输入图像和重建图像之间的均方误差为零,因此它可以正常工作。需要 OpenCV v2.1。
文件:mstrInclude.h
#ifndef _MASTER_INCLUDE_
#define _MASTER_INCLUDE_
// Standard
#include <stdio.h>
#include <string>
#include <sstream>
#include <iostream>
#include <cmath>
using namespace std;
// OpenCV2.1
#include "cv.h"
#include "highgui.h"
using namespace cv;
#define LOAD_IMAGE "lenna.png"
#endif // _MASTER_INCLUDE_
文件:main.cpp
#include "mstrInclude.h"
void translateImg(Mat& imgIn, Mat& imgOut)
{
int i, j;
for (i = 0; i < imgIn.rows; i++)
for (j = 0; j < imgIn.cols; j++)
imgOut.at<double>(i,j) = imgIn.at<double>(i,j) * pow(-1.0, i+j);
}
void scaleImg(Mat& imgIn, Mat& imgOut, float scaleFactor)
{
int i, j;
for (i = 0; i < imgIn.rows; i++)
for (j = 0; j < imgIn.cols; j++)
imgOut.at<double>(i,j) = (double)scaleFactor * log(1.0 + imgIn.at<double>(i,j));
}
void consoleOut(cv::Mat outMat, int rows = 5, int cols = 5)
{
rows = ((rows == -1 || rows >= outMat.rows) ? outMat.rows : rows);
cols = ((cols == -1 || cols >= outMat.cols) ? outMat.cols : cols);
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
cout << outMat.at<double>(i, j);
cout << " ";
}
cout << endl;
}
}
double calcMSE(Mat& imgOrig, Mat& imgReconst)
{
int valOrig = 0, valReconst = 0;
double MSE = 0.0;
for(int i = 0; i < imgOrig.rows; i++)
{
for (int j = 0; j < imgOrig.cols; j++)
{
valOrig = imgOrig.at<unsigned char>(i, j);
valReconst = imgReconst.at<unsigned char>(i, j);
MSE += pow( (double)(valOrig - valReconst), 2.0 );
}
}
return (MSE / (imgOrig.rows * imgOrig.cols));
}
string convertInt(int number) // converts integer to string
{
stringstream ss;
ss << number;
return ss.str();
}
int main(unsigned int argc, char* const argv[])
{
int dftH, dftW;
cv::Mat imgIn;
imgIn = cv::imread(LOAD_IMAGE, 0); //grayscale
cv::imshow("Original Image", imgIn);
waitKey();
dftH = cv::getOptimalDFTSize(imgIn.rows);
dftW = cv::getOptimalDFTSize(imgIn.cols);
Mat imgMod;
Mat imgPrecFFT(dftH, dftW, CV_64FC1, Scalar::all(0));
imgIn.convertTo(imgMod, CV_64FC1);
imgPrecFFT = imgMod(cv::Range::all(), cv::Range::all()).clone();
// translate image
std::vector<Mat> imgsTrans;
imgsTrans.push_back(Mat_<double>(imgIn.size(), CV_64FC1));
imgsTrans.push_back(Mat_<double>(imgIn.size(), CV_64FC1));
imgsTrans[1].setTo(Scalar::all(0), Mat());
translateImg(imgPrecFFT, imgsTrans[0]);
Mat imgPrecTransFFT(imgIn.size(), CV_64FC2, Scalar::all(0));
cv::merge(imgsTrans, imgPrecTransFFT);
// dft
cv::Mat imgFFT;
dft(imgPrecTransFFT, imgFFT, DFT_COMPLEX_OUTPUT);
cv::Mat imgDispFFT;
// calculate magnitude
Mat imgMagnitude(imgIn.size(), CV_64FC1);
std::vector<Mat> chans;
cv::split(imgFFT, chans);
cv::magnitude(chans[0], chans[1], imgMagnitude);
// scale magnitude image
Mat imgMagnitudeScaled(imgIn.size(), CV_64FC1);
scaleImg(imgMagnitude, imgMagnitudeScaled, 10.0);
// display magnitude image
cv::Mat imgDisp;
cv::convertScaleAbs(imgMagnitudeScaled, imgDisp);
imshow("Magnitude Output", imgDisp);
waitKey();
// inverse dft
cv::split(imgFFT, chans);
chans[1].zeros(imgIn.size(), CV_64FC1);
cv::merge(chans, imgFFT);
cv::Mat invFFT;
cv::idft(imgFFT, invFFT, DFT_REAL_OUTPUT + DFT_SCALE);
// translate image back to original location
cv::split(invFFT, imgsTrans);
Mat imgAfterTrans(imgIn.size(), CV_64FC1);
translateImg(imgsTrans[0], imgAfterTrans);
imgAfterTrans.convertTo(imgDisp, CV_8UC1);
imshow("After Inverse Output", imgDisp);
waitKey();
// calculate and output mean-squared error between input/output images
double MSE = calcMSE(imgIn, imgDisp);
cout<<endl<<"MSE: "<<MSE<<endl;
waitKey();
return 0;
}
关于matlab - 在 OpenCV 中显示傅里叶变换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2979928/
我正在尝试从底层叶进程写入命名管道并从顶层进程的管道读取。 为此,我首先在顶级进程中创建 FIFO,然后使用 for 循环派生更多进程。在 for 循环中,我正在检查叶子进程,如果它是叶子,我正在写入
我需要一个XPath表达式来验证XML列表元素是否只有某种类型的节点。 例: 我需要知道列表中是否只有图像。
我想从层次结构表中获取所有叶子及其根。叶子是最低层节点,根是最顶层节点。 给定一棵树: A --B --C --D E --F --G --H 叶子是节点:C, D根是:A、E 该表如下所
尝试从嵌套数组中删除相同的 sibling (叶子)/相同的数组。 例如 $data = [ 'test' => [ 'a' => [
我可以遍历目录并只打印文件夹/目录名称,但我想排除包含其他目录的目录的文件夹名称。出于某种原因,我称其为树结构中的“最终节点”,但我很可能是在自欺欺人,这不是第一次了。 =) 在审查其他答案列表时,也
我现在经常使用 Folium,在 Python 中拥有如此易于使用的东西真的很棒。但是他们的文档严重落后,我理解。所以我有2个问题。 我在尝试获得更多标记颜色时做错了什么?这是我尝试过的:map.si
我正在尝试使用 ape 包中的 plot.phylo 命令为 R 中系统发育类型图的边缘(线)添加颜色。这个例子是一个“粉丝”类型的图,虽然我希望这个方法与“系统图类型”或其他任何东西相同。 libr
我正在尝试呈现一个 JTree 叶以具有包含可编辑 JTextArea 的 JPanel,以便用户可以输入文本并能够在添加文本时向下滚动, 并且还使用包装器来限制文本的宽度,使其向下延伸以留出更多空间
这是要修改的正确 Linux 内核代码吗?我如何进行更改以模拟 CPUID 代码以及我需要更改哪个函数。谢谢 #include #include #include #include #incl
我是一名优秀的程序员,十分优秀!