在使用IMREAD_COLOR读取图像时,“ dft”函数将引发错误:
使用IMREAD_GRAYSCALE读取图像时,DFT功能可以很好地工作。但是我想用IMREAD_COLOR读取图像。
const char* filename = "face.jpg";
Mat I = imread(filename, IMREAD_COLOR);
if(I.empty()) return 0;
Mat padded;
I.convertTo(padded, CV_32F);
Mat fft;
Mat planes[2];
dft(padded, fft, DFT_SCALE|DFT_COMPLEX_OUTPUT);
Mat fftBlur = fft.clone();
fftBlur *= 0.5;
split(fftBlur, planes);
Mat ph, mag;
mag.zeros(planes[0].rows, planes[0].cols, CV_32F);
ph.zeros(planes[0].rows, planes[0].cols, CV_32F);
cartToPolar(planes[0], planes[1], mag, ph);
merge(planes, 2, fftBlur);
//inverse
Mat invfft;
dft(fftBlur, invfft, DFT_INVERSE|DFT_REAL_OUTPUT);
Mat result;
invfft.convertTo(result, CV_8U);
Mat image;
cvtColor(result, image, COLOR_GRAY2RGB);
imshow("Output", result);
imshow("Image", image);
waitKey();
答案 0 :(得分:0)
来自Learning OpenCV(关于dft函数):
输入数组必须为浮点类型,并且可以是单通道或双通道。在单通道情况下,假定条目为实数,并且输出将以一种特殊的节省空间的格式打包,称为复杂共轭对称。
在Matlab图像处理方面,here提到了相同的问题。 如果您想分离初始图像的通道,可以查看cv :: split函数。
答案 1 :(得分:0)
您收到的消息是一个断言,它告诉您DFT函数仅拍摄具有一个或两个通道(CV_32FC1,CV_32FC2,标志平均通道末尾的字母C)的单精度浮点图像或双精度浮点图像具有一个或两个通道(CV_64FC1,CV_64FC2)。
实际上,两通道情况是OpenCV数据存储中复杂图像的表示。
如果您希望将图像拆分为std::vector<cv::Mat>
,其中每个元素确实代表一个通道,请使用cv::split
在每个通道上应用DFT进行所需的处理,并借助{{ 1}}。