专栏首页matlab爱好者Matlab图片水印技术

Matlab图片水印技术

图片水印技术在现代计算机技术中具有越来越重要的作用,今天,我就给大家简单介绍图片水印技术的原理。

认识像素的同学都知道,无论是彩色图片还是灰度图,都是由0-255之间的数字矩阵组成。当然,彩色图片是三维矩阵,由三个颜色通道组成。灰度图是二维矩阵。

下面的两个图中,上面的一个是将要加水印的图像,下面的就是要加的水印。

首先,水印的原理就是将水印上的像素点乘一个参数。然后与原有的图像做加法运算。得到的新图就是加上水印以后的图。由于这个参数非常小,凭借肉眼是无法分辨图像水印前后的区别的。

例如:

原图像A=[145,132,134;121,24,112;123,234,123]。要加的水印B=[134,123,145;123,121,112;124,234,236]。水印参数为Alpha=0.02。那么结果就是A1=A+B*Alpha。如果k值太大了。最终图片会与水印以前的图片有很大差距。下面给大家展示一下Alpha值过大的后果

我选取的Alpha=0.5。正常的k应该选择0.01或者0.02。

Matlab如何实现水印:

最简单的读取水印图片。大家记住这些变量的名称就好了。之后会用到

clear;clc

size=512;
block=8;
blockno=size/block;
LENGTH=size*size/64; 
Alpha1=0.5;  Alpha2=0.4;
T1=100; 
I=zeros(size,size); 
D=zeros(size,size); 
BW=zeros(size,size); 
block_dct1=zeros(block,block);

i=imread('watermark64by64.png');
mark=reshape(i,1,LENGTH);
figure;imshow(i);title('水印');
%subplot(3,2,1);plot(mark);title('水印'); 
%显示原图
figure;I=imread('lena512512.jpg');   
I0=I;
imshow(I);title('原始图像');

接下来,我们会看到水印的核心代码。也就是嵌入水印的过程。不多说了。先看代码:

k=1;
for m=1:blockno
for n=1:blockno
  x=(m-1)*block+1;   y=(n-1)*block+1;
  block_dct1=I(x:x+block-1,y:y+block-1);
  block_dct1=dct2(block_dct1);
BW_8_8=BW(x:x+block-1,y:y+block-1);

block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); 
block_dct1=idct2(block_dct1);
D(x:x+block-1,y:y+block-1)=block_dct1; 
  k=k+1;
end

由于图像的面积远远大于水印的面积,所以我们不得不做一些分块处理的操作。用两层for 循环可以嵌入水印。

完整代码以及图片:请回复“水印”

参考文献来源:https://993878382.qzone.qq.com/?_t_=0.37524410726698343

代码来源:http://993878382.qzone.qq.com -browser

本文分享自微信公众号 - matlab爱好者(matlabaihaozhe),作者:南海一号

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • matlab图像(亮度变换与线性滤波)

    如今,很多人都喜欢摄影。当然也有很多人喜欢对图像进行处理,使图像具有别样的味道。其中用到了很多知识,那现在我就向大家介绍一下简单的图像数字处理。

    艾木樨
  • 对matlab来说,“is”不仅仅是个英文单词!

    为什么要介绍“is”系列函数呢?从字面意思上很好理解,判断某个量是否为某种状态,若是返回真,若否则返回假;在编程过程中难免会遇到条件选择(if语句)的情况,条件...

    艾木樨
  • matlab符号计算(一)

    计算一般可分为解析计算和数值计算,解析计算是连续的求解过程,而数值计算则是离散的求解过程。在matlab中,原则上只要数学上能解析计算的,采用matlab符号计...

    艾木樨
  • OC - Block 详解

    通过 Clang 将以下 Block 代码转换为 C++ 代码,来分析 Block 的底层实现。

    师大小海腾
  • iOS Block的本质(一)

    用户1941540
  • Linux文件系统——全方位掌握

    文件系统的特性 磁盘分区完毕后需要进行格式化,操作系统才能使用这个分区。 不同操作系统能够使用的文件系统是不同的,例如:Windows98以前使用FAT/F...

    大闲人柴毛毛
  • Linux文件系统详解

    Linux上的文件系统一般来说就是EXT2或EXT3,但这篇文章并不准备一上来就直接讲它们,而希望结合Linux操作系统并从文件系统建立的基础——硬盘开始,一步...

    于小勇
  • 看完这篇,你应该就知道什么是Linux了~

    Linux 中的各种事物比如像文档、目录(Mac OS X 和 Windows 系统下称之为文件夹)、键盘、监视器、硬盘、可移动媒体设备、打印机、调制解调器、虚...

    用户6543014
  • 定时取指定进程内存脚本

    格式(利用了awk给外部变量赋值,请参考博文http://blog.chinaunix.net/uid-20682147-id-3024853.html):

    一见
  • 用作用域插槽和偏函数编写高复用 Vue 组件

    作用域插槽是 Vue 2.1 之后引入的一种组件复用工具。其原理类似 React 里面的 Render Props 组件设计模式。如果你使用过 Render P...

    FairyEver

扫码关注云+社区

领取腾讯云代金券