想用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;
}
【以下回答由 GPT 生成】
要实现基于逆滤波的图像恢复,可以按照以下步骤进行操作:
#include <opencv2/opencv.hpp>
using namespace cv;
Mat img = imread("path_to_image.jpg", IMREAD_GRAYSCALE);
Mat psf = imread("path_to_psf.png", IMREAD_GRAYSCALE);
确保图片和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);
Mat If, Pf;
dft(img, If, DFT_COMPLEX_OUTPUT);
dft(psf, Pf, DFT_COMPLEX_OUTPUT);
Mat a = If / Pf;
注意,这是简化的逆滤波操作,可能会存在色散等问题。如果需要更好的结果,可以尝试添加正则化或使用其他复杂的逆滤波算法。
Mat deblurred;
idft(a, deblurred, DFT_SCALE | DFT_REAL_OUTPUT);
imshow("Restored Image", deblurred);
waitKey(0);
以上就是使用C++和OpenCV实现基于逆滤波的图像恢复的步骤。请注意,逆滤波是一项困难的任务,并且很容易受到噪声和其他因素的影响。因此,结果可能不尽如人意。对于更好的结果,可以尝试其他更复杂的图像恢复算法。
【相关推荐】