我正在尝试使用双三次插值对图像进行上采样,我需要与opencv的cvResize()函数匹配的准确值,但以下代码的结果与cvResize()的结果不匹配,您可以看一下并帮助我修复错误。<>之前Image *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;
之前}
你还没有说结果有多么不同。如果它们非常接近,比如每个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);
变化:
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++)