zhangxiaoya / FB

Multi-frame super-resolution via sub-pixel.
https://github.com/zhangxiaoya/FB
MIT License
63 stars 16 forks source link

关于Z中未定义的像素,如何填充? #22

Open MisakaMikt opened 2 years ago

MisakaMikt commented 2 years ago

您好,有几个问题想请教一下: 1、最终的尺寸为什么是 ([w,h]+1)*srFactor-1, 即增加了srFactor-1个像素 这里[w,h]指的是对齐后经过crop裁减边缘输入给FastRobustSR函数的图像尺寸,在您的实现中,高分辨率网格的左侧以及上侧分别额外填充了(srFactor-1)个0,这是有什么特殊考虑吗?我尝试着去除这些像素,并且相应地修改了UpdateZAndA()中的部分代码,没有发现这个额外的部分有什么作用。 https://github.com/zhangxiaoya/FB/blob/f8576744ee9261dec553db40bbe68c21677c5748/src/SuperResolution/SuperResolutionBase.cpp#L245

2、关于Z中未定义像素,如何填充? 在构建模糊图像Z时,需要将对齐后的LR图像根据其相对于基帧的位移,投射到高分辨率网格中。在这一过程中,如果高分辨率网格中对应位置没有符合所需要的位移的LR图像,就会被以0填充,即使之后会经过中值滤波,但在某些情况下(例如图片数目过少、位移单一),Z中仍然会出现空洞,导致最终结果中产生空洞。 在Fast and Rubust MultiFrame Superresulotion文章中,作者提出对于这种未定义的情况,可以使用插值进行填补,但我不确定应该在迭代前即MedianAndShift()中就填充Z中未定义的像素,还是应在迭代后再替换Z中未定义的像素。

1)我尝试在迭代后再替换Z中未定义的像素。即将得到的结果中不包含左上方黑色填充的区域,覆盖至基帧的Lanczos插值的中心(避免裁减的影响),覆盖时考虑利用markMat作为掩膜,但是效果不佳,空洞并未完全消除。

并且我发现结果中空洞的位置并不与maskMat一致,这可能是由于UpdateZAndA()中的中值滤波去除了部分0值吗?如下面代码所示: https://github.com/zhangxiaoya/FB/blob/f8576744ee9261dec553db40bbe68c21677c5748/src/SuperResolution/SuperResolutionBase.cpp#L88 2)我认为在空洞较少时,直接在最终的结果中使用中值滤波能得到可以接受的结果。 image

对于这个问题,您有什么建议吗?

3、这段代码中,行列像素的起始位置令我有点困惑,rows start from Y[i] + srFactor - 1 but cols start from X[i] + srFactor - 0。 我认为c的起始位置应为 X[i] + srFactor - 1,以避开左侧的0填充,这是否更为合理? https://github.com/zhangxiaoya/FB/blob/f8576744ee9261dec553db40bbe68c21677c5748/src/SuperResolution/SuperResolutionBase.cpp#L162

shenjun1994 commented 2 years ago

请问对于0值的处理,您现在有什么好的方案嘛,可以分享一下嘛

MisakaMikt commented 2 years ago

请问对于0值的处理,您现在有什么好的方案嘛,可以分享一下嘛

还没有。大致有两种思路,一是最后的结果使用中值滤波,当空洞较少时,可以滤去一些;二是将最后的结果和基准帧的插值融合,0值的位置(指的是https://github.com/zhangxiaoya/FB/blob/f8576744ee9261dec553db40bbe68c21677c5748/src/SuperResolution/SuperResolutionBase.cpp#L136 )使用基准帧的插值像素值。

shenjun1994 commented 2 years ago

我使用了您的思路,用基准帧的插值像素替换Z中值为0和-1处位置的值,然后最后结果中值滤波,因为我把newsize强行改成了原像素的整数倍,在边界还有点细节没弄好。