我正在开展一个关于图像水印的研究项目。它的主要部分是实际的水印嵌入方案,我选择它作为 robust blind color image watermarking in quaternion Fourier transform domain。我已经使用OpenCV python接口开始实现,并且陷入了我必须进行四元数傅里叶变换的步骤。文章中的描述没有多大帮助。我的代码非常基础:
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)
来自文章:
江等人。 (2008)利用传统的复快速傅里叶变换引入了二维四元数傅里叶变换的快速算法,其中每个部分傅里叶变换是通过FFT算法通过将四元数分离成实部和其他虚部来计算的。彩色图像f(m,n)的快速四元数傅里叶变换可表示为:
F(u,v)= i(Real(Rrft)+μ Imag(Rrft))+ j(Real(Grft)+μ Imag(Grft))+ k(Real(Brft)+μ* Imag(Brft))
其中Real(x)表示复数x的实部,Imag(x)表示复数x的虚部,Rrft是数组R的实数傅立叶变换。
有人可以解释我做错了什么,并告诉我正确的方法吗?
我更新了代码,为每个颜色通道计算单独的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图像,它也与文章中的不匹配。在我的实现中,原因可能是缺少μ吗?我也在努力逆变换。反公式中有四个组成部分:
f(u,v)=(Real(Airft)+μ Imag(Airft))+ i(Real(Cirft)+μ Imag(Cirft))+ j(Real(Dirft)+μ Imag(Dirft))+ k(Real(Eirft)+μ Imag(Eirft))
如何将它们映射到3个颜色通道?省略第一个?
答案 0 :(得分:0)
您引用的公式:
F(u,v)= i(Real(Rrft)+μImag(Rrft))+ j(Real(Grft)+μImag(Grft))+ k(Real(Brft)+μ* Imag(Brft))
第一件事: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