我有两张图片o1
& o2
,我使用相同的高斯模糊内核模糊了两个图像。然后我找到了内核k1 = DFT(b1) / DFT (o1)
,其中b1
是通过模糊o1
获得的图像。
我已使用此内核(k1
)对b2
执行反卷积,其中b2
通过模糊o2
获得。
但是deblurred输出不正确(输出图像与原始图像没有任何关系)我的代码中有什么问题?
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
按顺序给出:
答案 0 :(得分:2)
问题很可能是你的模糊内核对某些频率有消失系数。对于信号(f)和模糊内核(h)的每个变换系数,您现在可以计算f / h。对于这些系数,这实际上是零除以,导致您观察到的强噪声。
对此的快速解决方案是伪逆过滤:
仅对| h |使用f / h >小量
将系数设为0,否则
如果这不够顺利,你可以获得更好的效果 wiener filtering