当前位置:首页 > 浪漫Q唐 > 正文

基于DCT数字水印算法的Matlab实现源代码?

2023-11-06 20:43:57  来源:网络   热度:

一、基于DCT数字水印算法的Matlab实现源代码?

1. 读取图片

2. 读取水印图片(二维码)

3. 原图片做成灰度

4. 水印图做成二值图

5. 原图做8*8DCT处理

6. 选择DC成分以外的元素(每个8*8块里选择1个元素)

7. 生成伪随机乱数

8. 根据乱数做成密钥

9. 将水印图根据密钥与算法嵌入到第6步骤

10. 嵌入后将每个元素替换原来的第6步元素

11. 做反变换

12. 图片保存,嵌入完毕

提取

1. 读取嵌入水印后的图片

2. 生成嵌入时的伪随机乱数(生成乱数之前可以加一些几何攻击)

3. 根据乱数做成密钥

4. 嵌入水印后的图片做8*8DCT处理

5. 选择DC成分以外的元素(选取跟原来嵌入时相同)

6. 根据算法与密钥提取水印图

7. 提取的水印图与原水印图做比较

8. 保存提取的水印图,提取完毕

二、单片机型号是stc8952rc 求完整程序

#include#define uchar unsigned char uchar tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //0到9 uchar num,dat,time; uchar led[]={10,0,0,10}; sbit key1=P1^0; sbit key2=P1^1; void delay(uchar a) { uchar i,j; for(i=0;i for(j=0;j<125;j++); } void t1isr() interrupt 3 { TH1=(65536-10000)/256; TL1=(65536-10000)%256; switch(num) { case 0:P2=0x01;break; case 1:P2=0x02;break; case 2:P2=0x04;break; case 3:P2=0x08;break; default:break; } P0=~tab[led[num]]; num++; num&=0x03; } void t0isr() interrupt 1 //秒计时 { TH0=0x3c; TL0=0xb0; time++; if(time>20) { time=0; if(dat>0)dat--; if(dat==0)TR0=0; } led[1]=dat/10; led[2]=dat%10; } main() { TMOD=0x11; TH1=(65536-10000)/256; TL1=(65536-10000)%256; TR1=1; ET1=1; TH0=0x3c; TL0=0xb0; ET0=1; EA=1; while(1) { if(key1==0) { while(key1==0); dat++; if(dat>49)dat=49; led[1]=dat/10; led[2]=dat%10; } if(key2==0)TR0=1; } }

三、C语言,求解,谁能给我一个完整的源代码

#include <stdio.h>

#define N 10

void fun(int  a[N][N],int n)

{

    int i,j,tmp;

    for(i=0;i < n;i++)

    {

        for(j=i+1;j < n;j++)

        {

            tmp = a[i][j];

            a[i][j]=a[j][i];

            a[j][i]=tmp;

        }

    }

}

int main(int argc, char const *argv[])

{

        int a[N][N] = {};

        int i,j;

        printf(input a number:\n);

        scanf(%d,&n);

        for(i=0;i < n;i++)

        {

                for(j=0;j < n;j++)

                {

                        scanf(%d,&a[i][j]);

                }

                printf(\n);

        }

        fun(a,n);

        printf(\n);

        for(i=0;i < n;i++)

        {

                for(j=0;j < n;j++)

                {

                        printf(%d ,a[i][j]);

                }

                printf(\n);

        }

        return 0;

}

//没使用动态内存分配,不过基本算法就是那样吧

一周热门