目录前言论文创新点DCTDWTDWT 的优点分析代码getData原图水印图片代码range()np.empty()运行结果代码解析步骤提取水印
代码链接
https://github.com/diptamath/DWT-DCT-Digital-Image-Watermarking.git
前言
这篇论文是在2007年发表的,有些时间了,但是作为数字水印发展较好的时代,通过 这篇文章可以学习DCT,DWT在数字水印技术的应用,
论文创新点
结合小波变换和离散余弦变换的数字图像水印 本文将描述一种基于两种变换相结合的数字图像水印算法;DWT和DCT。水印是通过改变仔细选择的小波变换子带的小波系数,然后在选择的子带上应用离散余弦变换来实现的。
DCT
离散余弦变换:离散余弦变换是一种将信号转换成基本频率分量的技术[9]。它将图像表示为不同幅度和频率的正弦曲线的总和。对于输入图像x,根据等式计算变换输出图像y的离散余弦变换系数。1如下所示。在等式中,x是具有N×M个像素的输入图像,x(m,N)是图像的行M和列N中的像素的强度,y(u,v)是离散余弦变换矩阵的行u和列v中的离散余弦变换系数。
上图是x与y的关系。 这篇文章用到了基于块的离散余弦变换,现将原图分割成不重叠的块,然后对每个块做离散余弦变换,这导致给出三个频率子带:低频子带、中频子带和高频子带。
那怎么让图片的可见性不受影响呢? 刚刚我们说到图像可以分为三个频率子带:低频子带、中频子带和高频子带,大部分信号是位于位于低频子带,其中包含图像最重要的视觉部分。第二个,图像的高频成分通常通过压缩和噪声攻击来去除。因此,通过修改****中频子带的系数来嵌入水印,使得图像的可见性不会受到影响,并且水印不会通过压缩被移除
DWT
小波变换:小波是一种特殊的函数,其形式类似于傅立叶分析中的正弦和余弦,被用作表示信号的基本函数。对于二维图像,应用离散小波变换对应于通过二维滤波器在每个维度上处理图像。滤波器将输入图像分成四个不重叠的多分辨率子带LL1、LH1、HL1和HH1。子带LL1表示粗略尺度的小波变换系数,而子带LH1、HL1和HH1表示小波变换系数的精细尺度。为了获得下一个更粗尺度的小波系数,子带LL1被进一步处理,直到达到某个最终尺度N。当到达N时,我们将有3N+1个子带,由多分辨率子带LLN和LHx、HLx和HHx组成,其中x的范围从1到N
DWT 的优点
1、由于其良好的空间频率定位特性,小波变换非常适合于识别宿主图像中可以有效嵌入水印的区域 2、
分析代码
原图 ![在这里插入图片描述](https://img-blog.csdnimg.cn/2021031012513186.png)
img=Image.open('lena.jpg')
#将模式转变为L就是灰度图像
img = img.convert('L')
print(img)
Image._show(img)
![在这里插入图片描述](https://img-blog.csdnimg.cn/202103101250518.png)
getData
img=Image.open('lena.jpg')
print(img)
str=img.getdata()
print(str[1])
img = img.convert('L')
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311110729676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxODIxMDY3,size_16,color_FFFFFF,t_70)
原图
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311111020808.png)
水印图片
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311111005474.png)
代码
range()
for x in range(0, 7, 8):print(x)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311143412174.png)
for x in range(0, 16, 8):print(x)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311143328633.png)
for x in range(0, 17, 8):print(x)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210311143306486.png)
np.empty()
all_subdct = np.empty((5, 5))
print(all_subdct)
可以看出默认类型是浮点类型numpy.float64
import numpy as np
import pywt
import os
from PIL import Image
import cv2
from scipy.fftpack import dct
from scipy.fftpack import idct# img11=Image.open('F:\girl.jpg')
dir=os.getcwd()
image = 'lena.jpg'
watermark = 'boy.png'# 返回灰度图片的uint值
def convert_image(image_name, size):# 将图片转为灰度图像img = Image.open(image_name).resize((size, size), 1)img = img.convert('L')# img.save('./dataset/' + image_name)image_array = np.array(img.getdata(), dtype=np.float).reshape((size, size))print (image_array[0][0])print (image_array[10][10])return image_array
# 多尺度小波变换
def process_coefficients(imArray, model, level):coeffs=pywt.wavedec2(data = imArray, wavelet = model, level = level)# print coeffs[0].__len__()coeffs_H=list(coeffs) return coeffs_Hdef embed_mod2(coeff_image, coeff_watermark, offset=0):for i in xrange(coeff_watermark.__len__()):for j in xrange(coeff_watermark[i].__len__()):coeff_image[i*2+offset][j*2+offset] = coeff_watermark[i][j]return coeff_imagedef embed_mod4(coeff_image, coeff_watermark):for i in range(coeff_watermark.__len__()):for j in range(coeff_watermark[i].__len__()):coeff_image[i*4][j*4] = coeff_watermark[i][j]return coeff_imagedef embed_watermark(watermark_array, orig_image):# 求得水印数组的大小watermark_array_size = len(watermark_array[0])#将多维数组降为一维数组watermark_flat = watermark_array.ravel()ind = 0for x in range (0, orig_image.__len__(), 8):for y in range (0, orig_image.__len__(), 8):if ind |