我正在从事有关图像水印的研究项目。它的主要部分是实际的水印嵌入方案,我选择了它为 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*kj*mu*fft1.imag = a1+b1*i+c1*j+d1*kk*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/

10-10 12:47