我正在从事有关图像水印的研究项目。它的主要部分是实际的水印嵌入方案,我选择了它为 robust blind color image watermarking in quaternion Fourier transform domain。我已经开始使用OpenCV python接口(interface)实现,并陷入了必须进行四元数傅里叶变换的步骤。文章中的描述没有太大帮助。我的代码很基本:
img = cv2.imread("jurassic_world.jpg", cv2.IMREAD_COLOR)
这里的图像被分割成8x8的块。
fft = np.fft.fft(img)
return map(lambda row: map(lambda pix:(sum(pix.real), pix[0].imag, pix[1].imag, pix[2].imag), row) , fft)
从文章:
其中Real(x)表示复数x的实部,Imag(x)表示复数x的虚部,Rrft是数组R的实傅里叶变换。
有人可以解释我做错了什么,并告诉我正确的方法吗?
更新1
我已经更新了代码,可以为每个颜色通道计算单独的fft。然后,我对实部求和并添加想象的部分以形成四元数。
def computeBlockQFFT(block):
fft0 = np.fft.fft(block[:,:,0])
fft1 = np.fft.fft(block[:,:,1])
fft2 = np.fft.fft(block[:,:,2])
res = np.empty([block.shape[0],block.shape[1],block.shape[2]+1])
res[:,:,0] = fft0[:,:].real + fft1[:,:].real + fft2[:,:].real
res[:,:,1] = fft0[:,:].imag
res[:,:,2] = fft1[:,:].imag
res[:,:,3] = fft2[:,:].imag
return res
现在,当我绘制一个彩色图像组件时,我得到了picture,数据的形式为-764.882831772。该图看起来类似,但即使使用了相同的Lenna图像,也与文章中的图不匹配。原因可能是我的实现中缺少μ吗?我也在努力逆变换。逆公式中包含四个成分:
如何将它们映射到3个颜色通道?忽略第一个吗?
最佳答案
您引用的公式:
第一件事:i,j,k
是虚轴。 mu
是四元数,方向用于四元数傅里叶变换。
当我们计算i*mu
时,j
mu and
k * mu , this will give us quaterions again.We map real to 0,
i to 1
j to 2 and
k`等于3。
该公式告诉我们:
让i*mu*fft0.imag = a0+b0*i+c0*j+d0*k
,j*mu*fft1.imag = a1+b1*i+c1*j+d1*k
和k*mu*fft2.imag = a2+b2*i+c2*j+d2*k
。
res[0] = a0+a1+a2
res[1] = fft0.real + b0+b1+b2
res[2] = fft1.real + c0+c1+c2
res[3] = fft2.real + d0+d1+d2
关于python - Python中彩色图像的快速四元数傅立叶变换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36670240/