OpenCV的resize函数有什么问题?

3

今天我想知道的是:

我正在尝试使用以下代码将图像缩放为4x4像素:

Mat image4x4;

vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION);
compression_params.push_back(9);

resize(imageFromFile, image4x4, Size(4,4), INTER_CUBIC);
imwrite("/Users/macuser/Desktop/4x4/"+names.at(i), image4x4, compression_params);

我的结果如下:

输入图像说明

但是使用其他工具如Photoshop、GIMP,结果就有点像这样:

输入图像说明

同样在这个软件中使用 CUBIC 也会出现这种情况。

我的实现哪里出了问题?我是否考虑到了所有参数?

非常感谢。


示例:

输入图像说明

更新:我尝试了在线缩放器,得到的仍是错误的结果。所以...也许我对GIMP的操作有兴趣。


你有没有看过这里的第3099行?也许某个系数或参数略有不同。 - LovaBill
GIMP不提供X和Y轴...我猜它们默认为0(就像OpenCV一样) - Rafael Ruiz Muñoz
1个回答

2

从我在图像处理中学到的知识来看,调整大小是通过一些2的幂次迭代来处理的。剩下的就是插值。

所以我做的是:将大小调整到最接近2的幂次方(即找到第一个N,使得大小 < pow(2,N)),然后通过平方将大小调整为4。

例如,如果我的N是10,2^10 = 512,我需要将大小调整为256、128、64、32、16、8和4:

for (int i = 512; i>=4; i = i/2) {
        resize(image4x4, image4x4, Size(i,i), 0, 0, INTER_CUBIC);
}

并且工作得非常好 ;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接