背景

  《图像处理-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;
    }

参考

  1. http://pap-docs.pap.net.cn/
  2. https://gitee.com/alexgaoyh
GitHub 加速计划 / opencv31 / opencv
77.38 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:2 个月前 )
c3747a68 Added Universal Windows Package build to CI. 5 天前
9b635da5 - 5 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐