一、引言
在处理图片时,有时候需要去掉水印,那么如何通过 javacv
实现呢?下面我会详细讲解如何通过 javacv
实现图片去水印,并提供两条示例说明。
二、准备工作
在进行图片去水印的过程中,需要安装如下三个工具:
OpenCV
FFmpeg
JavaCV
其中,OpenCV
和 FFmpeg
为 JavaCV
的依赖库,因此需要先安装好 JavaCV
。
三、图片去水印实现
图片去水印实现的主要思路是将待处理的图片加载到 Mat
中,通过 Core.inRange()
方法找出水印的像素值范围,再利用 Core.bitwise_not()
方法将该像素值范围内的像素值变为透明像素,最后将处理后的图片保存到本地。下面是实现的具体步骤:
- 导入相关的包和类
import org.bytedeco.ffmpeg.global.avcodec;
import org.bytedeco.javacpp.BytePointer;
import org.bytedeco.javacpp.Loader;
import org.bytedeco.javacpp.opencv_core.Mat;
import org.bytedeco.javacpp.opencv_core.Scalar;
import org.bytedeco.javacpp.opencv_imgcodecs;
import org.bytedeco.javacpp.opencv_imgproc;
- 加载图片
Mat image = opencv_imgcodecs.imread("input.jpg");
- 定义水印颜色范围
Scalar lower = new Scalar(0, 0, 200); // 水印颜色下限
Scalar upper = new Scalar(100, 100, 255); // 水印颜色上限
- 找出水印的像素值范围
Mat mask = new Mat();
Mat hsv = new Mat();
opencv_imgproc.cvtColor(image, hsv, opencv_imgproc.COLOR_BGR2HSV);
opencv_core.inRange(hsv, lower, upper, mask);
- 将水印像素值范围内的像素值变为透明像素
Mat result = new Mat();
opencv_core.bitwise_not(mask, mask);
Mat transparent = new Mat(image.size(), image.type(), new Scalar(0, 0, 0, 0));
image.copyTo(transparent, mask);
- 保存处理后的图片
opencv_imgcodecs.imwrite("output.jpg", transparent);
四、示例说明
- 单张图片去水印示例
以去掉“www.baidu.com”水印的图片为例。
将待处理的图片命名为 input.jpg
放入代码所在项目文件夹下,执行上述代码,即可得到去掉水印后的图片,命名为 output.jpg
。
- 批量去水印示例
对于需要批量去水印的情况,可以将上述代码封装为方法,再通过 File.listFiles()
方法获取待处理文件夹下所有的图片路径,循环调用该方法即可。
public static void batchRemoveWatermark(String inputDir, String outputDir) throws Exception {
File inputDirFile = new File(inputDir);
File[] files = inputDirFile.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
String name = file.getName();
if (name.substring(name.lastIndexOf(".") + 1).equals("jpg")) {
Mat image = opencv_imgcodecs.imread(file.getAbsolutePath());
Scalar lower = new Scalar(0, 0, 200);
Scalar upper = new Scalar(100, 100, 255);
Mat mask = new Mat();
Mat hsv = new Mat();
opencv_imgproc.cvtColor(image, hsv, opencv_imgproc.COLOR_BGR2HSV);
opencv_core.inRange(hsv, lower, upper, mask);
Mat result = new Mat();
opencv_core.bitwise_not(mask, mask);
Mat transparent = new Mat(image.size(), image.type(), new Scalar(0, 0, 0, 0));
image.copyTo(transparent, mask);
String outputPath = outputDir + "/" + name;
opencv_imgcodecs.imwrite(outputPath, transparent);
}
}
}
调用该方法时,需要传入两个参数,分别是待处理文件夹路径和处理后文件夹路径。
以上就是通过 javacv
实现图片去水印的详细攻略,通过我提供的两个示例,您应该可以更加深入地理解实现原理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何通过javacv实现图片去水印(附代码) - Python技术站