【问题标题】:Trying to reproduce output of PIL's resize image in C++试图在 C++ 中重现 PIL 的调整大小图像的输出
【发布时间】:2018-01-29 16:09:19
【问题描述】:

我目前正在使用 python 调整 PIL 图像的大小

resized_image = pil_image.resize((128, 128), resample=Image.BILINEAR)

我想使用 C++ 调整相同图像的大小,并让输出与 python 版本相同。我试过使用这样的opencvs resize函数

cv::GpuMat::src;
cv::GpuMat::dst;
cv::cuda::resize(src, dst, cv::Size(128, 128), NULL, NULL, cv::INTER_LINEAR);

但是,如果我将两个图像都写入文件并检查它们,我会发现调整大小图像的 python 版本明显更加模糊。

我正在寻找在 C++ 中忠实再现调整大小的 python 图像的方法,但我不确定最好的方法是什么。首先,我真的不明白为什么输出会有差异,他们使用相同的双线性下采样。

我尝试检查https://github.com/python-pillow/Pillow/blob/master/PIL/Image.py 中的代码,看看它是否在调用c-lib。但老实说,我什至不明白 resize 方法是如何工作的。看起来它只是在最后调用自己而没有做任何调整大小的工作。

【问题讨论】:

  • 这很麻烦,而且有点宽泛。例如,如果您从 jpg 获取输入,即使解码器 可以 输出不同的图像。然后调整大小可能需要的不仅仅是某种方法(例如边界处理,尽管您的描述听起来不是这里的罪魁祸首)而且我忽略了潜在的 GPU 差异(浮点大小和 co)。为什么不将 opencv 也用于 python 部分(并希望它使用相同的核心)?或者可能是最不麻烦的方法(取决于您的任务):将其全部外包给 imagemagick。
  • @Locus Python 代码将调用委托给C implementation

标签: python c++ opencv python-imaging-library


【解决方案1】:

在 GitHub 上,您可以在存储库 https://github.com/zurutech/pillow-resize 中找到用 C++ 调整 Pillow 大小的代码。

代码已从Pillow源码中提取相关部分得到,

免责声明:该库由我在 Zuru Tech 的团队开发。

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 2017-04-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2011-05-03
    • 2015-10-07
    • 2016-11-06
    相关资源
    最近更新 更多