数字图像水印处理
一个处理数字图像水印的系统,该系统可以实现添加可见水印,添加不可见水印,识别水印,提取可见水印,提取不可见水印,打开、保存图片等功能。(这里的水印识别指的是识别自己添加的水印)
添加提取可见水印
1点击添加图片,即打开原图像显示在左侧图片显示区域
2点击添加可见水印按钮(可根据用户自定义拖动水印图片操作嵌入到原图像的相应位置中)
3点击合成图片按钮(这时会将嵌入了水印的图片保存下来)
4 点击提取可见水印按钮 ,即可以将可见水印给提取出来,保存为你选择的图片格式到你选择的图片文件位置处。
添加提取不可见水印
1点击添加图片,即打开原图像显示在左侧图片显示区域
2点击添加不可见水印按钮(可根据用户自定义拖动水印图片操作嵌入到原图像的相应位置中)
3点击合成图片按钮(这时会将嵌入了水印的图片保存下来)
4 点击提取不可见水印按钮 ,即可以将可见水印给提取出来,保存为你选择的图片格式到你选择的图片文件位置处。
基础知识介绍:
水印: 嵌在原图片上的,可见或者不可见的图像或者序列码等信息,多用于版权声明
可见图像数字水印
可见图像数字水印是可以看见的数字水印,就是将数字水印直接嵌入或覆盖在图像上。可见图像数字水印分为透明和不透明两种:
(1)不透明数字水印的目的是在图像中具有视觉突出效果,形成鲜明的标识,用于防止图像被其它非授权的商业用途的使用。
(2)透明数字水印的特点是在图像中不太醒目,在保证图像质量的前提下,尽量使水印标识难以剔除,进而保护文件的所有权。
不可见图像数字水印
不可见图像数字水印是不可以看见的数字水印,该数字水印一般用于嵌入图像,嵌入文字,以及规则的或不规则的序列码,为了保护作者的作品版权。
数字水印评价标准
评价水印嵌入后对媒体产品的影响程度,除了利用感知系统(人眼或人耳)定性评价以外,还可以采用定量的评价标准。通常对含水印的数字作品进行定量评价的标准有:信噪比(Signal Noise Rate,SNR),峰值信噪比(Peak Signal Noise Rate,PSNR)和归一化相关系数(Normalized Correction)
声音频域: 一般分为高中低频,如女声高频占比较大
图像频域: 一般分为高中低频,低频表示轮廓信息,高频表示细节信息 高频越多则细节越丰富
DFT 离散傅里叶变换: 将声音/图像 按频率分不同的组 取离散点(像素点)
DCT 离散余弦变换
DCT(Discrete Cosine Transform) 离散余弦变换由N.Ahmed等人在1974年提出。它是一种正交变换的方法,是一种与傅立叶变换紧密相关的数学运算。在傅立叶级数展开式中,如果被展开的函数是实偶函数,那么其傅立叶级数中只包含余弦项(只取离散傅里叶变换的实数部分,不取复数部分),将其离散化可导出离散余弦变换。
比DFT节省计算量,可以对重要信息进行整合,因此经常用来进行数字图像水印的处理,DCT水印技术指的是先对图像进行离散余弦变换,然后对变换域的系数嵌入水印,最后再进行DCT逆变换得到嵌入水印后的图像
JPEG也是用的DCT进行图像的压缩
jpeg压缩基本原理
0 RGB->YUV
1 使用FDCT将空间域的像素点转化为频率域的系数 左上角是低频区域(轮廓),为直流系数,右下角是高频区域(细节),为交流区域 (空间域转频域,将重要信息整合)
2 量化 针对Y分量进行细量化,UI分量进行粗量化 (JPEG的有损压缩,损的是量化过程中的高频部分)
3 编码 行程编码、Z排序、Huffman编码
二维DCT变换原理
M×N矩阵的二维离散余弦变换定义为:
其中,f(m, n)是M×N矩阵中坐标为(m, n)元素的原始值,F(u, v)是经离散余弦变换后对应值。
对应的DCT逆变换定义为:
其中:
FDCT 快速离散余弦变换
如果直接进行二维图像的DCT变换,工作量非常大(以8*8的图像分块为例,进行DCT和IDCT需求1024次乘法和896次加法)。为了加快变换的速度,人们根据DCT变换的对称性和正交性,提出了快速DCT变换算法(FDCT)
技术实现
可见水印实现
总览:
// 可见水印嵌入:
// 0 取原图和水印的像素放到3*width*height的一维数组中
// 1 将一维数组像素转为三维数组 (RGB)
// 2 原图的三维像素 修改为水印的三维像素 一维维的改(这里只处理水印图大小的区域)
// 3 三维数组再转回一维数组像素 再生成output图
// 可见水印提取:
// 根据选定的区域,将该区域的像素矩阵取出,保存为新的图片
通过二维图像得到的一维数组getPixels中,图像文件每个坐标点分别由红、绿、蓝3个像素构成,即getPixels数组的第1(红)、2(绿)、3(蓝)个元素合成了第1个坐标点的颜色,4、5、6个元素合成了第2个坐标点的颜色。将getPixels数组中每隔3个元素抽取一个得到对应于二维图像文件的R(红)、G(绿)、B(蓝)3个二维图像像素矩阵,其相互关系如图2.1。矩阵中每个像素的取值范围为0-255。二维数组行和列坐标的转换点是
通过原图像文件宽oWidth,高oHeight数值得到的。最后通过3个二维矩阵合成1个代表图像文件的三维像素矩阵。在MathTool类中定义了一维数组转换为三维数组的方法
可见水印的嵌入
将得到的水印的三维像素矩阵,根据你操作的水印图像位置,将水印的像素矩阵替换相应位置的被加入水印的图片的像素矩阵。
可见水印的提取:
根据选定的位置,将该位置的像素矩阵取出,保存为新的水印图片。
不可见水印实现
总览://不可见水印嵌入:1 提取原始图像的一个分量(如rPixels)和二值水印图像的像素wPixels2 对原始图像rPixels进行8*8分块,然后进行FDCT变换,得到dblk[8][8]3 根据水印的值是0/255 在dblk[8][8]中频(低频原图影响大)位置嵌入水印信息(如果wPixels是0则对减一个系数d,否则加上系数d)4 对dblk[8][8]执行IFDCT(离散余弦变换逆变换) 5 将逆变换完的dblk[8][8]区域替换相应的rPixels的8*8分块 最终生成带不可见水印的图// 不可见水印提取编程思路1 获得原始图像的r层分量(oRPixeles)和嵌入了水印的图像的r层分量(mRPixels)2 oRPixeles和mRPixeles进行8*8分块,并进行快速DCT变换,得odblk[8][8]和mdblk[8][8]3 比较odblk[8][8]和mdblk[8][8]嵌入水印的5个位置系数大小,如果mdblk大则水印信息为255,相反为0 存放到二维数组中result[wWidth][wHeight]4 将result[wWidth][wHeight]生成水印图像
完善项目也上传到了GitHub上,可以参考: 5ingwings/DIWaterMark
参考: 《图像数字水印的JAVA实现》