DCT加密(Java((伪

本文探讨了使用MATLAB进行图像加密与解密的过程,包括输入图像、密钥处理、输出图像的操作,以及如何实现灰度值的改变来达到加密的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</pre>没弄懂原理写个鬼代码啊(摔<p></p><p>还是觉得MATLAB超级不好用....要不是库多hhhhh</p><p>还是去看原理去了(逃</p><p></p><p>这是加密代码</p><p></p><pre name="code" class="java">package wjoker;

import java.awt.Color;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class jiami {

	static String host = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\6_1.jpg";
	static String key = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\key.jpg";
	static String output = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\out1.jpg";
	//static String output2 = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\out2.jpg";
	static String readImageFormat = "jpg";
	static String writeImageFormat = "jpg";
	static int a_x = 0;
	static int a_y = 0;
	static int b_x = 7;
	static int b_y = 0;
	static int weight = 400;
	static int hight = 560;
	static int block = 8;
	static int weight_size = weight/block;
	static int hight_size = hight/block;
	
	public static void main(String[] args) {
		BufferedImage bi_host = null;
		BufferedImage bi_key = null;
		BufferedImage bi_output = null;
		
		bi_host = input_img(host, readImageFormat);
		bi_key = input_img_min(key, readImageFormat);
		bi_output = bi_host;
		
		System.out.println((bi_host == null));
		System.out.println((bi_output == null));
		
		change(bi_host, bi_key, bi_output);
		
		output_img(bi_output, writeImageFormat, output);
		
	}
	
	
	
	public static BufferedImage input_img(String input_File,String readImageFormat){
		FileInputStream fis = null;
		ImageInputStream iss = null;
		BufferedImage bi = null;
		
		try {
			fis = new FileInputStream(input_File);
			Iterator it = ImageIO.getImageReadersByFormatName(readImageFormat);
			ImageReader reader = (ImageReader) it.next();
			
			try {
				iss = ImageIO.createImageInputStream(fis);
				reader.setInput(iss,true);
				ImageReadParam param = reader.getDefaultReadParam();
				Rectangle rect = new Rectangle(0,0,400,560);
			
				param.setSourceRegion(rect);
				bi = reader.read(0,param);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bi;
		
	}
	
	public static BufferedImage input_img_min(String input_File,String readImageFormat){
		FileInputStream fis = null;
		ImageInputStream iss = null;
		BufferedImage bi = null;
		
		try {
			fis = new FileInputStream(input_File);
			Iterator it = ImageIO.getImageReadersByFormatName(readImageFormat);
			ImageReader reader = (ImageReader) it.next();
			
			try {
				iss = ImageIO.createImageInputStream(fis);
				reader.setInput(iss,true);
				ImageReadParam param = reader.getDefaultReadParam();
				Rectangle rect = new Rectangle(0,0,100,140);
			
				param.setSourceRegion(rect);
				bi = reader.read(0,param);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bi;
		
	}
	
	public static void output_img(BufferedImage bi,String writeImageFormat,String output_File){
		try {
			ImageIO.write(bi, writeImageFormat, new File(output_File));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static BufferedImage change(BufferedImage bi_host,BufferedImage bi_key,BufferedImage bi_output){
		
		int i,j;
		
		
		int rgb_a,rgb_b,rgb_key;
		boolean flag;
		
		
		
		for(i=0;i<weight_size;i++){
			for(j=0;j<hight_size;j++){
				rgb_a = getGrey(bi_host.getRGB(i*block+a_x, j*block+a_y));
				rgb_b = getGrey(bi_host.getRGB(i*block+b_x, j*block+b_y));
				rgb_key = getGrey(bi_key.getRGB(i, j));
				
				if(rgb_a>rgb_b)//key = 0
					flag = true;
				else //key = 256
					flag = false;
				
				if(rgb_key > 0){
					if(flag){
						int tmp = (rgb_a+rgb_b)/2;
						rgb_a = tmp-1;
						rgb_b = tmp+1;
					}
				} else {
					if(!flag){
						int tmp = (rgb_a+rgb_b)/2;
						rgb_a = tmp+1;
						rgb_b = tmp-1;
					}
				}
				
				bi_output.setRGB(i*block+a_x, j*block+a_y, new Color(rgb_a,rgb_a,rgb_a).getRGB());
				bi_output.setRGB(i*block+b_x, j*block+b_y, new Color(rgb_b,rgb_b,rgb_b).getRGB());
			}
		}
		
		return bi_output;
	}

	public static int getGrey(int rgb){
		int r = (rgb >> 16) & 0xff;//取出次高位(16-23)红色分量的信息
        int g = (rgb >> 8) & 0xff;//取出中位(8-15)绿色分量的信息
        int b = rgb & 0xff;//取出低位(0-7)蓝色分量的信息
        return (r+g+b)/3;
	}
	
}

这是解密代码

package wjoker;

import java.awt.Color;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;

public class jiemi {
	static String host = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\out1.jpg";
	static String key = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\key.jpg";
	//static String output = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\out1.jpg";
	static String output = "H:\\Workspaces\\MyEclipse 2015 CI\\DCT\\src\\out2.jpg";
	static String readImageFormat = "jpg";
	static String writeImageFormat = "jpg";
	static int a_x = 0;
	static int a_y = 0;
	static int b_x = 7;
	static int b_y = 0;
	static int weight = 400;
	static int hight = 560;
	static int block = 8;
	static int weight_size = weight/block;
	static int hight_size = hight/block;
	
	public static void main(String[] args) {
		BufferedImage bi_host = null;
		BufferedImage bi_key = null;
		BufferedImage bi_output = null;
		

		bi_host = input_img(host, readImageFormat);
		bi_key  = input_img_min(key, readImageFormat);
		bi_output = bi_key;
		
		
		output_img(bi_output, writeImageFormat, output);
	}
	
	
	
	public static BufferedImage input_img(String input_File,String readImageFormat){
		FileInputStream fis = null;
		ImageInputStream iss = null;
		BufferedImage bi = null;
		
		try {
			fis = new FileInputStream(input_File);
			Iterator it = ImageIO.getImageReadersByFormatName(readImageFormat);
			ImageReader reader = (ImageReader) it.next();
			
			try {
				iss = ImageIO.createImageInputStream(fis);
				reader.setInput(iss,true);
				ImageReadParam param = reader.getDefaultReadParam();
				Rectangle rect = new Rectangle(0,0,400,560);
			
				param.setSourceRegion(rect);
				bi = reader.read(0,param);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bi;
		
	}
	
	public static BufferedImage input_img_min(String input_File,String readImageFormat){
		FileInputStream fis = null;
		ImageInputStream iss = null;
		BufferedImage bi = null;
		
		try {
			fis = new FileInputStream(input_File);
			Iterator it = ImageIO.getImageReadersByFormatName(readImageFormat);
			ImageReader reader = (ImageReader) it.next();
			
			try {
				iss = ImageIO.createImageInputStream(fis);
				reader.setInput(iss,true);
				ImageReadParam param = reader.getDefaultReadParam();
				Rectangle rect = new Rectangle(0,0,100,140);
			
				param.setSourceRegion(rect);
				bi = reader.read(0,param);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return bi;
		
	}
	
	
	public static void output_img(BufferedImage bi,String writeImageFormat,String output_File){
		try {
			ImageIO.write(bi, writeImageFormat, new File(output_File));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static int getGrey(int rgb){
		int r = (rgb >> 16) & 0xff;//取出次高位(16-23)红色分量的信息
        int g = (rgb >> 8) & 0xff;//取出中位(8-15)绿色分量的信息
        int b = rgb & 0xff;//取出低位(0-7)蓝色分量的信息
        return (r+g+b)/3;
	}
	
	public static void change(BufferedImage bi_host,BufferedImage bi_output){
		int i,j;
		int rgb_a,rgb_b;
		boolean flag;
		
		for(i=0;i<weight_size;i++){
			for(j=0;j<hight_size;j++){
				rgb_a = getGrey(bi_host.getRGB(i*block+a_x, j*block+a_y));
				rgb_b = getGrey(bi_host.getRGB(i*block+b_x, j*block+b_y));
				if(rgb_a>rgb_b)
					bi_output.setRGB(i, j, new Color(0,0,0).getRGB());
				else 
					bi_output.setRGB(i, j, new Color(255,255,255).getRGB());
			}
		}
		
	}
	
}

还是那个坑爹的绝对路径烦死爹了,

好了,荆轲刺秦王.

<think>好的,我现在需要帮助用户了解DCT加密解密的方法和实现示例。首先,用户提到的DCT信息提取是嵌入的逆过程,这涉及到分块、DCT变换、提取规则等步骤。我需要先回顾DCT在数字水印中的应用,确保理解正确。 用户可能需要具体的步骤和代码示例。DCT本身是变换方法,加密可能指水印信息的嵌入和提取过程。需要区分加密和水印嵌入的区别,但根据引用[^1],用户可能将水印嵌入视为加密,提取视为解密。 接下来,我应该分步骤解释DCT用于数字水印的流程,包括嵌入和提取。需要确保使用正确的数学公式,比如DCT变换公式,以及嵌入位置的选取,比如低频、中频或高频系数。同时,嵌入规则可能需要量化或替换系数,这里可能需要示例说明。 然后,代码实现部分,用户可能需要Python示例。考虑使用numpy和scipy进行DCT变换,但注意scipy的DCT默认是类型2,并且可能不归一化。需要正确分块处理图像,嵌入水印信息到特定系数,然后进行逆变换。提取部分则需要从修改后的系数中提取信息。 需要注意的问题包括:分块大小(8x8),嵌入强度的选择(alpha参数),如何将水印信息二值化,以及嵌入位置的选择(比如中频系数)。此外,鲁棒性和不可见性的平衡也很重要,可能需要调整alpha值。 最后,生成相关问题,覆盖DCT优缺点、提高鲁棒性的方法、与DFT/DWT的比较,以及处理彩色图像的方法。这些有助于用户深入理解。 现在,我需要组织这些思路,确保步骤清晰,代码正确,并引用提供的资料。同时检查LaTeX格式是否符合要求,行内公式用$...$,独立公式用$$...$$,并正确添加引用标记。</think>### DCT加密解密方法及实现步骤 DCT(离散余弦变换)在数字水印中的“加密”和“解密”实际指水印信息的嵌入与提取[^1]。以下是基于DCT的实现步骤: --- #### **1. 水印嵌入(“加密”)** **步骤说明**: 1. **分块处理**:将载体图像分割为$8×8$像素块。 2. **DCT变换**:对每个块进行二维DCT变换,得到频域系数矩阵$C(u,v)$。 3. **选择嵌入位置**:通常选择中频系数(如坐标$(3,4)$或$(4,3)$),以平衡鲁棒性和不可见性。 4. **嵌入规则**:通过量化或直接修改系数嵌入水印信息。例如: $$ C'(u,v) = C(u,v) + \alpha \cdot w $$ 其中$\alpha$为嵌入强度,$w$为二值水印(0或1)。 5. **逆DCT变换**:将修改后的系数矩阵通过逆DCT变换重构图像。 --- #### **2. 水印提取(“解密”)** **步骤说明**: 1. **分块与DCT变换**:对带水印图像重复分块和DCT变换。 2. **定位嵌入系数**:根据嵌入时的位置规则读取对应系数。 3. **提取规则**:若嵌入时使用量化法,则通过阈值判断水印位。例如: $$ w' = \begin{cases} 1 & \text{if } |C'(u,v) - Q \cdot \lfloor C'(u,v)/Q \rfloor| > Q/2, \\ 0 & \text{otherwise}. \end{cases} $$ 4. **解密与反变换**:对提取的二进制序列进行解密(如异或操作)并重组为水印图像。 --- #### **Python实现示例** ```python import numpy as np from scipy.fftpack import dctn, idctn def embed_watermark(original_img, watermark, alpha=0.1, position=(3,4)): blocks = original_img.reshape((-1, 8, 8)) watermarked_blocks = [] for i, block in enumerate(blocks): dct_block = dctn(block, norm='ortho') # 嵌入水印位(假设watermark为一维二值数组) if i < len(watermark): dct_block[position] += alpha * watermark[i] watermarked_blocks.append(idctn(dct_block, norm='ortho')) return np.vstack(watermarked_blocks).reshape(original_img.shape) def extract_watermark(watermarked_img, watermark_length, alpha=0.1, position=(3,4)): blocks = watermarked_img.reshape((-1, 8, 8)) extracted = [] for i in range(watermark_length): dct_block = dctn(blocks[i], norm='ortho') extracted.append(1 if dct_block[position] > alpha/2 else 0) return np.array(extracted) ``` --- #### **关键问题说明** - **鲁棒性**:嵌入位置选择中频可抵抗JPEG压缩。 - **不可见性**:通过调整$\alpha$控制水印强度(一般$\alpha \leq 0.2$)。 - **安全性**:嵌入位置可作为密钥,提高抗攻击能力。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值