水印处理算法提问
我想做一个水印嵌入算法,具体的步骤是这样的:
嵌入过程:
1:读入原始lena图像,进行DCT变换
2:读入watermark
3:取lena的dct图像的高频区域,这个区域和watermark的大小一样,进行第二次DCT变换。
4:将watermark的数据每个像素值乘以0.002加到第二次DCT变换的结果上。
5:将经过二次DCT的lena图像进行两次逆DCT变换。生成新的图像embeded.bmp图像
提取水印过程:
1:读入lena图像和embeded图像,原始水印图像。
2:对lena图像和embeded图像进行DCT变换。
3:取出lena和embeded经过DCT变换的高频区域图像进行2次DCT变换。
4:将第二次DCT变换的数据想减然后乘以500,生成水印图像。
这个算法理论上可行,并且嵌入成功,看不出有水印的痕迹,嵌入效果是可以的,但是提取就不正常了,压根就没法看,我怀疑和double的精度有关系,代码用C写的,大家看这个过程有问题么?谁能告诉我按照这个过程为什么提取不出水印?
[解决办法]
噪声会有影响。另外,如果图片是以压缩格式(如,JPG格式)保存的,也会有影响。
[解决办法]
我的感觉是由于对watermark的系数是0.002,比较小的数值,然后经过C语言的double处理,以及保存、读入等操作,不可避免地对原来小数值造成较大失真;还有DCT变换是有截断效应的,这个因素也要考虑。上述因素对于较大值可能无所谓,但是对于较小值(楼主乘以0.002),这些影响因素就不能不考虑了。
[解决办法]
在做数值运算的时候,由于要涉及到截取和近似,因此会给小数值的变量带来很大的影响,这一点一定要注意。