Java 实现数字盲水印_有意思的数字盲水印的简单的实现。

早期大约是10年前从一本数字图像处理上看到过数字水印的概念,觉得确实一种很有意思的东西,那个时候主要就是基于LSB的图像信息的隐藏,这种在空域里的方法有较大的缺陷,鲁棒性是比较差的。随便一个后期的都会造成水印的丢失,因此,虽然是一种盲水印,但是不具有很好的推广性。

前段时间一个朋友给了我一段使用Opencv的盲水印代码,是基于FFT变换的, 抽空看了下,对其中部分的实现过程进行了替换和分解,也实现了一个最简单的基于频域的盲水印效果。

我在寻找相关资料的时候在网络上看到有几个这方面的文章和工具,现在分享如下:

好像还有一个写的比较详细,而且有工具,在github上也有分享代码。

但是似乎这些工具大部分只支持文字水印,而不支持图像水印,文字我不熟悉,因此我还是用图像做水印模板,核心的代码如下所示:

int IM_AddBlindWaterMark(unsigned char *Src, unsigned char *WaterMark, unsigned char *Dest, int Width, int Height, int Stride, int WidthW, int HeightW, intStrideW)

{int Channel = Stride / Width, ChannelW = StrideW /WidthW;if ((Src == NULL) || (Dest == NULL)) returnIM_STATUS_NULLREFRENCE;if ((Width <= 0) || (Height <= 0)) returnIM_STATUS_INVALIDPARAMETER;if ((Channel != 1) && (Channel != 3) && (Channel != 4)) returnIM_STATUS_INVALIDPARAMETER;if ((ChannelW != 1) && (ChannelW != 3) && (ChannelW != 4)) returnIM_STATUS_INVALIDPARAMETER;if ((WidthW >= Width / 4) || (HeightW >= Height / 4)) return IM_STATUS_INVALIDPARAMETER; //水印图不能大于原图尺寸的一半

int Status =IM_STATUS_OK;int OptimalW = IM_GetOptimalDftSize(Width), OptimalH =IM_GetOptimalDftSize(Height);int OffsetX = (OptimalW - Width) / 2, OffsetY = (OptimalH - Height) / 2;int HalfW = OptimalW / 2, HalfH = OptimalH / 2;if (Channel == 1)

{

Complex*Data = (Complex *)malloc(OptimalW * OptimalH * sizeof(Complex));if ((Data == NULL)) returnIM_STATUS_OUTOFMEMORY;for (int Y = 0; Y < Height; Y++) //我们把数据居

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值