def SVD_embed(im, wm, strength, blk_size): U, S, V = block_SVD(im, blk_size) S_new = embed(S, wm, strength) im_wm = block_ISVD(U, S_new, V, blk_size) return im_wm def SVD_extract(im_wm, im, strength, block_size): _, S, _ = block_SVD(im, block_size) _, S_wm, _ = block_SVD(im_wm, block_size) tmp = S_wm - S wm_ex = np.empty_like(tmp, dtype=int) for i in range(tmp.shape[0]): for j in range(tmp.shape[1]): wm_ex[i, j] = np.sum(tmp[i, j]) wm_ex = wm_ex / block_size[0] / strength return wm_ex def embed(S, wm, strength): wm = wm.flatten() row, col = S.shape S = S.flatten() for i in range(S.size): S[i] = S[i] + strength * wm[i] S = S.reshape(row, col) return S这段代码什么意思
时间: 2023-12-04 17:06:27 浏览: 106
K_SVD及MOD算法
5星 · 资源好评率100%
这段代码实现了基于SVD的数字水印嵌入和提取算法。具体来说,它包括以下两个函数:
- SVD_embed(im, wm, strength, blk_size): 该函数输入原始图像im,数字水印wm,嵌入强度strength和块大小blk_size,输出嵌入数字水印后的图像im_wm。
- SVD_extract(im_wm, im, strength, block_size): 该函数输入嵌有数字水印的图像im_wm,原始图像im,嵌入强度strength和块大小block_size,输出提取出的数字水印wm_ex。
具体来说,SVD_embed函数首先将原始图像im分成大小为blk_size的块,对每个块进行SVD分解,并将数字水印嵌入到分解后的S矩阵中。然后通过逆SVD变换,将嵌有数字水印的块合并成嵌入数字水印后的图像im_wm。
SVD_extract函数则是将原始图像im和嵌有数字水印的图像im_wm都分成大小为block_size的块,对每个块进行SVD分解,计算出嵌有数字水印的块和原始块的S矩阵之差,并将差值除以块大小和嵌入强度得到数字水印。最后将数字水印wm_ex返回。
阅读全文