根据嵌入和提取算法及嵌入原理:向上(向后)查找法即根据水印位在查找表中向上查找,若位值与查找表的对应值相同也不变,提取时,根据像素值对应的查找表取值。,根据给定的“查找表”对给定的3´3“图像”矩阵,给定的3´3 “水印”矩阵,用C语言语言编程工具设计水印嵌入算法函数和水印提取算法函数,并编写主函数进行调用,在主函数中分别输出“含水印图像”矩阵、“提取的水印”矩阵。说明:此题的“查找表”可用二维数组来表示,3´3“图像”矩阵和3´3 “水印”矩阵可用二维数组来表示。具体要求如下: 给定的“查找表”的组成方式:{{155,0},{156,0},{157,1},{158,0},{159,1},{160,1},{161,0},{162,1},{163,0},{164,1}} 给定的“3´3水印矩阵”的组成方式:{{1,0,1},{1,1,0},{0,0,0}}; 给定的“3´3图像矩阵”的组成方式:如某同学的学号为“1416240351”,去掉最左边的一位变为“416240351”,再分别对每位学号加上155后,组成的“3´3图像矩阵”则表示为 {{155,157,156},{159,158,159},{160,161,162}};。每位学生的学号不同,组成的矩阵也不同。 结果为含水印图像为{{157,158,157},{159,159,161},{161,161,163}}
时间: 2023-11-01 20:35:45 浏览: 74
好的,你的问题是如何设计水印嵌入算法函数和水印提取算法函数,并且编写主函数进行调用,以实现给定的要求。我可以给你一些思路和代码示例,但需要你自己完成代码的编写和调试。你需要使用C语言编写代码,可以使用任何你熟悉的IDE或编译器。
首先,我们需要定义一个二维数组来表示给定的“查找表”。代码如下:
```
int lookup_table[10][2] = {{155, 0}, {156, 0}, {157, 1}, {158, 0}, {159, 1}, {160, 1}, {161, 0}, {162, 1}, {163, 0}, {164, 1}};
```
然后,我们需要定义一个函数来实现水印嵌入。这个函数的输入参数为一个3x3的图像矩阵和一个3x3的水印矩阵,输出参数为含水印的3x3图像矩阵。代码如下:
```
void embed_watermark(int image[3][3], int watermark[3][3], int result[3][3]) {
int i, j, k, index;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
index = 0;
for (k = 0; k < 9; k++) {
if (image[k/3][k%3] == lookup_table[k][0]) {
index |= (lookup_table[k][1] << k);
}
}
if (watermark[i][j] == 1) {
result[i][j] = lookup_table[index][0] + 1;
} else {
result[i][j] = lookup_table[index][0];
}
}
}
}
```
在这个函数中,我们首先定义三个循环变量i,j和k,分别表示行、列和查找表中的索引。然后,我们使用一个循环来遍历图像矩阵中的每个元素,对于每个元素,我们将它在查找表中的索引计算出来,并将对应的位值按位拼接成一个整数index。最后,根据水印矩阵的值来修改含水印图像矩阵中的元素值。
接下来,我们需要定义一个函数来实现水印提取。这个函数的输入参数为一个3x3的图像矩阵,输出参数为提取出的3x3水印矩阵。代码如下:
```
void extract_watermark(int image[3][3], int result[3][3]) {
int i, j, k, index;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
index = 0;
for (k = 0; k < 9; k++) {
if (image[k/3][k%3] == lookup_table[k][0]) {
index |= (1 << k);
}
}
result[i][j] = (index >> (i*3+j)) & 1;
}
}
}
```
在这个函数中,我们也首先定义三个循环变量i,j和k,分别表示行、列和查找表中的索引。然后,我们使用一个循环来遍历图像矩阵中的每个元素,对于每个元素,我们将它在查找表中的索引计算出来,并将对应的位值按位拼接成一个整数index。最后,我们可以通过位运算来提取出水印矩阵中的每个元素值。
最后,我们需要在主函数中调用这两个函数,并输出结果。代码如下:
```
int main() {
int image[3][3] = {{155, 157, 156}, {159, 158, 159}, {160, 161, 162}};
int watermark[3][3] = {{1, 0, 1}, {1, 1, 0}, {0, 0, 0}};
int result[3][3];
embed_watermark(image, watermark, result);
printf("含水印图像矩阵:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", result[i][j]);
}
printf("\n");
}
int extracted[3][3];
extract_watermark(result, extracted);
printf("提取的水印矩阵:\n");
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
printf("%d ", extracted[i][j]);
}
printf("\n");
}
return 0;
}
```
在这个主函数中,我们首先定义了一个3x3的图像矩阵和一个3x3的水印矩阵。然后,我们调用了水印嵌入函数和水印提取函数,并输出了结果。你可以按照这个思路来编写你自己的代码,并进行调试。
阅读全文