c++ - 使用opencv通过反卷积对图像进行去模糊

标签 c++ opencv image-processing deconvolution

我有两张图片 o1 & o2 ,并且我使用相同的高斯模糊核对两幅图像进行了模糊处理。然后我找到了内核 k1 = DFT(b1) / DFT (o1) , 其中b1是通过模糊得到的图像o1 .

我已使用此内核 ( k1 ) 对 b2 执行反卷积, 其中b2通过模糊获得o2 .

但是去模糊输出不正确(输出图像与原始图像没有任何关系)我的代码有什么问题?

int main(int argc, char** argv) 
{
  Mat orig1 = imread(argv[1], 0);
  Mat orig2 = imread(argv[2], 0);

  Mat blur1, blur2;
  GaussianBlur(orig1, blur1, Size(11, 11), 0, 0 );
  GaussianBlur(orig2, blur2, Size(11, 11), 0, 0 );

  imshow("or1", orig1);
  imshow("bl1", blur1);
  imshow("or2", orig2);
  imshow("bl2", blur2);
  waitKey(0);



  deconvolution(orig1, blur1, orig2, blur2);

  return 0;
}
void deconvolution(Mat & o1, Mat & b1, Mat & o2, Mat & b2)
{
  Mat o1f, o2f, b1f, b2f;
  Mat o1dft, o2dft, b1dft, b2dft;

  o1.convertTo(o1f, CV_32F);
  b1.convertTo(b1f, CV_32F);
  o2.convertTo(o2f, CV_32F);
  b2.convertTo(b2f, CV_32F);

  computeDFT(o1f, o1dft);
  computeDFT(b1f, b1dft);
  computeDFT(o2f, o2dft);
  computeDFT(b2f, b2dft);

  Mat k1, k2, b1d, b2d;
  divide(b1dft, o1dft, k1);

  Mat r1, r2;
  divide(b1dft, k1, r1);
  divide(b2dft, k1, r2);

  Mat idftr1, idftr2;
  computeIDFT(r1, idftr1);
  computeIDFT(r2, idftr2);

  Mat r1_8u, r2_8u;
  idftr1.convertTo(r1_8u, CV_8U);
  idftr2.convertTo(r2_8u, CV_8U);

  imshow("r1", r1_8u);
  imshow("r2", r2_8u);
  waitKey(0);
  destroyAllWindows();
}

图像 o1、o2、b1、b2,r1r2顺序如下:

o1 (original image - 1)

o2 (original image - 2)

b1 (original 1 blurred)

b2 (original 2 blurred)

b1 deblurred

b2 deblurred

最佳答案

问题很可能是您的模糊核对某些频率具有消失系数。对于信号 (f) 和模糊核 (h) 的每个变换系数,您现在可以计算 f/h。这实际上是将这些系数除以零,导致您观察到强烈的噪音。

一个快速的解决方案是伪逆向过滤:

仅对 |h| 使用 f/h > 小量

否则将系数设置为0

如果这不够流畅,您可以使用以下方法获得更好的结果 wiener filtering .

关于c++ - 使用opencv通过反卷积对图像进行去模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32110861/

相关文章:

c++ - 在 Win32 上 Hook 虚拟方法(返回大于 ptr 的对象崩溃)?

c++ - Q按钮 : How to know whether a "released" signal will be followed by a "clicked" signal?

c++ - 难以理解虚函数

c++ - 使用 vector 作为私有(private)/公共(public)成员的类设计?

opencv - OpenCV,计算距深度垫的像素距离

image-processing - 您如何应对旋转的相机?

c++ - 仅在使用 -Wl,-rpath,/usr/local/MATLAB/R2014b/bin/glnxa64 添加 Matkab 代码后出现链接错误 OpenCV

xamarin - 如何以 Xamarin 形式创建媒体下载器,例如 Whatsapp、Telegram?以及如何创建 Whats App UI

python - 在Opencv中将图像与深度图对齐

c# - 如果未设置图像的 DPI,WPF/WIC,如何找到它?