我正在MATLAB中进行水印项目。我已经将块状DCT应用于图像并嵌入了水印。采用逆DCT并存储新的水印图像。出于提取的目的,当我再次尝试采用DCT时,我可以发现在进行逆DCT之前与DCT图像相比发生了一些变化(在watremarking过程中)。由于这种变化,我无法提取正确的水印。有谁能建议一些方法来避免这种变化?
以下是我尝试的代码:
img=imread('cameraman.tif');
original=double(img)-128;
fundct = @(block_struct) dct2(block_struct.data);
dctimg=blockproc(original,[8 8],fundct);
modified=dctimg+10;%modification is done
funrev = @(block_struct) idct2(block_struct.data); %to perform inverse dct
invdct = blockproc(modified,[8 8],funrev); % combining 8*8 blocks
invdct=uint8(invdct)+128;% now invdct is modified image
againdct=double(invdct)-128; % agin spply dct to it
fundct = @(block_struct) dct2(block_struct.data);
againdct=blockproc(againdct,[8 8],fundct);
答案 0 :(得分:1)
您的问题特别出现在您的代码中:
invdct=uint8(invdct)+128;% now invdct is modified image
againdct=double(invdct)-128; % agin spply dct to it
在您的搜索结果中,它们是否有些不准确?这是因为你的uint8
投射。 invdct
将不可避免地成为浮点数,因此如果将变量转换为uint8
,则会删除精确重建DCT系数所需的任何精度。例如,当您采用逆DCT时,您将获得浮点值,如25.6161或9.19391。这些值可能不会出现在您的图像中,但这些是您将获得的数字种类。
执行uint8
会删除此精确度,因此您将获得25
和9
。如果您执行此操作的DCT,您肯定不会获得与其他图像相同的结果。您基本上是量化的,因此会出现您的不准确性。
因此,如果要重建相同的DCT结果,则应避免转换为uint8
。尝试删除此演员,看看它是否有效。