python环境下的遥感图像dct水印插入实现


毕设在做在Python环境下的遥感图像水印算法 最近看了挺多博客 下面是自己整理的 有瑕疵的话请大神指正 刚开始学 希望大家多交流
我的水印用的是灰度图像 但是我处理以后只有0和255两个颜色 238*238
我的遥感图像是6通道8431*7646

import gdal
import numpyfrom skimage
import data,img_as_float,img_as_ubyte
import cv2
filename = 'f:/bs/band_1.tif' #打开原图片,我的遥感图像已经分好了波段 进行单波段的水印嵌入
dataset = gdal.Open(filename) #打开文件
im_width = dataset.RasterXSize #获取长
im_height = dataset.RasterYSize #获取宽
im_bands = dataset.RasterCount #获取通道数
im_data = dataset.ReadAsArray(0,0,im_width,im_height) #将转化为数组 取长宽最大的16的倍数
waterdata_3 = gdal.Open("f:/bs/water_wh_1_255.bmp") #打开水印图片
im_water_data = waterdata_3.ReadAsArray(0,0,238,238) #将水印图片转化为数组
M = 3808 #处理的图片必须为一个正方形 我将水印嵌入图像中部的3808*3808的正方形区域
N = 238 #分成238块16*16的小正方形
K = 16 #分成16*16
I = numpy.zeros([M,M])
J = numpy.zeros([N,N])I = im_data[2000:,2000:]
J = im_water_dataBLOCK = numpy.zeros([K,K]) #处理数组信息暂存
for p in range(238):
for q in range(238):
x = p*K
y = q*K
BLOCK = I[x:x+K,y:y+K]
BLOCK = img_as_float(BLOCK) #由于cv2包的dct函数处理的数据类型是float 所以先进行格式转换
BLOCK = cv2.dct(BLOCK)
if J[p][q]==0:
a=-1
else:
a=1
BLOCK = BLOCK*(1+a*0.0075) #0.0075是插入水印的影响参数 越大水印在图片中越清晰
BLOCK = cv2.idct(BLOCK) #dct处理
for ii in range(K): #转换会unit8格式,float在python中是在-1和1之间
for jj in range(K):
if BLOCK[ii][jj]>1:
BLOCK[ii][jj]=1
BLOCK = img_as_ubyte(BLOCK) #转换回unit8
I[x:x+K,y:y+K] = BLOCKim_data[2000:,2000:]=I
format = "GTiff"
driver = gdal.GetDriverByName(format)
tods = driver.Create("f:/bs/band_11_255_0.0075.tif",im_width,im_height,1,options=["INTERLEAVE = PIXEL"])
tods.WriteRaster(0,0,im_width,im_height,im_data.tostring(),im_width,im_height,band_list=[1])

原图:

python环境下的遥感图像dct水印插入实现_第1张图片
插入水印后:
python环境下的遥感图像dct水印插入实现_第2张图片
水印图片:

python环境下的遥感图像dct水印插入实现_第3张图片

你可能感兴趣的:(pytho,遥)