【问题标题】:Taking DCT of an image in MATLAB在 MATLAB 中对图像进行 DCT
【发布时间】: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


【解决方案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。尝试删除此演员表,看看它是否有效。

【讨论】:

  • 非常感谢..我一直在尝试解决这个错误很长时间。它正在工作。非常感谢。您指出了确切的错误。这将对我的项目有很大帮助。太感谢了。另外,我会采纳您在评论空间中输入代码的建议。也谢谢你。
  • @JINIJOHN - 没问题!我很高兴 :) 是的,尽量避免在 cmets 块中放置大量代码。它看起来不太好。很高兴能帮您找到问题,祝您好运!
  • @rayryeng 我已经将这个概念应用到我的项目中。但它不起作用可能是 bcz,我在那里使用了彩色图像。我已将代码邮寄到您的电子邮件 ID。请帮我指出错误。请
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-05-29
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多