Osselait 2023-09-15 18:10 采纳率: 0%
浏览 14
已结题

用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

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-09-15 20:11
    关注

    【以下回答由 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实现基于逆滤波的图像恢复的步骤。请注意,逆滤波是一项困难的任务,并且很容易受到噪声和其他因素的影响。因此,结果可能不尽如人意。对于更好的结果,可以尝试其他更复杂的图像恢复算法。



    【相关推荐】



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

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月30日
  • 创建了问题 9月15日

悬赏问题

  • ¥20 大数据采集用Python爬取猫眼电影数据
  • ¥15 用freertos后NVIC里系统时钟部分报错
  • ¥15 后缀表达式的计算算法问题
  • ¥15 安装mid360驱动后,执行rviz_MID360.launch rviz不显示
  • ¥15 关于#人工智能#的问题:(2)设计一个GUI,允许语音和文本实现谣言的检测
  • ¥50 请教 麒麟系统挂载怎么安装
  • ¥15 如何在ns3中实现路径的自由切换
  • ¥20 SpringBoot+Vue3
  • ¥15 IT从业者的调查问卷
  • ¥65 LineageOs-21.0系统编译问题