# Code
**Repository Path**: giteewpu/code
## Basic Information
- **Project Name**: Code
- **Description**: 算法代码
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2025-05-08
- **Last Updated**: 2025-05-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# Code
如果有任何问题请发邮件到1072602853@qq.com
#### 文件说明
1. steganalysis隐写分析
2. steganography隐写算法
#### 三维模型隐写分析介绍
1. 3d mesh steganalysis 代码包含两个模块1)提取特征2)机器学习
2. 提取特征:通过matlaba处理.off文件,输出特征集csv
3. 机器学习:通过python+scikit+pandas+numpy处理特征集
#### 3D模型数据集说明
1. PSB普林斯顿分割集,真实世界扫描得来。 X. Chen , A. Golovinskiy , T. Funkhouser , A benchmark for 3D mesh segmentation, ACM Trans. Graph. 28 (3) (2009) 73:1–73:12 .
2. 包含20类,共计400个,其中261-280这20个人体模型存在网格问题,所以我们实验一般用380个
3. 5月20日更新:LF文件夹下包含MRS算法嵌入128bit的五个平滑强度的特征集
#### 3D隐写分析相关论文及介绍(按照研究逻辑的时间顺序)
1. Ying Yang and Ioannis Ivrissimtzis, “Mesh discriminative features for 3D steganalysis,” ACM Transactions on Multimedia Computing, Communications, and Applications, vol. 10, no. 3, pp. 27:1–27:13, 2014. 特征集YANG208
2. Z. Li, A.G. Bors, 3D mesh steganalysis using local shape features, in: Proceedings of IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP), 2016, pp. 2144–2148. 使用局部形状特征的3D网格隐写分析 特征集LFS52
3. D. Kim , H.-U. Jang , H.-Y. Choi , J. Son , I.-J. Yu , H.-K. Lee , Improved 3D mesh steganalysis using homogeneous kernel map, in: Proc. Int. Conf. on Information Science and Applications, 2017, pp. 358–365 . ——齐次核升维——特征集LFS64
4. Z. Li and A. G. Bors, “Steganalysis of 3D objects using statistics of local feature sets,” Inf. Sci., vols. 415–416, pp. 85–99, Nov. 2017.——使用局部特征集统计矩的三维隐写分析——LFS76
5. Z. Li , A.G. Bors , Selection of robust features for the cover source mismatch problem in 3D steganalysis, in: Proc. Int. Conf. on Pattern Recognition, 2016, pp. 4256–4261 . ——基于解决CSM问题的鲁棒特征筛选
6. Zhou H , Chen K , Zhang W , et al. Feature-Preserving Tensor Voting Model for Mesh Steganalysis[J]. IEEE Transactions on Visualization and Computer Graphics, 2019, PP(99):1-1.——投票张量特征NVT36——结合LFS64——组成100维NVT+
7. Li Z , Bors A G . Steganalysis of Meshes Based on 3D Wavelet multiresolution Analysis[J]. Information Sciences, 2020, 522:164-179.——3d小波特征228维,与LFS76组成304维效果较好
8. 平滑强度评测论文,大部分隐写算法在0.3,3参数下效果最好,级联特征效果最好
9. Li Z , Gong D , Liu F , et al. 3D Steganalysis Using the Extended Local Feature Set[C]// 2018:1683-1687.——扩展局部特征集——从LFS76到LFS124
#### 数字图像隐写分析常用数据集
1. BOSSBase (BOWS2):
BOSSBase (Break Our Steganographic System) is a widely used dataset for image steganalysis.
It consists of 10,000 grayscale images in BMP format, with a resolution of 512x512 pixels.
2. BOWS2: BOWS2 (Break Our Watermarking System) is another dataset commonly used in steganalysis research.
It contains 10,000 grayscale images in BMP format, with a resolution of 512x512 pixels.
3. S-UNIWARD: S-UNIWARD is a dataset specifically designed for steganalysis of spatial domain image steganography algorithms.
It consists of 50,000 grayscale images in BMP format, with a resolution of 512x512 pixels.
4. HUGO: HUGO is a dataset created for steganalysis of JPEG steganography algorithms.
It contains 50,000 color images in JPEG format, with a resolution of 512x512 pixels.
#### 三维网格
针对.off格式的三维网格,MATLAB中可以使用以下几种方法计算两个网格之间的差异:
1. 均方根误差(RMSE):计算两个网格中每个顶点的坐标差异,并计算其平方的平均值,最后再开方。具体实现如下:
```matlab
% 读取两个.off格式的网格文件
[V1, F1] = read_off('mesh1.off');
[V2, F2] = read_off('mesh2.off');
% 计算顶点坐标差异
diff = V1 - V2;
% 计算均方根误差(RMSE)
rmse = sqrt(mean(sum(diff.^2, 2)));
```
2. 最大误差(Max Error):计算两个网格中每个顶点的坐标差异,并取其绝对值中的最大值。具体实现如下:
```matlab
% 读取两个.off格式的网格文件
[V1, F1] = read_off('mesh1.off');
[V2, F2] = read_off('mesh2.off');
% 计算顶点坐标差异
diff = V1 - V2;
% 计算最大误差
max_error = max(abs(diff(:)));
```
3. Hausdorff距离(Hausdorff distance):Hausdorff距离是两个网格之间最大的点到点距离,即第一个网格中的每个点到第二个网格的最近点的距离的最大值,或者第二个网格中的每个点到第一个网格的最近点的距离的最大值。具体实现如下:
```matlab
% 读取两个.off格式的网格文件
[V1, F1] = read_off('mesh1.off');
[V2, F2] = read_off('mesh2.off');
% 计算第一个网格中每个点到第二个网格的最近点的距离
D1 = pdist2(V1, V2);
min_D1 = min(D1, [], 2); % 取每行的最小值
% 计算第二个网格中每个点到第一个网格的最近点的距离
D2 = pdist2(V2, V1);
min_D2 = min(D2, [], 2); % 取每行的最小值
% 计算Hausdorff距离
hausdorff_distance = max(max(min_D1), max(min_D2));
```
#### 成对划分样本
```python
import random
import pandas as pd
def generate_indices(n, x):
"""生成随机标号列表
Args:
n (int): 标号数量
x (float): 切分比例
Returns:
list: 随机标号列表
"""
indices = list(range(n))
random.shuffle(indices)
return indices[:int(n * x)]
def split_data_by_indices(data1_file, data2_file, indices):
"""按标号将数据分割成四个列表
Args:
data1_file (str): 第一个CSV文件路径
data2_file (str): 第二个CSV文件路径
indices (list): 随机标号列表
Returns:
tuple: 四个列表,包括data1_train, data1_test, data2_train, data2_test
"""
data1 = pd.read_csv(data1_file)
data2 = pd.read_csv(data2_file)
data1_train, data1_test, data2_train, data2_test = [], [], [], []
for i, row in data1.iterrows():
if i in indices:
data1_test.append(row)
else:
data1_train.append(row)
for i, row in data2.iterrows():
if i in indices:
data2_test.append(row)
else:
data2_train.append(row)
return data1_train, data1_test, data2_train, data2_test
def save_data_to_csv(data1_train, data1_test, data2_train, data2_test, prefix):
"""将四个列表存储到CSV文件中
Args:
data1_train (list): 第一个CSV文件的训练集列表
data1_test (list): 第一个CSV文件的测试集列表
data2_train (list): 第二个CSV文件的训练集列表
data2_test (list): 第二个CSV文件的测试集列表
prefix (str): 文件名前缀
"""
pd.DataFrame(data1_train).to_csv(f'{prefix}_data1_train.csv', index=False)
pd.DataFrame(data1_test).to_csv(f'{prefix}_data1_test.csv', index=False)
pd.DataFrame(data2_train).to_csv(f'{prefix}_data2_train.csv', index=False)
pd.DataFrame(data2_test).to_csv(f'{prefix}_data2_test.csv', index=False)
```
#### 空域图像隐写算法
1. 秘密信息:不论格式、编码,最终是一串比特流010101...
2. 载体:RGB图像、灰度图像
3. 密钥:编码格式、嵌入方式、嵌入位置等都算隐写算法的密钥
- 本科毕设:基于边缘检测度量变化的图像隐写
1. 秘密信息:二值图像(黑白图像)转换为比特流
2. 载体:灰度图像
3. 密钥:使用GHM多小波分解载体,嵌入位置由边缘检测低频区域的差值决定
4. 使用方式:下载steganography下的所有.m文件,country是一张载体图片
info1 和 info2 是两张宽相等,长度不相等的秘密图像,嵌入后会生成Secret.png文件
之后再选择tiqu.m选择Secret.png文件就可以看到提取后的,其中代码将宽度设置为密钥,程序中已写。
载体图像:
秘密信息:
含密图像:
5. 本科毕设demo很多细节处理的不好,诸如将彩色图转换为灰度图最后没转回来,包括文件名采用了拼音命名法等问题,而且当时虽然有gui,但是需要matlab环境,所以就不放了,算是一个复杂图像隐写算法的练习
#### 图像的离散余弦变换
```python
from PIL import Image
import numpy as np
# 读取图片
img = Image.open('example.jpg')
# 显示图片
img.show()
# 将图片转换为numpy数组
img_arr = np.array(img)
# 将数组转换为浮点数类型,并将像素值范围从[0, 255]转换为[-128, 127]
img_arr = np.float32(img_arr) - 128.0
# 将图片分成8x8的小块,并对每个小块进行DCT变换
dct_arr = np.zeros_like(img_arr)
for i in range(0, img_arr.shape[0], 8):
for j in range(0, img_arr.shape[1], 8):
dct_arr[i:i+8, j:j+8] = np.fft.fft2(img_arr[i:i+8, j:j+8], norm='ortho')
# 将DCT系数矩阵转换为图像
dct_img = Image.fromarray(np.uint8(dct_arr + 128.0))
# 显示DCT变换后的图像
dct_img.show()
```