最快的批量缩小JPEG图像的方法

3
如果硬件不是限制因素,如何以最快的方式缩小大量高分辨率jpeg图像?例如,如果我有一个包含20,000个jpeg图像的文件夹,这些图像的长宽比各不相同,但都相当大(接近4k分辨率),我想将每个图像调整为512x512。
我已经尝试了在一台性能很强的机器上使用Python pillow-simd与libjpegturbo以及多进程处理,其中包括一块V100 GPU(虽然我认为没有被充分利用),但仍需要约90分钟才能完成此工作。
是否有人知道能够利用强大GPU或具有其他重要速度优化的图像缩小方法?或者这就是图像缩小速度的最新技术水平?

1
我在这里展示和基准测试了几种方法 https://dev59.com/m2oy5IYBdhLWcg3wUcb_#51822265 - Mark Setchell
1
请注意,由于您正在进行一些相当大的大小缩减,因此应尝试使用“shrink-on-load”,因为它会产生巨大的影响... https://dev59.com/vX_aa4cB1Zd3GeqP8dWK#32169224 - Mark Setchell
1
我从未试过使用Pillow,但我认为那就是Image.draft()方法的作用...https://pillow.readthedocs.io/en/3.1.x/reference/Image.html - Mark Setchell
2
请注意,如果您使用Python和GNU Parallel进行并行处理,应编写Python来接受整个文件名列表。这样,您可以使用parallel -X ...,它将尽可能多的图像名称传递给每个Python进程,而不是为每个图像启动一个全新的Python解释器,从而可以在许多图像上分摊启动Python的成本。 - Mark Setchell
1
一个问题是关于质量你想做什么?你可以进行盲目抽样或者平均值。前者更快但往往会给出较差的结果。 - user3344003
显示剩余2条评论
1个回答

0
我过去有一些进行重型图像处理的经验。有一个名为OpenCV(计算机视觉)的开源框架,可以与Python、C++和Java一起使用。OpenCV使用矩阵(MAT)来进行各种图像操作——缩放很容易实现。这应该能给你一个大致的了解。
代码的Java版本可能看起来像这样:
import static org.opencv.imgproc.Imgproc.*;
import static org.opencv.imgcodecs.Imgcodecs.imread;
import static org.opencv.imgcodecs.Imgcodecs.imwrite;

//loop over your array of files here
Mat src  =  imread(myFilePath);
Mat resizeimage = new Mat();
Size scaleSize = new Size(512,512);
resize(src, resizeimage, scaleSize , 0, 0, INTER_AREA);
imwrite("C:\\File\\input.jpg", resizeimage);

如果你想进行超高速图像处理,C++ 会更适合。我使用带有 C++ 的 OpenCV 进行实时电影图像处理,它拥有足够的处理能力以每秒达到 36 帧的速度。而使用 Java,则只能达到每秒 4 帧的输出速度。

C++版本比Python版本快得多吗?我认为Python版本中的底层代码也是用C语言编写的,以提高性能。 - Austin
我没有尝试过Python,但我知道OpenCV支持它。Python编程比C++明显容易得多,因此从Python开始是一个好主意。如果您没有获得所需的性能,则必须转向C++以获得最高速度。 - Brian

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