我正在尝试对lena图像进行整数到整数的5/3提升。我一直在按照Walker、Nguyen和Chen的论文《基于小功耗低内存的小波图像压缩系统》(链接,截至2015年10月7日仍然有效)进行操作。
但是我遇到了问题。图像似乎并不完全正确。绿色和蓝色通道似乎有些溢出,这意味着后续的小波函数会在不应该有任何高频的地方找到高频。我还相当确定我做错了其他事情,因为我在高频部分的边缘看到了s0图像的一条线。
我的函数如下:
有些问题,但我只是想不通。有没有比我稍微聪明一点的人能指出我错在哪里?需要注意的是,您可以看到Daub 5/3未提升版本的工作代码,这也给我带来了相同的伪影...我很困惑,因为我曾经让它工作过(那是2年前的事了,我现在已经没有那个代码了)。
非常感谢任何帮助 :)
编辑:通过将低通像素夹紧到0至255范围内,我似乎已经消除了溢出问题。但我稍微担心这不是正确的解决方案。有人可以对此发表评论吗?
但是我遇到了问题。图像似乎并不完全正确。绿色和蓝色通道似乎有些溢出,这意味着后续的小波函数会在不应该有任何高频的地方找到高频。我还相当确定我做错了其他事情,因为我在高频部分的边缘看到了s0图像的一条线。
我的函数如下:
bool PerformHorizontal( Col24* pPixelsIn, Col24* pPixelsOut, int width, int pixelPitch, int height )
{
const int widthDiv2 = width / 2;
int y = 0;
while( y < height )
{
int x = 0;
while( x < width )
{
const int n = (x) + (y * pixelPitch);
const int n2 = (x / 2) + (y * pixelPitch);
const int s = n2;
const int d = n2 + widthDiv2;
// Non-lifting 5 / 3
/*pPixelsOut[n2 + widthDiv2].r = pPixelsIn[n + 2].r - ((pPixelsIn[n + 1].r + pPixelsIn[n + 3].r) / 2) + 128;
pPixelsOut[n2].r = ((4 * pPixelsIn[n + 2].r) + (2 * pPixelsIn[n + 2].r) + (2 * (pPixelsIn[n + 1].r + pPixelsIn[n + 3].r)) - (pPixelsIn[n + 0].r + pPixelsIn[n + 4].r)) / 8;
pPixelsOut[n2 + widthDiv2].g = pPixelsIn[n + 2].g - ((pPixelsIn[n + 1].g + pPixelsIn[n + 3].g) / 2) + 128;
pPixelsOut[n2].g = ((4 * pPixelsIn[n + 2].g) + (2 * pPixelsIn[n + 2].g) + (2 * (pPixelsIn[n + 1].g + pPixelsIn[n + 3].g)) - (pPixelsIn[n + 0].g + pPixelsIn[n + 4].g)) / 8;
pPixelsOut[n2 + widthDiv2].b = pPixelsIn[n + 2].b - ((pPixelsIn[n + 1].b + pPixelsIn[n + 3].b) / 2) + 128;
pPixelsOut[n2].b = ((4 * pPixelsIn[n + 2].b) + (2 * pPixelsIn[n + 2].b) + (2 * (pPixelsIn[n + 1].b + pPixelsIn[n + 3].b)) - (pPixelsIn[n + 0].b + pPixelsIn[n + 4].b)) / 8;*/
pPixelsOut[d].r = pPixelsIn[n + 1].r - (((pPixelsIn[n].r + pPixelsIn[n + 2].r) >> 1) + 127);
pPixelsOut[s].r = pPixelsIn[n].r + (((pPixelsOut[d - 1].r + pPixelsOut[d].r) >> 2) - 64);
pPixelsOut[d].g = pPixelsIn[n + 1].g - (((pPixelsIn[n].g + pPixelsIn[n + 2].g) >> 1) + 127);
pPixelsOut[s].g = pPixelsIn[n].g + (((pPixelsOut[d - 1].g + pPixelsOut[d].g) >> 2) - 64);
pPixelsOut[d].b = pPixelsIn[n + 1].b - (((pPixelsIn[n].b + pPixelsIn[n + 2].b) >> 1) + 127);
pPixelsOut[s].b = pPixelsIn[n].b + (((pPixelsOut[d - 1].b + pPixelsOut[d].b) >> 2) - 64);
x += 2;
}
y++;
}
return true;
}
有些问题,但我只是想不通。有没有比我稍微聪明一点的人能指出我错在哪里?需要注意的是,您可以看到Daub 5/3未提升版本的工作代码,这也给我带来了相同的伪影...我很困惑,因为我曾经让它工作过(那是2年前的事了,我现在已经没有那个代码了)。
非常感谢任何帮助 :)
编辑:通过将低通像素夹紧到0至255范围内,我似乎已经消除了溢出问题。但我稍微担心这不是正确的解决方案。有人可以对此发表评论吗?