c++ - OpenCV,DFT 函数不要在带有 IMREAD_COLOR 的图像中使用
问题描述
使用 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();
解决方案
您收到的消息是一个断言,它告诉您 DFT 函数仅采用具有一个或两个通道(CV_32FC1、CV_32FC2、标志平均通道末尾的字母 C)的单精度浮点图像或具有一个或两个通道的双精度浮点图像两个通道(CV_64FC1、CV_64FC2)。双通道情况实际上是复杂图像在 OpenCV 数据存储中的表示。如果您愿意,您可以将图像拆分到std::vector<cv::Mat>
每个元素确实代表一个通道的位置,使用cv::split
在每个通道上应用 DFT 进行您想要的处理并重新创建多通道图像,这要归功于cv::merge
.
推荐阅读
- javascript - 反应中的待办事项列表 - 你将如何移动完成的项目
- javascript - 我不能在两个组件之间传递对象(类组件到功能组件)
- vba - Excel VBA - 拆分文件和密码保护
- javascript - 打字稿: JSON.parse(localStorage.getItem('myself')) 返回 [object Object] 而不是预期的对象
- sql-server - 如何避免事务中 IF EXISTS 语句中的 NULL 值?
- arrays - C程序查找最大和最小元素时出错
- python - 在python中按长度将字符串分成几部分
- function - Powershell 条件参数集名称验证集
- c++ - 从向量中删除双引号
C++ 98 - powershell - RoboCopy 源