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

本文介绍了基于FFT的Java数字盲水印实现,通过在频域上修改图像数据来嵌入水印,确保水印对原图影响小,但具有一定鲁棒性。详细阐述了代码实现过程,包括图像居中、FFT变换、水印嵌入等关键步骤,并探讨了水印的局限性和应用场景。
摘要由CSDN通过智能技术生成

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

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

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

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

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

fb8d4fe9ceebb2cdcc87f56e9c3f6ad4.gifint 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 *)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值