用C++实现基于opencv库的逆滤波

想用C++实现基于opencv库的逆滤波
代码和结果如下,不知道问题出在哪里,希望有会的指教一下,谢谢。

#include "stdafx.h"
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char argv[])
{
    Mat img = imread("D:\\opencv-4.5.5\\doc\\tutorials\\imgproc\\out_of_focus_deblur_filter\\images\\original.jpg", IMREAD_GRAYSCALE);
    int hei = img.rows;
    int wei = img.cols;
    imshow("图像", img);

    Mat psf = imread("D:\\opencv-4.5.5\\doc\\tutorials\\imgproc\\out_of_focus_deblur_filter\\images\\psf.png", IMREAD_GRAYSCALE);
    copyMakeBorder(psf, psf, (img.rows - psf.rows) / 2, (img.rows - psf.rows) / 2, (img.cols - psf.cols) / 2, (img.cols - psf.cols) / 2, cv::BorderTypes::BORDER_CONSTANT, cv::Scalar(0, 0, 0));

    Mat If, Pf, deblurred;
    img.convertTo(img, CV_32F, 1.0 / 255.0);
    dft(img, If, cv::DFT_COMPLEX_OUTPUT);
    psf.convertTo(psf, CV_32F, 1.0 / 255.0);
    dft(psf, Pf, cv::DFT_COMPLEX_OUTPUT);

    Mat a = If / Pf;
    idft(a, deblurred, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT);
    // 显示结果图像
    cv::imshow("Restored Image", deblurred);

    cv::waitKey(0);
    return 0;
}

img

【以下回答由 GPT 生成】

要实现基于逆滤波的图像恢复,可以按照以下步骤进行操作:

  1. 导入必要的库文件和命名空间:
#include <opencv2/opencv.hpp>

using namespace cv;
  1. 加载原始图像和点扩散函数(PSF)图像:
Mat img = imread("path_to_image.jpg", IMREAD_GRAYSCALE);
Mat psf = imread("path_to_psf.png", IMREAD_GRAYSCALE);

确保图片和PSF图像的路径是正确的。

  1. 图像预处理: 首先,添加边框,使PSF图像与原始图像具有相同的大小。
copyMakeBorder(psf, psf, (img.rows - psf.rows) / 2, (img.rows - psf.rows) / 2, (img.cols - psf.cols) / 2, (img.cols - psf.cols) / 2, cv::BorderTypes::BORDER_CONSTANT, cv::Scalar(0, 0, 0));

然后将原始图像和PSF图像转换为32位浮点类型,并将像素范围归一化到0-1之间:

img.convertTo(img, CV_32F, 1.0 / 255.0);
psf.convertTo(psf, CV_32F, 1.0 / 255.0);
  1. 进行频域操作: 对原始图像和PSF图像进行傅里叶变换,得到它们的频域表示:
Mat If, Pf;
dft(img, If, DFT_COMPLEX_OUTPUT);
dft(psf, Pf, DFT_COMPLEX_OUTPUT);
  1. 执行逆滤波操作: 计算逆滤波结果:
Mat a = If / Pf;

注意,这是简化的逆滤波操作,可能会存在色散等问题。如果需要更好的结果,可以尝试添加正则化或使用其他复杂的逆滤波算法。

  1. 进行逆傅立叶变换: 对结果进行逆傅立叶变换,并将结果缩放到合适的范围:
Mat deblurred;
idft(a, deblurred, DFT_SCALE | DFT_REAL_OUTPUT);
  1. 显示结果图像:
imshow("Restored Image", deblurred);
waitKey(0);

以上就是使用C++和OpenCV实现基于逆滤波的图像恢复的步骤。请注意,逆滤波是一项困难的任务,并且很容易受到噪声和其他因素的影响。因此,结果可能不尽如人意。对于更好的结果,可以尝试其他更复杂的图像恢复算法。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^