精华内容
下载资源
问答
  • 隐藏水印
    万次阅读 多人点赞
    2018-10-28 00:27:54

    MATLAB_LSB_隐藏水印和提取,附代码

    对图像的认识

    ​ 图片是一个点阵图像,在屏幕上显示是RGB模式,打印模式为CMYK(彩色印刷)

    ​ 图片格式分为很多种:bmp(无压缩的格式), jpg(经过压缩的格式),png。

    ​ 一般的彩色图片,每个像素点都用三个0~255的值来表示red, green, blue,每个占一个字节,所以称为24位图,这里默认图片格式为bmp。

    文件头

    ​ 图片是以二进制存储数据的,通常在不同的图片格式中,文件头的格式以及包含的信息(图片的大小尺寸)都不同,这些信息,可以通过读取图片二进制内容获取。

    ​ bmp图片的文件头一般为54字节。

    需要注意的是,要更改图片格式,并不是修改后缀名就可以,不同类型的图片自身编码格式不同,所以需要另一种方法改变图片格式

    1. 可以在网上搜索在线修改图片格式为bmp的网站。

    2. 可以直接在画图工具中打开。

      有一个软件《文件格式分析器》可以检测文件类型,直接拖拽进去就行。百度网盘地址为:链接:https://pan.baidu.com/s/17RQ-31dMTqagPrvxoXaDbA
      提取码:ah42

      关于MATLAB的下载及安装,大家可以搜索微信公众号:软件安装管家

    重点

    ​ 今天我们讨论的水印加密最好需要转化成bmp图像进行操作,其次,为了简单起见,我们是使用灰度图,每个像素点用0~255的值来表示黑白颜色深度,图像本质并未有变化。

    ​ 准备:MATLAB, 载体图片(彩色), 要隐藏的图片(黑白)

    ​ 需要注意的点:

    1. 图像灰度处理的知识:图像灰度化
    2. 为什么要扩大被隐藏图片的大小
      1. 因为这里假设进行LSB加密和提取水印的不是同一个人,所以提取水印的人并不知道到底应该在载体图像中提取多少信息。
      2. 如果不考虑提取,只是添加水印,则这里不需要扩大图片的大小,而且同一个载体图片可以隐藏更多的信息。
      3. 使用MATLAB函数,只是在视觉上改变了图片的胖瘦,其信息仍然具有有效性。
    3. 二值化的相关知识
      1. 为了压缩水印。被隐藏的图片的每个像素是有不同的灰度阶,二值化之后,每个像素就只有0和1中的一种可能,就可以认为将图片的八个比特面压缩成了一个,这样更方便于嵌入到载体图像中.

    附上MATLAB代码及注释

    //加水印
    
    %ary 表示那个比特面,1是最低比特位
    ary = 1;
    
    file_name1 = 'demo.bmp';
    cover_object = imread(file_name1);      %读取本人照片信息
    cover_object = rgb2gray(cover_object);      %得到灰度图信息
    cover_object_ll = bitget(cover_object, ary);        %得到最后1位比特
     
    figure;     %唤醒一个窗口
    imshow(cover_object);
    title('origin host picture');   %展示原图像形成的灰度图
     
    figure;
    imshow(255*cover_object_ll);            %最低位左移到最高位
    title('origin hot pic`lowest bit');     %展示原图像的最低位
     
    file_name2 = 'Finger.bmp';
    message = imread(file_name2);
    
    figure;
    imshow(message);
    
    message = im2bw(message, graythresh(message));      %将指纹图像变为二值图
    
    figure;
    imshow(message);
    title('hidden picture');
     
    Mc = size(cover_object, 1); %Height   读取图片的大小
    Nc = size(cover_object, 2); %Width
    
    message = imresize(message, [Mc Nc]);       %使被隐藏图片和载体图片等长宽
    
    watermarked_image = cover_object;
    
    %使得载体图片的最后一个比特位,与被隐藏图片的数据相等
    for ii = 1 : Mc
    	for jj = 1 : Nc
    		if ii*jj < Mc * Nc              %小于指纹信息的图片大小
    			if cover_object_ll(ii, jj) ~= message(ii, jj)     %左右两端不相等,结果为一
    				if cover_object_ll(ii, jj) == 1
    				watermarked_image(ii, jj) = bitset(watermarked_image(ii,jj), ary, 0);   %不相等改为0
    				else
    				watermarked_image(ii, jj) = bitset(watermarked_image(ii,jj), ary, 1);
    				end
    			end
    		end
    	end
    end
    
    figure;
    imshow(watermarked_image);
    title('watermarked picture');
    saveas(gcf, 'ok.bmp');
    figure;
    watermarked_image_ll = bitget(watermarked_image, ary);
    imshow(255 * watermarked_image_ll);
    title('watermarked picture`s lowest bit');
    
    

    提取水印的过程就更简单:

    file = 'ok.bmp'
    water_pic = imread(file); %待提取图像
    water_pic_1 = bitget(water_pic, 1);        %得到最后1位比特
    
    figure;
    imshow(water_pic);
    
    figure;
    imshow(255*water_pic_1);
    saveas(gcf, 'abstarct.bmp');
    

    但是这种做法,安全性很差,如果遇到中间人攻击,提取最后一个比特面的信息,就可以随意的获取,替换被隐藏的信息,所以最好在提取时,已知被隐藏图片的大小,这样可以提高安全性。

    如果程序出现问题,可以私信我。

    写文章之前也参考了其它博文,仅作学习。

    更多相关内容
  • MATLAB_LSB_隐藏水印和提取,附代码-附件资源
  • 看到一个文章,关于阿里巴巴公司根据截图查到泄露信息的具体员工的技术是什么,这个新闻有点老了,主要说一下背后的图片隐藏水印方法 一、水印原理 相对于空域方法,频域加盲水印的方法隐匿性更强,抵抗攻击...

    看到一个文章,关于阿里巴巴公司根据截图查到泄露信息的具体员工的技术是什么,这个新闻有点老了,主要说一下背后的图片隐藏水印方法

    å¾ç

    一、水印原理

    相对于空域方法,频域加盲水印的方法隐匿性更强,抵抗攻击能力更强。这类算法解水印困难,你不知道水印加在那个频段,而且受到攻击往往会破坏图像原本内容。

    所谓盲水印,是指人感知不到的水印,包括看不到或听不见(没错,数字盲水印也能够用于音频)。其主要应用于音像作品、数字图书等,目的是,在不破坏原始作品的情况下,实现版权的防护与追踪。

    添加数字盲水印的方法简单可分为空域方法和频域方法,这两种方法添加了冗余信息,但在编码和压缩情况不变的情况下,不会使原始图像大小产生变化(原来是10MB添加盲水印之后还是10MB)。

    空域是指空间域,我们日常所见的图像就是空域。空域添加数字水印的方法是在空间域直接对图像操作(之所以说的这么绕,是因为不仅仅原图是空域,原图的差分等等也是空域),比如将水印(Matlab)直接叠加在图像上。

    å¾ç

    我们常说一个音有多高,这个音高是指频率;同样,图像灰度变化强烈的情况,也可以视为图像的频率。频域添加数字水印的方法,是指通过某种变换手段(傅里叶变换,离散余弦变换,小波变换等)将图像变换到频域(小波域),在频域对图像添加水印,再通过逆变换,将图像转换为空间域。相对于空域手段,频域手段隐匿性更强,抗攻击性更高。

    所谓对水印的攻击,是指破坏水印,包括涂抹,剪切,放缩,旋转,压缩,加噪,滤波等。数字盲水印不仅仅要敏捷性高(不被人抓到),也要防御性强(抗打)。就像Dota的敏捷英雄往往是脆皮,数字盲水印的隐匿性和鲁棒性是互斥的。(鲁棒性是抗攻击性的学术名字)

     

    二、频域制作数字盲水印的方法
    信号是有频率的,一个信号可以看做是无数个不同阶的正弦信号的的叠加。

    å¾ç

    上式为傅里叶变换公式,f(t)是指时域信号(对于信号我们说时域,因为是与时间有关的,而图像我们往往说空域,与空间有关),F(w)是指频率。想要对傅里叶变换有深入了解的同学,建议看一下《信号与系统》或者《数字信号处理》的教材,里面系统介绍了傅里叶变换、快速傅里叶变换、拉普拉斯变换、z变换等。

    简而言之,我们有方法将时域信号转换成为频域,同样,我们也能将二维信号(图像)转换为频域。在上文中提到,图像的频率是指图像灰度变换的强烈情况。

    下面以傅里叶变换为例,介绍通过频域给图像添加数字盲水印的方法。注意,因为图像是离散信号,我们实际用的是离散傅里叶变换,在本文采用的都是二维快速傅里叶变换,快速傅里叶变换与离散时间傅里叶变换等价,下文中傅里叶变换均为二维快速傅里叶变换。

     

    å¾ç

    上图为叠加数字盲水印的基本流程。编码的目的有二,一是对水印加密,二控制水印能量的分布。

     

    三、叠加数字盲水印的实验

    给出一张200*400的原图

    å¾ç

    之后进行傅里叶变换,下图变换后的频域图像,

    å¾ç

    水印图为60*200

    å¾ç

    编码后的水印,编码方式采用随机序列编码,通过编码,水印分布到随机分布到各个频率,并且对水印进行了加密,水印注意是对称的。

    å¾ç

    将上图与原图的频谱叠加,可见图像的频谱已经发生了巨大的变化

    å¾ç

    之后,将叠加水印的频谱进行傅里叶逆变换,得到叠加数字水印后的图像,

    å¾ç

    肉眼几乎看不出叠加水印后的图像与原图的差异,这样,数字盲水印已经叠加到图像中去。
    实际上,我们是把水印以噪声的形式添加到原图像中。
    下图是在空域上的加水印图与原图的残差

    å¾ç

    可以看出,实际上上述方法是通过频域添加冗余信息(像噪声一样)。这些噪声遍布全图,在空域上并不容易破坏。

    那么,为什么频谱发生了巨大的变化,而在空域却变化如此小呢?这是因为我们避开了图像的主要频率。下图是原图频谱,其能量主要集中在低频。

    å¾ç

    水印提取是水印叠加的逆过程,

    å¾ç


    经提取后,我们得到如下水印,问:为什么水印要对称呢?

    å¾ç

    四、源代码

    •  
    clc;clear;close all;alpha = 1;
    %% read dataim = double(imread('3.png'))/255;mark = double(imread('4.png'))/255;figure, imshow(im),title('original image');figure, imshow(mark),title('watermark');
    %% encode markimsize = size(im);%randomTH=zeros(imsize(1)*0.5,imsize(2),imsize(3));TH1 = TH;TH1(1:size(mark,1),1:size(mark,2),:) = mark;M=randperm(0.5*imsize(1));N=randperm(imsize(2));save('encode.mat','M','N');for i=1:imsize(1)*0.5    for j=1:imsize(2)        TH(i,j,:)=TH1(M(i),N(j),:);    endend% symmetricmark_ = zeros(imsize(1),imsize(2),imsize(3));mark_(1:imsize(1)*0.5,1:imsize(2),:)=TH;for i=1:imsize(1)*0.5    for j=1:imsize(2)        mark_(imsize(1)+1-i,imsize(2)+1-j,:)=TH(i,j,:);    endendfigure,imshow(mark_),title('encoded watermark');%imwrite(mark_,'encoded watermark.jpg');
    %% add watermarkFA=fft2(im);figure,imshow(FA);title('spectrum of original image');FB=FA+alpha*double(mark_);figure,imshow(FB); title('spectrum of watermarked image');FAO=ifft2(FB);figure,imshow(FAO); title('watermarked image');%imwrite(uint8(FAO),'watermarked image.jpg');RI = FAO-double(im);figure,imshow(uint8(RI)); title('residual');%imwrite(uint8(RI),'residual.jpg');xl = 1:imsize(2);yl = 1:imsize(1);[xx,yy] = meshgrid(xl,yl);figure, plot3(xx,yy,FA(:,:,1).^2+FA(:,:,2).^2+FA(:,:,3).^2),title('spectrum of original image');figure, plot3(xx,yy,FB(:,:,1).^2+FB(:,:,2).^2+FB(:,:,3).^2),title('spectrum of watermarked image');figure, plot3(xx,yy,FB(:,:,1).^2+FB(:,:,2).^2+FB(:,:,3).^2-FA(:,:,1).^2+FA(:,:,2).^2+FA(:,:,3).^2),title('spectrum of watermark');
    %% extract watermarkFA2=fft2(FAO);G=(FA2-FA)/alpha;GG=G;for i=1:imsize(1)*0.5    for j=1:imsize(2)        GG(M(i),N(j),:)=G(i,j,:);    endendfor i=1:imsize(1)*0.5    for j=1:imsize(2)        GG(imsize(1)+1-i,imsize(2)+1-j,:)=GG(i,j,:);    endendfigure,imshow(GG);title('extracted watermark');

    展开全文
  • 阿里巴巴泄露门使用的傅里叶变换隐藏水印(含源码) 相对于空域方法,频域加盲水印的方法隐匿性更强,抵抗攻击能力更强。这类算法解水印困难,你不知道水印加在那个频段,而且受到攻击往往会破坏图像原本内容。本文...
  • OPENCV实现隐藏水印

    千次阅读 2018-09-18 17:42:04
    OPENCV实现隐藏水印原理代码 原理 频域添加数字水印的方法,是指通过某种变换手段(傅里叶变换,离散余弦变换,小波变换等)将图像变换到频域(小波域),在频域对图像添加水印,再通过逆变换,将图像转换为空间域...

    OPENCV实现隐藏水印

    原理

    频域添加数字水印的方法,是指通过某种变换手段(傅里叶变换,离散余弦变换,小波变换等)将图像变换到频域(小波域),在频域对图像添加水印,再通过逆变换,将图像转换为空间域。

    代码

    原理很简单,实现也很简洁。使用opencv就可以完成隐藏水印的添加和检测。直接上代码:

    #include <stdlib.h>
    
    #include <opencv2/core/utility.hpp>
    #include <opencv2/tracking.hpp>
    #include <opencv2/videoio.hpp>
    #include <opencv2/highgui.hpp>
    
    #include "opencv2/imgproc/types_c.h"
    
    using namespace cv;
    std::vector<cv::Mat> planes;
    cv::Mat complexImage;
    
    void shiftDFT(cv::Mat image) 
    {
    	image = image(Rect(0, 0, image.cols & -2, image.rows & -2));
    	int cx = image.cols / 2;
    	int cy = image.rows / 2;
    
    	Mat q0 = Mat(image, Rect(0, 0, cx, cy));
    	Mat q1 = Mat(image, Rect(cx, 0, cx, cy));
    	Mat q2 = Mat(image, Rect(0, cy, cx, cy));
    	Mat q3 = Mat(image, Rect(cx, cy, cx, cy));
    
    	cv::Mat tmp = cv::Mat();
    	q0.copyTo(tmp);
    	q3.copyTo(q0);
    	tmp.copyTo(q3);
    
    	q1.copyTo(tmp);
    	q2.copyTo(q1);
    	tmp.copyTo(q2);
    }
    
    cv::Mat optimizeImageDim(cv::Mat image)
    {
    	// init
    	cv::Mat padded;
    	// get the optimal rows size for dft
    	int addPixelRows = cv::getOptimalDFTSize(image.rows);
    	// get the optimal cols size for dft
    	int addPixelCols = cv::getOptimalDFTSize(image.cols);
    	// apply the optimal cols and rows size to the image
    	cv::copyMakeBorder(image, padded, 0, addPixelRows - image.rows, 0, addPixelCols - image.cols,
    			cv::BORDER_CONSTANT, Scalar::all(0));
    
    	return padded;
    }
    
    
    cv::Mat createOptimizedMagnitude(cv::Mat complexImage)
    {
    	// init
    	std::vector<cv::Mat> newPlanes;
    	cv::Mat mag = cv::Mat();
    	// split the comples image in two planes
    	cv::split(complexImage, newPlanes);
    	// compute the magnitude
    	cv::magnitude(newPlanes[0], newPlanes[1], mag);
    
    	// move to a logarithmic scale
    	cv::add(cv::Mat::ones(mag.size(), CV_32F), mag, mag);
    	cv::log(mag, mag);
    	// optionally reorder the 4 quadrants of the magnitude image
    	shiftDFT(mag);
    	// normalize the magnitude image for the visualization since both JavaFX
    	// and OpenCV need images with value between 0 and 255
    	// convert back to CV_8UC1
    	mag.convertTo(mag, CV_8UC1);
    	cv::normalize(mag, mag, 0, 255, cv::NORM_MINMAX, CV_8UC1);
    
    	return mag;
    }
    
    cv::Mat transformImage(cv::Mat image)
    {
    	// planes??????????????,???.
    	if (!planes.empty()) {
    		planes.clear();
    	}
    	// optimize the dimension of the loaded image
    	cv::Mat padded = optimizeImageDim(image);
    	padded.convertTo(padded, CV_32F);
    	// prepare the image planes to obtain the complex image
    	planes.push_back(padded);
    	planes.push_back(cv::Mat::zeros(padded.size(), CV_32F));
    	// prepare a complex image for performing the dft
    	cv::merge(planes, complexImage);
    	// dft
    	printf("complexImage types %d\n", complexImage.type());
    	cv::dft(complexImage, complexImage);		
    
        // optimize the image resulting from the dft operation
        cv::Mat magnitude = createOptimizedMagnitude(complexImage);
        planes.clear();
        return magnitude;
    }
    
    
    void transformImageWithText(cv::Mat image, String watermarkText, 
        cv::Point point, double fontSize, Scalar scalar)
    {
    	// planes??????????????,???.
    	if (!planes.empty()) {
    		planes.clear();
    	}
    	// optimize the dimension of the loaded image
    	cv::Mat padded = optimizeImageDim(image);
    	padded.convertTo(padded, CV_32F);
    	printf("padded types %d CV_32FC1 %d\n", padded.type(), CV_32F);
    	// prepare the image planes to obtain the complex image
    	planes.push_back(padded);
    	planes.push_back(cv::Mat::zeros(padded.size(), CV_32F));
    	// prepare a complex image for performing the dft
    	cv::merge(planes, complexImage);
    	printf("complexImage types %d\n", complexImage.type());
    	// dft
    	cv::dft(complexImage, complexImage);		
    	// ????????
    	cv::putText(complexImage, watermarkText, point, cv::FONT_HERSHEY_DUPLEX, fontSize, scalar,2);
    	cv::flip(complexImage, complexImage, -1);
    	cv::putText(complexImage, watermarkText, point, cv::FONT_HERSHEY_DUPLEX, fontSize, scalar,2);
    	cv::flip(complexImage, complexImage, -1);
    	
    	planes.clear();
    }
    
    cv::Mat antitransformImage() 
    {
    	cv::Mat invDFT = cv::Mat();
    	cv::idft(complexImage, invDFT, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT, 0);
    	cv::Mat restoredImage = cv::Mat();
    	invDFT.convertTo(restoredImage, CV_8U);
    	planes.clear();
    	return restoredImage;
    }
    
    int main(int argc, char* argv[])
    {
        if (argc < 3)
        {
            printf("watermark enc/dec file_name\n");
        }
        else
        {
            if (strcmp(argv[1], "enc") == 0)
            {
                //load image
                Point point(50, 100);  
                Scalar scalar(0, 0, 0, 0); 
                printf("read file %s\n", argv[2]);
    
        		cv::Mat img1 = cv::imread(argv[2], cv::IMREAD_GRAYSCALE);
                transformImageWithText(img1, "shennug", point, 2.0, scalar);
                cv::Mat img2 = createOptimizedMagnitude(complexImage);
    
                cv::Mat img3 = antitransformImage();
    
                cv::namedWindow("Matrix1", cv::WINDOW_AUTOSIZE);
                cv::imshow("Matrix1", img1);
    
                cv::namedWindow("Matrix2", cv::WINDOW_AUTOSIZE);
                cv::imshow("Matrix2", img2);
                
                cv::namedWindow("Matrix3", cv::WINDOW_AUTOSIZE);
                cv::imshow("Matrix3", img3);
    
                cv::imwrite("1_orig.jpg", img1);
                cv::imwrite("1_watermark.jpg", img2);
                
    
                cv::waitKey(0);
                cv::destroyAllWindows();
            }
            if (strcmp(argv[1], "dec") == 0)
            {
                //load image
                Point point(50, 100);  
                Scalar scalar(0, 0, 0, 0); 
                printf("read file %s\n", argv[2]);
    
        		cv::Mat img1 = cv::imread(argv[2], cv::IMREAD_GRAYSCALE);
                transformImage(img1);
                cv::Mat img2 = createOptimizedMagnitude(complexImage);
    
                cv::Mat img3 = antitransformImage();
    
                cv::namedWindow("Matrix1", cv::WINDOW_AUTOSIZE);
                cv::imshow("Matrix1", img1);
    
                cv::namedWindow("Matrix2", cv::WINDOW_AUTOSIZE);
                cv::imshow("Matrix2", img2);
                cv::imwrite("1_decode.jpg", img2);
                
    
                cv::waitKey(0);
                cv::destroyAllWindows();     
            }
    
        }
    
        return 1;
    
    }
    展开全文
  • python 给图片添加隐藏水印 原理: 代码: 效果: python 将图片加密解密 原理 O代表原始图像,key代表密钥图像,c代表加密后图像 加解密原理: 原始图像与key图像进行异或操作 比如B通道的0,0点, D: ...

     

    目录

    python 将图片加密解密

    原理

    代码

    效果

    python 给图片添加隐藏水印

    原理:

    代码:

    效果:

     


    python 将图片加密解密

     

    原理

    O代表原始图像,key代表密钥图像,c代表加密后图像
    加解密原理: 
    原始图像与key图像进行异或操作
    比如B通道的0,0点,
    D: o为26          key为 67
    B: 00011010      01000011
    二者进行异或 0101 1001  89
    则 C 图 R通道就为 0,0点为  89
    
    
    解密原理(提取原始O):
    c图0,0点与 key图0,0点进行异或
    89              67
    01011001     01000011
    还原结果: 00011010  26   
    
    
    解密原理(提取key):
    c图0,0点与 O图0,0点进行异或
    89              26
    01011001     00011010
    还原结果: 01000011  67  

    代码

    #!usr/bin/env python
    #-*- coding:utf-8 -*-
    """
    @author:HUAWEI
    @file: imglock_11_18.py
    @time: 2020/11/18
    """
    """
    O代表原始图像,key代表密钥图像,c代表加密后图像
    加解密原理: 
    原始图像与key图像进行异或操作
    比如B通道的0,0点,
    D: o为26          key为 67
    B: 00011010      01000011
    二者进行异或 0101 1001  89
    则 C 图 R通道就为 0,0点为  89
    
    解密原理(提取原始O):
    c图0,0点与 key图0,0点进行异或
    89              67
    01011001     01000011
    还原结果: 00011010  26   
    
    解密原理(提取key):
    c图0,0点与 O图0,0点进行异或
    89              26
    01011001     00011010
    还原结果: 01000011  67  
    """
    
    # 我们开始编码
    import cv2
    import numpy as np
    
    #读取图像信息
    o = cv2.imread("kewayi.jpg")
    key = cv2.imread("test.jpg")
    
    osize = o.shape
    key = cv2.resize(key,(osize[0],osize[1]))
    
    def encrypt(o,k):
        return np.bitwise_xor(o,k)
    def zh_ch(string):
        return string.encode('gbk').decode(errors='ignore')
    
    #拆分bgr通道
    obgr = cv2.split(o)
    kbgr = cv2.split(key)
    cbgr = []
    #加密过程
    for i,v in enumerate(obgr):
        t=encrypt(v,kbgr[i])
        cbgr.append(t)
    
    c = cv2.merge(cbgr)
    cv2.imshow(zh_ch("加密:"),c)
    
    col =[]
    #解密过程
    for i,v in enumerate(cbgr):
        t=encrypt(v,kbgr[i])
        col.append(t)
    
    co = cv2.merge(col)
    cv2.imshow(zh_ch("原始:"),co)
    cv2.imshow("key",key)
    cv2.waitKey()
    cv2.destroyWindow()
    
    

    效果

     

     

    python 给图片添加隐藏水印

     

    原理:

    我们知道常见彩色图像是右R,G,B三通道合成的,而我们把某个通道拿出来,一个像素点如(0,0) 此时像素点数据为32,

    最低有效位概念就是说(lsb),32 转为二进制 00100000,我们取二进制的最低位,依次对每个像素点取值,我们就建立了最低有效位面

    最低有效位是影响图像显示最小,我们可以替换最低有效位从尔进行隐藏打码。

    代码:

    #!usr/bin/env python
    #-*- coding:utf-8 -*-
    """
    @author:HUAWEI
    @file: mark_11_19.py
    @time: 2020/11/19
    """
    
    
    import cv2
    import numpy as np
    
    def zh_ch(string):
        return string.encode('gbk').decode(errors='ignore')
    
    #为了操作方便我就只加灰度图了
    #R,G,B原理一样每个通道加一下
    #要加水印照片
    a = cv2.imread("kewayi.jpg",0)
    #隐藏水印照
    mark= cv2.imread("mark.jpg",0)
    cv2.imshow(zh_ch("mark"),mark)
    #将大于0转为 True
    t_mark = mark[::]>0
    #标记为1
    mark[t_mark] = 1
    #提取原始图像大小
    size = a.shape
    #生成提取矩阵
    t254 = np.ones(size,dtype=np.uint8)*254
    #获取原始图像高7位
    a7 = cv2.bitwise_and(a,t254)
    #将水印放入最低位
    e=cv2.bitwise_or(a7,mark)
    
    cv2.imshow(zh_ch("原始图像"),a)
    cv2.imshow(zh_ch("加水印图像"),e)
    
    
    ##########################
    #提取水印过程
    
    t1 = np.ones(size,dtype=np.uint8)*1
    wm = cv2.bitwise_and(e,t1)
    w = wm[:,:]>0
    wm[w]=255
    
    cv2.imshow(zh_ch("提取水印"),wm)
    
    cv2.waitKey()
    cv2.destroyWindow()
    

    效果:

    我们看第三张,肉眼基本看不出来加过水印

     

     

    展开全文
  • Flutter 在聊天页面背景添加水印。 网上很多文章要么都是在图片添加水印,要么给的例子都是全屏的水印,无法满足我先有的需求。 怎么办呢,自己怼一个好了。 思路:在页面里添加一个widget作为底层背景,在这个背景...
  • 1 概述 1.1 定义 在一些B/S结构的应用系统中,有很多页面是需要有水印的。常见的就是公文系统、合同系统等。大家常常关注的是网站图片增加水印,而很少关注页面水印。刚去Google了一圈,关于页面水印的文章的数量为...
  • 主要介绍了vue中使用带隐藏文本信息的图片、图片水印的方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
  • AndroidWM A lightweight android image watermark library that supports encrypted watermarks. 中文版本 Download Library Gradle: For androidWM supports the invisible digital watermarks (package ...
  • 信息隐藏水印.zip

    2020-05-10 17:34:53
    信息隐藏技术是多种学科理论与技术的综合,它隐藏了秘密信息的存在(与传统的密码技术有明显的区别),表面上看起来与一般的非保密信息没有两样,因而十分容易跳过攻击者的破解(与生物学上的保护色相似,巧妙地将...
  • 【图像隐藏】基于小波变换DWT图像水印嵌入提取含各类攻击matlab源码.md
  • 适宜新手使用 包含多种数字水印方法实现 内附电子教科书和课件
  • 这个是我自己手写的,当然也结合一些网络上内容,很好用!如果需要代码讲解部分,可以去我这里下载讲解文档,有疑问的地方可以留言进行交流
  • 学期末的信息隐藏课设做的简单的程序代码+报告,初学者可以借鉴使用,代码借鉴他人较多,比较完善,在报告内有详细分析,极易理解。
  • 近日,字节跳动自研的隐藏水印算法通过了数字媒体内容保护技术研究国家广播电视总局重点实验室(ChinaDRM实验室)的DRM技术与产品评估,为数据安全保护提供了新的思路和更有力的保障。 随着自媒体等互联网平台...
  • LSB图像信息隐藏,能够用 LSB 算法对图像进行信息隐藏能够用 LSB 提取算法提取隐藏进图像的信息
  • 信息隐藏技术—隐写术与数字水印PDF版 没有目录,而且有点模糊,但是可以看清
  • 破解不完全的MapXtreme Web地图中总是有个一个水印,比较讨厌。根据附件的说明可以轻松把水印隐藏,可以对应所有的版本。
  • 1 简介 基于LSB+DWT+DCT三种算法实现图像和音频水印嵌入提取。...该方法不但有效地无损伤隐藏了图像,同样还保证了隐藏图像的安全性,无损伤性。 1.2 小波变换算法 **2 基于DWT的音频水印算法**
  • 数字水印在DCT域的嵌入,使用matlab实现,信息隐藏
  • 前端明水印到隐水印你了解了吗

    千次阅读 2022-01-23 10:51:52
    水印的目的是为了防止信息泄漏,保护版权,在很多网站里都有用到了水印水印真的只是看到的这么简单吗?
  • 信息隐藏与数字水印实验源代码,lsb,dct,dwt等算法
  • 用matlab实现数字水印程序,嵌入的水印为高斯水印,可对比显示水印信息、原图、算子的边缘图和嵌入水印后的图像
  • 一种基于LSB算法的,用C语言实现的数字水印方法,简单易懂。
  • pip install blind-watermarkFor the current developer version:git clone git@github.com:guofei9987/blind_watermark.gitcd blind_watermarkpip install .嵌入水印from blind_watermark import WaterMarkbwm1 = ...
  • 图像中不可见的水印

    2020-12-06 05:40:49
    网站上的每个图像都有两次水印:一次水印位于右下角,不透明度为50%(距离边缘5px),另一次水印位于整个图像上,不透明度为1%(使用“缩放”,将水印缩放到整个图像)。你能找出第二个低不透明度的水印形状是什么吗...
  • 信息隐藏与数字水印实验教程
  • 信息隐藏与数字水印技术

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,351
精华内容 4,140
关键字:

隐藏水印

友情链接: Using.rar