在MATLAB中对图像进行DCT

时间:2014-09-21 06:06:39

标签: matlab image-processing dct

我正在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); 

1 个答案:

答案 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会删除此精确度,因此您将获得259。如果您执行此操作的DCT,您肯定不会获得与其他图像相同的结果。您基本上是量化的,因此会出现您的不准确性。

因此,如果要重建相同的DCT结果,则应避免转换为uint8。尝试删除此演员,看看它是否有效。