opencv实现盲水印

article/2025/11/7 13:11:43

主要用于图片版权追溯,用户指纹识别等场景,保证用户版权以及作为防盗反爬关键性法律证据。

opencv环境

windows

解压opencv-3.4.2.tar.gz,项目运行是在VM options中加入库环境-Djava.library.path=D:\opencv3.4.2\opencv\build\java\x64;D:\opencv3.4.2\opencv\build\x64\vc14\bin

linux

配置docker容器

vim Dockerfile

FROM docker.io/centos:7
MAINTAINER OneJane
WORKDIR /usr
RUN mkdir /usr/local/java
ADD jdk-8u60-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_60
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
RUN mkdir -p /usr/local/opencv_make/build
ADD opencv-3.4.2 /usr/local/opencv_make
RUN yum -y install make cmake gcc gcc-c++ gtk+-devel gimp-devel gimp-devel-tools gimp-help-browser zlib-devel libtiff-devel libjpeg-devel libpng-devel gstreamer-devel libavc1394-devel libraw1394-devel libdc1394-devel jasper-devel jasper-utils swig python libtool nasm build-essential ant
RUN cd /usr/local/opencv_make/build && cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv_make/build -DBUILD_TESTS=OFF ..
RUN cd /usr/local/opencv_make/build && make
RUN cp /usr/local/opencv_make/build/lib/libopencv_java342.so /usr/lib
ADD apache-tomcat-8.5.46 /usr/local/tomcat
RUN echo "tail -f /usr/local/tomcat/logs/catalina.out " >> /usr/local/tomcat/bin/catalina.sh
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh"]
CMD ["start"]

盲水印

加入依赖

<dependencies><dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>3.4.2-1</version></dependency>
</dependencies>

加解盲水印

import org.opencv.core.Point;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferByte;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import static org.opencv.core.Core.BORDER_CONSTANT;
import static org.opencv.core.Core.copyMakeBorder;
import static org.opencv.imgproc.Imgproc.putText;public class DarkWatermarkUtil {private static List<Mat> planes = new ArrayList<Mat>();private static List<Mat> allPlanes = new ArrayList<Mat>();public static Mat addImageWatermarkWithText(Mat image, String watermarkText) {//优化图像的尺寸//Mat padded = optimizeImageDim(image);Mat complexImage = new Mat();Mat padded = splitSrc(image);padded.convertTo(padded, CvType.CV_32F);planes.add(padded);planes.add(Mat.zeros(padded.size(), CvType.CV_32F));Core.merge(planes, complexImage);// dftCore.dft(complexImage, complexImage);// 添加文本水印Scalar scalar = new Scalar(0, 0, 0);Point point = new Point(60, 60);putText(complexImage, watermarkText, point, Core.FONT_HERSHEY_DUPLEX, 0.8D, scalar, 2);Core.flip(complexImage, complexImage, -1);putText(complexImage, watermarkText, point, Core.FONT_HERSHEY_DUPLEX, 0.8D, scalar, 2);Core.flip(complexImage, complexImage, -1);return antitransformImage(complexImage, allPlanes,padded);}public static Mat getImageWatermarkWithText(Mat image) {List<Mat> planes = new ArrayList<Mat>();Mat complexImage = new Mat();Mat padded = splitSrc(image);padded.convertTo(padded, CvType.CV_32F);planes.add(padded);planes.add(Mat.zeros(padded.size(), CvType.CV_32F));Core.merge(planes, complexImage);// dftCore.dft(complexImage, complexImage);Mat magnitude = createOptimizedMagnitude(complexImage);planes.clear();return magnitude;}private static Mat splitSrc(Mat mat) {
//        mat = optimizeImageDim(mat);Mat padded = new Mat();Core.split(mat, allPlanes);if (allPlanes.size() > 1) {for (int i = 0; i < allPlanes.size(); i++) {if (i == 0) {padded = allPlanes.get(i);break;}}} else {padded = mat;}return padded;}private static Mat antitransformImage(Mat complexImage, List<Mat> allPlanes,Mat padded) {Mat invDFT = new Mat();Core.idft(complexImage, invDFT, Core.DFT_SCALE | Core.DFT_REAL_OUTPUT, 0);Mat restoredImage = new Mat();invDFT.convertTo(restoredImage, CvType.CV_8U);if (allPlanes.size() == 0) {allPlanes.add(restoredImage);} else {allPlanes.set(0, restoredImage);}Mat lastImage = new Mat();Core.merge(allPlanes, lastImage);planes.clear();allPlanes.clear();complexImage.release();invDFT.release();restoredImage.release();padded.release();return lastImage;}private static Mat optimizeImageDim(Mat image) {Mat padded = new Mat();int addPixelRows = Core.getOptimalDFTSize(image.rows());int addPixelCols = Core.getOptimalDFTSize(image.cols());copyMakeBorder(image, padded, 0, addPixelRows - image.rows(), 0, addPixelCols - image.cols(),BORDER_CONSTANT, Scalar.all(0));return padded;}private static Mat createOptimizedMagnitude(Mat complexImage) {List<Mat> newPlanes = new ArrayList<Mat>();Mat mag = new Mat();Core.split(complexImage, newPlanes);Core.magnitude(newPlanes.get(0), newPlanes.get(1), mag);Core.add(Mat.ones(mag.size(), CvType.CV_32F), mag, mag);Core.log(mag, mag);shiftDFT(mag);mag.convertTo(mag, CvType.CV_8UC1);Core.normalize(mag, mag, 0, 255, Core.NORM_MINMAX, CvType.CV_8UC1);return mag;}private static void shiftDFT(Mat image) {image = image.submat(new Rect(0, 0, image.cols() & -2, image.rows() & -2));int cx = image.cols() / 2;int cy = image.rows() / 2;Mat q0 = new Mat(image, new Rect(0, 0, cx, cy));Mat q1 = new Mat(image, new Rect(cx, 0, cx, cy));Mat q2 = new Mat(image, new Rect(0, cy, cx, cy));Mat q3 = new Mat(image, new Rect(cx, cy, cx, cy));Mat tmp = new Mat();q0.copyTo(tmp);q3.copyTo(q0);tmp.copyTo(q3);q1.copyTo(tmp);q2.copyTo(q1);tmp.copyTo(q2);}public static BufferedImage Mat2BufImg(Mat matrix, String fileExtension) {// convert the matrix into a matrix of bytes appropriate for// this file extensionMatOfByte mob = new MatOfByte();Imgcodecs.imencode(fileExtension, matrix, mob);// convert the "matrix of bytes" into a byte arraybyte[] byteArray = mob.toArray();BufferedImage bufImage = null;try {InputStream in = new ByteArrayInputStream(byteArray);bufImage = ImageIO.read(in);} catch (Exception e) {e.printStackTrace();}return bufImage;}public static Mat BufImg2Mat(BufferedImage original, int imgType, int matType) {if (original == null) {throw new IllegalArgumentException("original == null");}
//        System.loadLibrary("opencv_java342");
//        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
//        System.load("D:\\opencv3.4.2\\opencv\\build\\java\\x64\\opencv_java342.dll");//System.out.println(Core.NATIVE_LIBRARY_NAME);// Don't convert if it already has correct typeif (original.getType() != imgType) {// Create a buffered imageBufferedImage image = new BufferedImage(original.getWidth(), original.getHeight(), imgType);// Draw the image onto the new bufferGraphics2D g = image.createGraphics();try {g.setComposite(AlphaComposite.Src);g.drawImage(original, 0, 0, null);} finally {g.dispose();}}byte[] pixels = ((DataBufferByte) original.getRaster().getDataBuffer()).getData();Mat mat = Mat.eye(original.getHeight(), original.getWidth(), matType);mat.put(0, 0, pixels);return mat;}static {//加载opencv动态库System.loadLibrary(Core.NATIVE_LIBRARY_NAME);}public static void main(String[] args) {// 加盲水印
//        Mat img = Imgcodecs.imread("/tmp/s.jpg");
//        Mat watermarkImg = addImageWatermarkWithText(img,"onejane");
//        Imgcodecs.imwrite("/tmp/s_encode.jpg", watermarkImg);// 解盲水印Mat img = Imgcodecs.imread("/tmp/s_encode.jpg");Mat watermarkImg = getImageWatermarkWithText(img);Imgcodecs.imwrite("s_decode.jpg", watermarkImg);}
}

在maven中配置插件,将依赖打包入jar

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>utf8</encoding></configuration>
</plugin>
<plugin><artifactId>maven-assembly-plugin</artifactId><configuration><archive><manifest><mainClass>com.allen.capturewebdata.Main</mainClass></manifest></archive><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration>
</plugin>

java -cp pirate_tools_aliyun_image-1.2.5-jar-with-dependencies.jar com.onejane.image.DarkWatermarkUtil 主动调用实现类,获取解开的盲水印

在这里插入图片描述

阿里云盲水印

  1. 上传待添加水印的图片到OSS Bucket

  2. 根据添加的盲水印类型准备水印信息。

  • 图片类型:准备水印图片并上传水印图片到OSS Bucket。
  • 文字类型:准备水印文字内容。
  1. 调用PutProject接口创建项目,并设置Type为PhotoStarter,或者通过智能媒体管理控制台新建项目

在这里插入图片描述

  1. 引入pom依赖
<dependency><groupId>com.aliyun</groupId><artifactId>imm20170906</artifactId><version>1.0.0</version>
</dependency>
  1. 实现加解盲水印
public static com.aliyun.imm20170906.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {Config config = new Config().setAccessKeyId(accessKeyId).setAccessKeySecret(accessKeySecret);config.endpoint = "imm.cn-beijing.aliyuncs.com";return new com.aliyun.imm20170906.Client(config);
}
public static void main(String ss[]) {try { com.aliyun.imm20170906.Client Imgclient = createClient("LTAITuSh49mMQCi2", "TVac6ND2MmfmVi2hB7nYvpPtzMTUnK");EncodeBlindWatermarkRequest encodeBlindWatermarkRequest = new EncodeBlindWatermarkRequest();encodeBlindWatermarkRequest.setModel("DWT_IBG");encodeBlindWatermarkRequest.setImageUri("oss://onejane-opencv/DSC02804.JPG");
//          encodeBlindWatermarkRequest.setWatermarkUri("oss://onejane-opencv/water.png");
//          encodeBlindWatermarkRequest.setTargetImageType("png");encodeBlindWatermarkRequest.setContent("哈罗摩托");encodeBlindWatermarkRequest.setProject("onejane");encodeBlindWatermarkRequest.setTargetUri("oss://onejane-opencv/DSC02804_encode.JPG");
//          encodeBlindWatermarkRequest.setTargetUri("oss://onejane-opencv/DSC02804_img_encode.JPG");EncodeBlindWatermarkResponse encodeBlindWatermarkResponse = Imgclient.encodeBlindWatermark(encodeBlindWatermarkRequest);System.out.println(JSON.toJSONString(encodeBlindWatermarkResponse));DecodeBlindWatermarkRequest decodeBlindWatermarkRequest = new DecodeBlindWatermarkRequest();decodeBlindWatermarkRequest.setImageQuality(90);decodeBlindWatermarkRequest.setModel("DWT_IBG");
//          decodeBlindWatermarkRequest.setImageUri("oss://onejane-opencv/DSC02804_img_encode.JPG");decodeBlindWatermarkRequest.setImageUri("oss://onejane-opencv/DSC02804_encode.JPG");decodeBlindWatermarkRequest.setOriginalImageUri("oss://onejane-opencv/DSC02804.JPG");decodeBlindWatermarkRequest.setProject("onejane");
//          decodeBlindWatermarkRequest.setTargetUri("oss://onejane-opencv/DSC02804_img_decode.JPG");decodeBlindWatermarkRequest.setTargetUri("oss://onejane-opencv/DSC02804_decode.JPG");DecodeBlindWatermarkResponse decodeBlindWatermarkResponse = Imgclient.decodeBlindWatermark(decodeBlindWatermarkRequest);System.out.println(JSON.toJSONString(decodeBlindWatermarkResponse));} catch (Exception e) {e.printStackTrace();}
}

完整源码请关注微信公众号:ReverseCode,回复:架构


http://chatgpt.dhexx.cn/article/kRbrMAhK.shtml

相关文章

盲水印添加,获取接口

添加水印&#xff0c;水印生成&#xff0c;获取水印 一、接口介绍 通过上传原始图片和水印图,生成带有隐性水印图的图片。既保持图片的美观性&#xff0c;又能保证图片的版权防护与追踪。这样便于在不破坏原有图片的情况下&#xff0c;实现版权保护。 二、功能体验 三、特色优…

java 添加盲水印_图片加数字盲水印

本文通过一个的实验&#xff0c;简要介绍频域手段添加数字盲水印的方法&#xff0c;并进一步验证其抗攻击性。在上述实验的基础上&#xff0c;总结躲避数字盲水印的方法。(多图预警) 本文分为五个部分&#xff0c;第一部分综述&#xff1b;第二部分频域数字盲水印制作原理介绍&…

使用 Python 给图片添加水印,其中一种还是隐形的盲水印呢!

文章目录 使用 Pillow 库为图片添加半透明水印使用 blind_watermark 库为图片添加盲水印安装嵌入水印提取水印 如何给图片添加水印呢&#xff1f;在 Python 的世界里&#xff0c;有多种方法可以为图片添加水印。 其中一种方法&#xff0c;可以使用大名鼎鼎 Pillow 库&#xff…

python 3.6 盲水印脚本安装说明

python 3.6 盲水印脚本安装说明 安装盲水印踩了不少坑&#xff0c;所以记录一下。 本机环境&#xff1a; windows10 python3.6 脚本安装地址&#xff1a; BlindWaterMark 下载解压即可 安装脚本的依赖库 opencv-python 4.2.0.34 matplotlib 2.1.1 安装命令&#xff1a; …

信息隐藏-图像盲水印实现

相关知识 目前水印大抵可分为两种&#xff0c;可见和不可见&#xff0c;可见水印大多用来标记或声明版权&#xff0c;或防盗用冒用&#xff0c;但在影院、绘画等场景下&#xff0c;可见性水印会极大影响用户体验&#xff0c;所以产生了盲水印的概念。 盲水印即看不见的水印&am…

Python给图片添加盲水印

文章目录 简介安装初试遇到的坑参考文献 简介 盲水印就是图片有水印但人眼看不出来&#xff0c;需要通过程序才能提取水印&#xff0c;相当于隐形“盖章”&#xff0c;可以用在数据泄露溯源、版权保护等场景。 该库出自阿里巴巴安全团队&#xff0c;强大之处&#xff1a; 解…

Opencv实现盲水印技术(三)——傅里叶变换算法及盲水印实现

前言 之前的文章中&#xff0c;介绍了如何构建Java工程和Java Web工程&#xff0c;本文将简单介绍对傅里叶变换的理解&#xff0c;以及使用opencv实现盲水印。关于傅里叶变换&#xff0c;有篇博文介绍的很详细&#xff0c;链接地址为&#xff1a;看了此文你还不了解傅里叶变换&…

双图+盲水印

1.双图 打开压缩包&#xff0c;发现有两张图片 first1和second.png&#xff0c;使用Stegsolve打开first1.png进行一次异或处理 然后分析选择结合second.png得到 用stegslove对二维码进行运算得到三张二维码 扫描结果是DES 6XaMMbM7 和一长串字符&#xff0c;很显然是des加密&a…

Python 数字图片盲水印

blind-watermark 基于傅里叶变换的数字盲水印 文档&#xff1a; https://BlindWatermark.github.io/blind_watermark/#/zh/Source code: https://github.com/guofei9987/blind_watermark install pip install blind-watermarkFor the current developer version: git clon…

watermark前端js盲水印添加方法

1,引入js <script src"/Public/js/watermark-dom/watermark.js" language"JavaScript"></script> 2,实例化对象 <script language"JavaScript"> //参数详情请参考watermark.js 文件里的说明 window.onload function(){wate…

给你的web页面添加盲水印,附带检盲水印方案

应用场景 在一些敏感系统有的时候我们为了防止别人截图或追溯图片源头是谁发的。我们需要在页面上埋下我们的隐形水印。 开始做 埋水印 github上有很多水印的js插件&#xff0c;download下来一个改一改&#xff0c;源码见最后附录。 改动内容&#xff1a;增加了判断dom被人…

有意思的数字盲水印的简单的实现。

早期大约是10年前从一本数字图像处理上看到过数字水印的概念&#xff0c;觉得确实一种很有意思的东西&#xff0c;那个时候主要就是基于LSB的图像信息的隐藏&#xff0c;这种在空域里的方法有较大的缺陷&#xff0c;鲁棒性是比较差的。随便一个后期的都会造成水印的丢失&#x…

python脚本实现盲水印提取和添加

python脚本实现盲水印提取和添加 首先github上找个BlindWaterMark-master文件下载一下&#xff0c;打开后是我这个样子 在python里面添加两个库&#xff0c;python.exe目录上方输入cmd pip install opencv-python python.exe -m pip install matplotlib新手这里装库的时候&am…

文字隐写术-盲水印研究笔记

gitee 开源代码(java) shuiyin: blind watermark 盲水印技术实现 java 实现版权保护 - Gitee.comhttps://gitee.com/chejiangyi/shuiyin/tree/master 需求概述 研究盲水印对于版权保护的效果和能力 研究尝试概述 水印实现: 大部分的python或者java算法都基于频域的盲水印效果…

web系统添加盲水印

前言 为增加系统安全性&#xff0c;避免重要敏感信息通过截图方式泄露&#xff0c;对web页面增加盲水印标识&#xff0c;标注系统名称&#xff0c;登陆人&#xff0c;当前时间等信息&#xff0c;这里的盲水印指肉眼不可见的html水印 增加水印 引入watermark.js调用 watermar…

【OpenCV 例程 300篇】219. 添加数字水印(盲水印)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程 300篇】219. 添加数字水印&#xff08;盲水印&#xff09; 8.2 添加数字盲水印 数字水印&#xff0c;是指将特征信息嵌入音频、图像或是视频等数字信号中。 数字水印分为明水印和盲水印&#xff08;blind watermark&#…

照片里的盲水印

这个题是安恒月赛里面的一道misc类型的题&#xff0c;在CTF中misc所谓最考验你的脑洞和检验你的赛事水平&#xff08;赛棍&#xff1f;&#xff1f;&#xff1f;&#xff09; 但是这个方面还是要看一下&#xff0c;就当做开发脑力了。 题目&#xff1a;暴力可解 题目文件 下载…

[python] 基于blind-watermark库添加图片盲水印

blind-watermark是一个能够给图片添加/解析基于频域的数字盲水印的Python库。图像水印image watermark是指在图片里添加文本或图形&#xff0c;以标记图片的来源。但是图像水印会破坏原图。因此另外一种水印形式&#xff0c;即图像盲水印blind image watermark在实践中更多地用…

图片盲水印软件

bulid_watermark_gui Blind&Invisible Watermark &#xff08;图片盲水印&#xff0c;提取水印无须原图&#xff01;) 增加图形界面 项目地址&#xff1a;github开源 软件下载地址&#xff1a;无需环境软件下载 how to use pip install -r requirements.txt 运行main.py…

隐写术(盲水印):从入门到出门

0. 前言 我在做 Blind Watermark 这个库的时候&#xff0c;翻阅了大量材料&#xff0c;学到了关于隐写术、盲水印的很多知识&#xff0c;现在梳理了一遍&#xff0c;发出来。 本文结构&#xff1a; 简介&#xff1a;隐写术的应用场景、分类、特点隐写术&#xff1a;介绍几种…