0

我正在尝试使用双三次插值对图像进行上采样,我需要与 opencv 的 cvResize() 函数匹配的准确值,但以下代码的结果与 cvResize() 的结果不匹配,你能帮我看看吗修复错误。

图片 *Image::resize_using_Bicubic(int w, int h) {
    浮动 dx,dy;
    浮动 x,y;
    浮动 tx, ty;
    浮动 i,j,m,n;

Image *result=new Image(w, h); tx = (float)this->m_width/(float)w; ty = (float)this->m_height/(float)h; for(i=0; i< w; i++) { for(j=0; j< h; j++) { x = i*tx; y = j*ty; dx = float(i-x)-(int)(i-x); dy = float(j-y)-(int)(j-y); float temp=0.0; for(m=-1;m<=2;m++) { for(n=-1;n<=2;n++) { int HIndex,WIndex; HIndex=(y+n); WIndex=(x+m); if (HIndex<0) { HIndex=0; } else if(HIndex>this->getHeight()) { HIndex=this->getHeight()-1; } if (WIndex<0) { WIndex=0; } else if(WIndex>this->getWidth()) { WIndex=this->getWidth()-1; } temp+=this->getPixel(HIndex,WIndex)*R(m-dx)*R(dy-n); } } result->setPixel(j, i, temp); } } return result;

}

4

2 回答 2

1

你没有说结果有多么不同。如果它们非常接近,例如每个 RGB 通道中的 1 或 2 之内,这可以简单地通过舍入差异来解释。

双三次插值的算法不止一种。Don Mitchell 和 Arun Netravali 进行了分析,并提出了一个公式来描述其中的一些:http ://www.mentallandscape.com/Papers_siggraph88.pdf

编辑:另外一件事,应该将各个滤波器系数相加并用于最后除以最终值,以标准化这些值。而且我不确定为什么你有m-dx一个和dy-n另一个,它们不应该是同一个标志吗?

r=R(m-dx)*R(dy-n);
r_sum+=r;
temp+=this->getPixel(HIndex,WIndex)*r;
. . .
result->setPixel(j, i, temp/r_sum);
于 2011-08-18T16:35:51.400 回答
0

改变:

            else if(HIndex>this->getHeight())

至:

            else if(HIndex >= this->getHeight())

并改变:

            else if(WIndex>this->getWidth())

至:

            else if(WIndex >= this->getWidth())

编辑

也改变:

    for(m=-1;m<=2;m++)
    {
        for(n=-1;n<=2;n++)

至:

    for(m = -1; m <= 1; m++)
    {
        for(n = -1; n <= 1; n++)
于 2011-08-18T16:31:23.603 回答