1、前言
svd(stable video diffusion)开放了图生视频的api,但是限制图片分辨率必须为下面三种1024x576
、576x1024
、768x768
。项目基于fooocus生成的图片分辨率不满足,然后基于imageio+graphics2d处理了一下,修改图片分辨率,然后再去生成视频。功能调通了,但是发现图片清晰度严重下降。效果如下所示。
看了下windows自带画图工具修改分辨率大小功能,修改后的图片清晰度基本上能和原图一致。这个graphics2d质量差的多。
然后分析了五种常用的java图像处理工具:graphics2d、imagej、jai、opencv和thumbnailator。通过了解它们的基础知识和java对接实现,对比下来,在修改分辨率后,图片清晰度最高的是opencv。图片处理质量依次为opencv>jai>imagej>thumbnailator>graphics2d
- fooocus生成图片1536 x 2560
- graphics2d修改分辨率后的图片576 x 1024
2、 图像处理工具效果对比
此处对一张图片,分别使用五种工具处理,进行结果比对。
原图如下:1280 x 768分辨率,要求处理为一张1024 x 576的图片。输出图片质量要求尽可能的高。
2.1 graphics2d实现
2.1.1 说明
graphics2d是java中的2d图形api,用于绘制和操作图形。
使用graphics2d可以轻松地修改图像的分辨率,使用的是插值算法重新绘制图片,但是图片失真严重。
如果图片是webp格式,需要引入下面依赖以兼容webp格式。
2.1.2 依赖
<dependency>
<groupid>com.twelvemonkeys.imageio</groupid>
<artifactid>imageio-webp</artifactid>
<version>3.10.1</version>
</dependency>
2.1.3 实现
2.1.4 效果
基本上能满足压缩图片的需求,但色彩严重不饱和、画质较低,清晰度远远达不到原图。
graphics2d绘图支持三种算法,但是效果大差不差。
2.2 thumbnailator实现
2.2.1 说明
thumbnailator是一个用于创建和处理缩略图的java库。它提供了简单易用的 api,使开发人员能够快速地生成缩略图,并对其进行各种操作,如缩放、旋转、裁剪、水印等。
- 图像缩放,可以根据指定的尺寸生成缩略图
- 图像裁剪,可以根据指定的区域裁剪原始图像。
- 图像旋转、反转、水印、边框等功能
2.2.2 依赖
<dependency>
<groupid>net.coobird</groupid>
<artifactid>thumbnailator</artifactid>
<version>0.4.9</version>
</dependency>
2.2.3 实现
2.2.4 效果
能满足压缩图片的需求,色彩同样严重不饱和、可以清晰的看到像素颗粒度很大。
和graphics2d对比,画质效果提升不明显。
2.3 imagej实现
2.3.1 说明
imagej是一个开源的图像处理和分析软件,它提供了丰富的图像处理和分析工具,适用于科学研究、医学影像、工程图像处理等领域。
- imagej 提供了丰富的图像处理工具,包括图像滤波、增强、分割、配准、变换等功能
- imagej 提供了多种图像分析工具,包括图像测量、轮廓分析、颜色分析、纹理分析等功能
2.3.2 依赖
<dependency>
<groupid>net.imagej</groupid>
<artifactid>ij</artifactid>
<version>1.54i</version>
</dependency>
2.3.3 实现
2.3.4 效果
满足压缩图片的需求,色彩饱和,光线强弱对比明显,衣服质感,表情还原基本不错。
观察脸部,手部、小兔子耳朵可以明显看到,存在锯齿轮廓,画质相对不错,但质量依然不高。
2.4 jai(java advanced imaging)实现
2.4.1 说明
java 高级图像处理工具包(jai)是用于在 java 环境中处理图像和图形数据的库。
- jai 提供了丰富的图像处理和图形操作功能,包括图像过滤、变换、合成、校正、分析等。
2.4.2 依赖
<dependency>
<groupid>javax.media</groupid>
<artifactid>jai-core</artifactid>
<version>1.1.3</version>
</dependency>
<dependency>
<groupid>com.sun</groupid>
<artifactid>jai_codec</artifactid>
<version>1.1.3</version>
</dependency>
2.4.3 实现
2.4.4 效果
整体看起来,没有大问题。面部表情细腻,头发、瓶子、手部、后面的光线等能达到较高的清晰度。
2.5 opencv实现
2.5.1 说明
opencv(open source computer vision library)是一个开源的跨平台计算机视觉库,它提供了丰富的图像处理和计算机视觉算法,可用于开发各种视觉任务的应用程序。
- 提供了易于使用的 c++、python 和 java 接口简单易用
- 底层实现采用了高效的 c/c++ 编写,拥有较高的性能
- 功能库非常丰富,提供了超过 2500 个优化过的图像处理和计算机视觉算法,涵盖了各种任务,包括图像处理、特征检测、物体识别、人脸识别、目标跟踪、摄像头校正等
2.5.2 依赖
<dependency>
<groupid>org.openpnp</groupid>
<artifactid>opencv</artifactid>
<version>4.9.0-0</version>
</dependency>
2.5.3 实现
- java.lang.unsatisfiedlinkerror: no opencv_java490 in java.library.path问题处理
在windows下开发,需要下载安装opencv,下载地址:https://opencv.org/releases/
以opencv – 4.9.0版本为例,在windows x64系统下找到安装路径下的动态链接库文件{home}\opencv\build\java\x64\opencv_java490.dll,移动至java.library.path下,此处移动至jdk的bin路径下即可。
在linux下库文件是{home}/opencv-4.9.0/build/lib/libopencv java490.so文件
// 查看java库文件路径
system.getproperty("java.library.path")
2.5.4 效果
对比jai,效果好像没有大的提升,我们放大3倍来看。左侧为jai,右侧为opencv。
opencv画质更高,没有明显的模糊区域。jai存在一定的糊状效果。
3、图像处理工具结果
仅针对图片分辨率调整处理结果来说,从画质清晰度、色彩、面部表情、阳光、手部细节等角度看,整体效果opencv>jai>imagej>thumbnailator>graphics2d
对于opencv有更多功能,也很强大,此处仅针对绘图进行比对,更多功能等待后续探索。
发表评论