图像处理-Java-OpenCV-水印编码/解码
opencv
OpenCV: 开源计算机视觉库
项目地址:https://gitcode.com/gh_mirrors/opencv31/opencv
·
背景
《图像处理-Java-OpenCV-水印编码/解码》,之前在编写过关于图像边缘检测-去黑边、图像边缘检测-自动纠偏、图像处理-锐化、图像处理-去噪/高斯模糊/套红、图像处理-背景色平滑/反色、图像处理-指定大小压缩、图像处理-Java-字深字浅、图像处理-Java-以图搜图等一系列文章,接下来主要介绍基于opencv的图像水印编码/解码功能。
概述
使用JAVA+OpenCV实现基于离散余弦变换(DCT)的水印编码/解码功能,将水印隐藏到图像中,从而可以达到类似版权保护的要求。
实现效果示例
分别列出来输入图像、输出图像、隐藏水印。 请注意本例使用的图像由于背景色是纯白,那么输出图像在尽可能放大之后会有一些噪点,特此说明。
图像备份: 访问
代码实现
/**
* 基于离散余弦变换(DCT)的水印编码功能
* @param inputImgPath
* @param textWatermark
* @param outputImgPath
*/
public static void dctWaterMarkEncode(String inputImgPath, String textWatermark, String outputImgPath) {
// 读取图像
Mat src = OpenCVUtils.imread(inputImgPath, org.opencv.core.CvType.CV_8S);
List<Mat> channel = new ArrayList<>(3);
List<Mat> newChannel = new ArrayList<>(3);
org.opencv.core.Core.split(src, channel);
for (int i = 0; i < 3; i++) {
Mat com = dctWaterMarkDCT(channel.get(i)).clone();
// you can set different location in 'new Point()', just copy putText method
putText(com, textWatermark,
new Point(com.cols() / 3, com.rows() / 2),
FONT_HERSHEY_COMPLEX, 5.0,
new Scalar(2, 2, 2, 0), 20, LINE_AA, false);
idct(com, com);
newChannel.add(i, com);
}
Mat res = new Mat();
org.opencv.core.Core.merge(newChannel, res);
if (res.rows() != src.rows() || res.cols() != src.cols()) {
res = new Mat(res, new Rect(0, 0, src.width(), src.height()));
}
org.opencv.imgcodecs.Imgcodecs.imwrite(outputImgPath, res);
}
/**
* 基于离散余弦变换(DCT)的水印解码功能
* @param inputImgPath
* @param outputImgPath
*/
public static void dctWaterMarkDecode(String inputImgPath, String outputImgPath) {
Mat dctWaterMark = dctWaterMarkDCT(OpenCVUtils.imread(inputImgPath, CV_8U));
dctWaterMark.convertTo(dctWaterMark, COLOR_RGB2HSV);
inRange(dctWaterMark, new Scalar(0, 0, 0, 0), new Scalar(16, 16, 16, 0), dctWaterMark);
org.opencv.core.Core.normalize(dctWaterMark, dctWaterMark, 0, 255, NORM_MINMAX, CV_8UC1);
org.opencv.imgcodecs.Imgcodecs.imwrite(outputImgPath, dctWaterMark);
}
private static Mat dctWaterMarkDCT(Mat src) {
if ((src.cols() & 1) != 0) {
copyMakeBorder(src, src, 0, 0, 0, 1, BORDER_CONSTANT, Scalar.all(0));
}
if ((src.rows() & 1) != 0) {
copyMakeBorder(src, src, 0, 1, 0, 0, BORDER_CONSTANT, Scalar.all(0));
}
src.convertTo(src, CV_32F);
dct(src, src);
return src;
}
参考
- http://pap-docs.pap.net.cn/
- https://gitee.com/alexgaoyh
OpenCV: 开源计算机视觉库
最近提交(Master分支:4 个月前 )
b229f1ef
core: add NEON support for cvFloor in fast_math.hpp #28243
- This PR adds NEON intrinsics-based implementation for the cvFloor function in fast_math.hpp for Windows-ARM64.
- Both float and double overloads now use NEON intrinsics for cvFloor Function.
- calchist and calchist1d function uses cvFloor function for its computations.
- After adding these changes both functions showed improvement in performance.
**Performance Benchmarks:**
<img width="956" height="273" alt="image" src="https://github.com/user-attachments/assets/a00c98cd-d245-4d11-a9fd-361a3bd89f59" />
See details at https://github.com/opencv/opencv/wiki/How_to_contribute#making-a-good-pull-request
- [x] I agree to contribute to the project under Apache 2 License.
- [x] To the best of my knowledge, the proposed patch is not based on a code under GPL or another license that is incompatible with OpenCV
- [x] The PR is proposed to the proper branch
22 小时前
1d20b65f
Optimized Bilateral Filter (32f) with AVX512 22 小时前
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)