【发布时间】:2014-07-04 23:24:58
【问题描述】:
我正在尝试在频域中执行一些图像转换(使用 dct coeff),例如调整灰度图像的亮度和对比度。到目前为止我所知道的是,调整亮度意味着为像素强度添加偏移量,调整对比度是将每个像素乘以一个值。我的问题是这在频域中是否仍然可用?
img = image("lena.bmp")
img= double(img)-128;
blKsz = 8;
coef = blkproc(I,[block_size block_size],'dct2');
new_coef = coef - 0.3;
% IDCT
new_img = blkproc(new_coef,[block_size block_size],'idct2');
new_img = new_img+128;
当我这样做时,图像没有明显的差异,即使值有点高。但是,如果我不是按块执行,而是对完整图像的 coef 执行
coef = dct2(img); % or blKsz=512; %full image
区别很明显。
我做错了什么?是我选择相加和相乘的值(完全随机)的方式吗?我还想提一下,如果我添加一个来自 idct 的偏移量,输出中就会出现(每个块的前 3 个左上角像素与其他像素完全不同)。
我知道每个 dct 块的左上角值都有块的亮度平均值。我应该只修改这个而不修改其他值吗?块大小如何影响结果?
【问题讨论】:
-
我不想刻薄,但我认为您需要了解 DCT 系数的重要性;例如将所有系数加 1 不会改变图像的亮度...例如,DCT 的第一个系数是多少?
-
确实,我只知道 DCT 系数,它们根据频率存储能量。所以第一个系数代表图像中占主导地位的低频,当我们移动到右下角时,我们会找到高频部分。但是,我不知道为什么将所有系数加 1 不会改变亮度。我猜想为所有系数添加一个值会增加低频和高频,但我不明白这将如何反映在像素的强度上。我可以阅读任何文章吗? (我知道有很多关于 DCT 的书,但我读过的所有书都没有帮助我解决这个问题)。
-
向所有频率添加一个常数基本上会模拟加性高斯白噪声,因为频域中的频谱在所有频率上都是平坦的。你真正在做的是给你的图像添加噪点,所以当你最终恢复它时......我只想说,你添加的越多,它看起来就越像垃圾。因此,添加一个常数绝对不会增加图像的亮度或对比度。
-
至少对比一下,将所有 coeff 乘以相同的常数确实具有预期的效果。但我理解你的亮度。因此,我应该只在每个块中的第一个左上角系数中添加一个常量吗?
-
在这种情况下,是的。为每个 DC 项添加一个常数将实现亮度的增加。亮度的增加归因于具有更多的“功率”,因此这应该可以工作....但是,我认为在频域中这样做没有意义。您可以通过获取图像并向每个像素值添加一个常数来轻松实现相同的目标。
标签: image matlab image-processing dct