【问题标题】:OpenCV, DFT function don't use in the image with IMREAD_COLOROpenCV,DFT 函数不要在带有 IMREAD_COLOR 的图像中使用
【发布时间】:2018-10-08 03:55:51
【问题描述】:

使用 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();

【问题讨论】:

  • "但我想用 IMREAD_COLOR 读取图像。" 为什么?
  • 我改变图像的波形。转换回图片后

标签: c++ opencv image-processing dft


【解决方案1】:

您收到的消息是一个断言,它告诉您 DFT 函数仅采用具有一个或两个通道(CV_32FC1、CV_32FC2、标志意味着通道末尾的字母 C)的单精度浮点图像或双精度浮点图像带有一个或两个通道(CV_64FC1、CV_64FC2)。 双通道情况实际上是复杂图像在 OpenCV 数据存储中的表示。 如果您愿意,您可以将图像拆分为 std::vector<cv::Mat>,其中每个元素确实代表一个通道,使用 cv::split 在每个通道上应用 DFT 进行您想要的处理并重新创建多通道图像,感谢 cv::merge

【讨论】:

    【解决方案2】:

    来自Learning OpenCV(关于dft函数):

    输入数组必须是浮点类型并且可以是单通道或双通道。在单通道情况下,条目被假定为实数,并且输出将被打包成一种特殊的节省空间的格式,称为复共轭对称。

    here 在 matlab 图像处理方面提到了同样的问题。 如果要分离初始图像的通道,可以查看 cv::split 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-26
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多