【发布时间】:2014-11-15 08:54:56
【问题描述】:
我正在 MATLAB 中做一个水印项目。我已将分块 DCT 应用于图像并嵌入了水印。取反 DCT 并存储新的水印图像。出于提取目的,当我再次尝试获取 DCT 时,我发现与进行逆 DCT 之前的 DCT 图像相比发生了一些变化(在水印过程中)。由于此更改,我无法提取正确的水印。谁能建议一些方法来避免这种变化?
这是我尝试过的代码:
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);
【问题讨论】:
-
我不太明白你在说什么。您是说您采用块状 DCT,修改 DCT 系数,然后采用逆 DCT。接下来,当您再次使用 DCT 时,您会注意到变化吗?...当然与原始版本相比有变化。您修改了系数,因此当您找到修改后图像的 DCT 时,它将与原始图像不同。你能更具体地说明你在做什么吗?你能告诉我们任何代码吗?这个问题将不可避免地结束,因为您似乎没有表现出任何努力。
-
很抱歉让大家感到困惑。实际上我的意思是,让 A 成为应用了块 DCT 的图像。修改后,让该图像成为 B。现在我取 B 的逆 DCT。让它成为 C。如果我再取 C 的 DCT,它应该相当于B,对吧?但我没有得到这个结果。与原始图像相比,我可以意识到差异。无论如何,很抱歉让你感到困惑。感谢您的回复。希望您现在有问题。我会附上一个示例程序来演示这个问题
-
我将编辑您的帖子,以便您拥有此代码,但将来您应该避免将超过 2 行的代码放在 cmets 块中......它看起来真的很糟糕。
-
img=imread('cameraman.tif');原始=双(img)-128; fundct = @(block_struct) dct2(block_struct.data); dctimg=blockproc(原始,[8 8],fundct); modified=dctimg+10;%修改完成 funrev = @(block_struct) idct2(block_struct.data); invdct = blockproc(修改,[8 8],funrev); invdct=uint8(invdct)+128;% 现在invdct又是修改后的图像dct=double(invdct)-128; % agin 向它提供 dct fundct = @(block_struct) dct2(block_struct.data); againdct=blockproc(againdct,[8 8],fundct);
-
%'againdct' 应该等价于 'modified' %它是 95 % 等价的,但是 (modified -againdct) 不等于 0 %我需要它是 0 %因为这样一个轻微的错误会产生我的结果中的错误
标签: matlab image-processing dct