C++ opencv反褶积图像去模糊

C++ opencv反褶积图像去模糊,c++,opencv,image-processing,deconvolution,C++,Opencv,Image Processing,Deconvolution,我有两幅图像o1和o2,我用相同的高斯模糊核模糊了这两幅图像。然后我找到了kernelk1=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],

我有两幅图像
o1
o2
,我用相同的高斯模糊核模糊了这两幅图像。然后我找到了kernel
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、
r1
r2
的顺序如下:


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

一个快速解决方案是伪逆滤波:

f/h仅用于| h |>ε

将“系数”设置为0

如果这不够平滑,您可以使用
.

您能比“消除模糊的输出不正确”更明确吗?现实生活不是CSI,去模糊不是一个精确的操作。因为这是一个视觉问题,我建议添加一些图片;同时显示您当前获得的内容和希望获得的内容。