⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wvlttrans.h

📁 一种图像水印加密算法 该算法抗攻击性强 安全性高 可以直接运行
💻 H
字号:
// WvltTrans.h: interface for the CWvltTrans class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_WVLTTRANS_H__ADB84B9A_B6D4_4770_B795_CCC4F2554D50__INCLUDED_)
#define AFX_WVLTTRANS_H__ADB84B9A_B6D4_4770_B795_CCC4F2554D50__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "stdafx.h"
#include <stdlib.h>
#include <fstream>
#include "math.h"
#include <map>
#include <bitset>

using namespace std;


#define PIC_NUM 301//目录下最大文件数


class CWvltTrans  
{
public:
	
	CWvltTrans();
	virtual ~CWvltTrans();

public:	
		
	CString picTitle[PIC_NUM]; //图像名数组,不包括扩展名	
	
public://图像存取和文件读写部分
	
    void GrayToBinary(BYTE* pData);
	void BYTEToBIT(BYTE* pData,bitset<8*sizeof(unsigned char)>* BinData);//将图像数据转化为二进制
	void BITToBYTE(BYTE* pData,int* BinData);//将提取出的二值序列转化成BYTE型	

	float abs(float a);
	bool WriteFile(CString , float**,int Height, int Width);
	bool WriteFile(CString filepath, BYTE* Data,int size);
	bool WriteFileFloat(CString filepath, float* Data,int len);
    bool WriteFileInt(CString filepath, int* Data,int len);
	bool ReadFile(CString , float**,int Height, int Width);//读取保存的选定系数
	
	void sort(float &a,float &b,float &c,float *sortresult);//对三个数由大到小排序并返回中间值
    bool FileSaveAs(CString Path,BITMAPFILEHEADER bmfh,BITMAPINFOHEADER bmih,BYTE* RGBData,unsigned long size);//将数据保存为BMP图像
	void YUVToRGB(float** YData, float** UData, float** VData,unsigned char* RGBData, int Height, int Width,int Align);
    bool SaveDistillMark(CString Path,LPBITMAPFILEHEADER lpbfh,LPBITMAPINFOHEADER lpbih,BYTE* RGBData,unsigned long size) ;
	
	void RGBToYUV(unsigned char* lpData,float** YData,float** UData, float** VData);	
	BOOL ReadBitmap(LPCTSTR lpszPathName, unsigned char *& buffer);
	int statics(CString strDirect);//计算strDirect中图像数量,并把文件名放入filename数组
	
	

public://小波变换部分
	//图像小波变换的逆变换
	void DWTi_Once(float** spData, float** spTransData0, float** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius);	
	void DWT_Inverse(int nHeight, int nWidth, int nLayer,float **CoeffForIDWT,float **CoeffAfterIDWT);//n层小波逆变换
	//一层以上小波变换
	void DWT_nLayers(float** spOriginData, float** spTransData0, float** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius);
	//一层小波变换
	void DWT_Once(float** spOriginData, float** spTransData0, float** spTransData1, int nHeight, int nHeight_H, int nWidth, int nWidth_H, int layer, float fRadius);
	//竖直方向的小波变换
	void Vert_Transform(float** spOriginData, float** spTransData1, int nHeight_H, int nWidth, float fRadius);
	//水平方向的小波变换
	void Hori_Transform(float** spOriginData, float** spTransData0, int nHeight, int nWidth_H, float fRadius);
    
public://水印加载与检测部分
	void CoeffPartition();//将转换后的系数分割为各子带系数(小波变换层数不同分割的子带个数也不同)
	void allocBuffers();//分配存放各子带系数及水印有关数据的缓冲区	
	void freeBuffers();

	BOOL ReadBMPMarkBinary(CString BMPFilename);//读二值水印图像数据到缓冲区
	BOOL ReadBMPMark(CString BMPFilename);//读取灰度水印图像到缓冲区
	
	
	//基于Logistic映射的水印生成,生成二值水印序列
	void LogisticWaterMark();
	void changeMarkValue();//将水印值域从{0,1}改为{-1,1}	    

	
	//求子带系数的最大值,子带大小与原始图像相同
	float MaxvalOfBlock(float** Block);
	void ChooseCoeffByLocalThreshold();//根据各子带阈值选择加载水印的系数
	void ChooseCoeffByWholeThreshold();//根据全局阈值选择待嵌入水印的系数
	void ChooseCoeffByQantity();//抖动方式选择待嵌入水印的系数
	void ChooseCoeffBySort();//通过对原始图像三层小波变换后的系数进行排序,找出MarkLength个系数进行嵌入
	
	//加载二值序列水印(非自适应乘性嵌入方式)
	void LoadWaterMark();
	void LoadWaterMarkOne(CString CurrentFile);
	//加载二值序列水印(基于量化嵌入方式)
	void LoadWaterMarkByQuantity();	
	void loadWaterMarkToLib(CString bmpPath);//为指定目录下的所有bmp图像加载水印
	
	//检测二值水印,盲检测(不需原始载体)
    bool CheckWaterMark(CString CheckPath);
	bool CheckWaterMarkToLib(CString CheckPath);//对指定目录中的所有图像进行检测
	bool DistillWaterMark(CString CheckPath);//提取单个图像的水印
	bool DistillWaterMarkToLib(CString CheckPath);//提取指定目录下所有图像的水印

public://系统评估部分	
	float psnr(float** p1, float** p2, int height,int width);
	float psnrForOne(CString Sourcefile,CString Thansfile);   
    //bool WriteResultToFile(CString TextFilePath,CString FileNameForDistill);//将PSNR与NC写到TextFilePath指定的文件中
	bool WriteResultToFile(CString TextFilePath,float fpsnr,float fnc,CString FileName);//将PSNR与NC写到TextFilePath指定的文件中
	float nc(BYTE* p1, BYTE* p2);
	float sim(int* originMark, int* distilledMark);


};

	

#endif // !defined(AFX_WVLTTRANS_H__ADB84B9A_B6D4_4770_B795_CCC4F2554D50__INCLUDED_)




















































































⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -