fire-keeper / BlindWatermark

使用盲水印保护创作者的知识产权using invisible watermark to protect creator's intellectual property
GNU General Public License v3.0
1.34k stars 181 forks source link

增加 jpg 输出质量的参数 & 一些问题 #13

Open Erimus-Koo opened 4 years ago

Erimus-Koo commented 4 years ago

感谢作者,感觉还挺好用的。 代码还没细看,先跑了点测试。然后有些问题请教一下。

加了个jpg压缩的参数

cv2.imwrite(output_filename, img_data, [int(cv2.IMWRITE_JPEG_QUALITY), 90])

png也有对应的IMWRITE_PNG_COMPRESSION,但那个有损得比较厉害,不太用到。
jpg的还是挺常用的。

做了一些测试

同水印大小不同源图大小

显然大图包含信息更多,还原更精准。(横坐标为jpg品质,纵坐标为mod)

水印刚好是图源1/8

大图有好一些,但优势不明显。(个人理解是承载信息的范围和信息本身在同比增加,压缩之后干扰程度也就差不多) 接合上一条,也许水印可以有一个上限,比如128的bitmap,足够承载较多的内容。

block的影响

同样源图用到最大水印 block4->1

同样源图/水印/仅改变block

我的理解是block越多,单个block就越小,能承载的信息越少,所以解码质量越低。 这里我源码还没细看,请问block在这里的作用是什么?从原图反解码的效果来看是越少品质越好,那block增加是能实现什么效果呢?防遮挡,多处采样比较吗?

其他一些问题

考虑自动根据源图生成参数

读完源码自答一下

block有一个比较隐蔽的问题是配合dwt,要凑到8px,因为jpg是按8px来压缩的,也就是block*(2^dwt_deep)刚好。 block过小,运算量几何级数增加,效率过慢。而且block过细,会导致画面有明显噪点感。 block过大,解高压缩的jpg水印会出问题。 jpg60时,block数量的宽高,达到水印2倍后解水印质量不错。比如画布1024,dwt1次,有效画布512,block4,可记载宽度128,如果用来记载32的水印,就达到了4:1,解水印效果就很好。

Erimus-Koo commented 4 years ago

假设:

水印 = [32, 64, 128]  
block = [2, 4]  # 测试用1的话好像完全不能抗涂抹  
信息承载范围 = 源图 / block  
常数 = 信息承载范围 / 水印  
Erimus-Koo commented 4 years ago

测了下超窄图,128x2048,像素同512x512。

宽高1:16,看来条状图没什么问题。

Erimus-Koo commented 4 years ago

测试了一张白色背景的图


Erimus-Koo commented 4 years ago

做了一张没有Y通道(Y只有纯白色)的图

好像在哪里看到一眼说明说主要取Y通道,就试了试。 LAB,其中L也是明度。明度通道空白,另外两个通道用了同样的图。 特地看了下YUV输出时的Y,的确也是纯白。 image

noy_plot_src512_wm32_block4_jpg60-100_mod16-32 noy_plot_src512_wm32_block4_jpg60-100_mod16-32


guofei9987 commented 4 years ago

我看懂了代码,个人理解是这样的:

  1. block 越大,嵌入的图跟原图比较,变化越小,但水印越不稳定。
  2. 水印只取第一通道,并且bit化,所以水印通道、反色什么的,意义不是很大。
  3. 没测试,只是从代码中理解上是这样,不知道上面实际测试时候是不是这样
  4. 你的测试结果,横纵坐标和标题都没看懂,希望解释一下(另外,乘号会被解析为斜体,用✖️)