我是一名新的OpenCV用户,而且我正在为一所大学项目工作。该程序采用输入图像,合成模糊,然后消除它。当合成模糊的图像被去卷积时,边界伪像会产生,因为......好吧,到目前为止我还没有实现边界条件。这里举几个例子:你可以看到输入不模糊的图像,合成模糊的图像和我得到的最终输出:
http://answers.opencv.org/upfiles/13953138566866107.png
根据我编写代码的论文,边界条件必须通过用点扩散函数宽度填充输入图像并创建一个掩码来实现,该掩码指示哪些像素来自捕获区域与边界地区相比。
如果我的问题可能很愚蠢,我道歉:
1。如何计算点扩散函数宽度?到目前为止,我使用了一个简单的3x3盒子模糊内核,里面有1/9秒。宽度是3吗?
2. 如果点扩散函数宽度为3,是否必须通过在四边添加三个像素来填充输入图像,或者是否必须通过&#34填充输入图像;覆盖" "黑框"由于模糊过程导致它周围?根据我的理解,那些"黑框"区域包含原始不模糊图像的平均值,因此无法重建在这些区域中进行反卷积的起始图像,这只会生成并传播伪像。
我想说的是:我是否必须在输入图像的所有四个边上添加额外的像素,或者我必须覆盖"覆盖" "暗框",根据我的理解,它的宽度与点扩散函数相同?
http://answers.opencv.org/upfiles/13953135698274495.png
3。我是否需要填充不模糊的输入图像或合成模糊的输入图像?
提前感谢您的帮助!
答案 0 :(得分:0)
我已经对源码进行了测试(我已经适应了opencv)并且它的工作非常完美。
您的问题的答案:
1.在这种情况下,内核大小是3。
2.在链接源中,卷积应用于图像区域 每侧减少一半的核心。
图像大小等于您的源图像(所有绿色和蓝色区域)。
但是你的工作区域比整个图像还小,并标记为绿色。
相对于源图像减少了半个内核大小(蓝色边框)。
3.不,你没有。
您似乎已经应用了内核大小超过3的盒式过滤器。
以下是我的结果:
图像模糊(盒式滤镜3x3):
模糊图像:
您可以在此处下载我的来源:https://www.dropbox.com/s/u11qo8o3q1a8j5f/stochastic_deconvolution_opencv.zip
使用大内核时,你会在高频率(硬边缘)上获得ringing。
可以通过增加正则化系数来减少它(它会为图像添加一些" flattnes")。
以下是我从初始来源获取内核的结果:
图像模糊:
模糊图像:
尝试使用图像参数:
const double reg_weight = 0.0002; // regularizer weight
const double sigma = 9.0; // mutation standard deviation
const double reset_prob = 0.005f; // russian roulette chain reset probability
const int num_iterations = 400; // number of 'iterations', mostly for output
double ed = 0.025; // starting deposition energy
对于PSF:
const int psf_cnt = 9;
const double psf_v[] = { 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0, 1.0/9.0 };
const int psf_x[] = { -4, -3, -2, -1, 0, 1, 2, 3, 4 };
const int psf_y[] = { -4, -3, -2, -1, 0, 1, 2, 3, 4 };
我在下面的帖子中得到了结果: