0

我正在尝试在频域中执行一些图像转换(使用 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 块的左上角值具有块的亮度平均值。我应该只修改这个而不修改其他值吗?块大小如何影响结果?

4

1 回答 1

0

在频域中调整图像的亮度和对比度当然是可能的,但其背后的实际意义值得怀疑。主要是,我不确定您为什么要经历计算每个 DCT 块的所有计算负担。在这种特殊情况下,空间域中的对比度和亮度增强是图像中像素总数的最坏O(n)情况。n进入频域会产生额外的计算成本。

在任何情况下,正如您在帖子中提到的,您可以通过向所有强度值添加一个常数来增加亮度,并且要增加对比度,您可以按一个常数因子缩放每个像素。它类似于这样的频域:

对比度增强

通过查看空间域,如果将每个像素乘以常数,则所有 DCT 系数也将乘以常数,并且 DCT 是(相对)可逆变换。因此,如果您想实现对比度增强,您可以为您拥有的每个 DCT 块获取每个值并乘以该常数。

亮度增强

通过查看空间域,如果您获取每个像素并为其添加一个常数,那么您实际上是在增加图像的整体“功率”。如果您要查看任何图像与添加到每个像素的恒定值的图像之间的频谱,则对于 DCT 块,系数将是相同的,除了对于 DC 值(每个块的左上角)。因此,如果您想增加频域中的亮度,您可以为每个 DCT 块中的每个 DC 值添加一个常数值。但是,我不确定在每个块中向 DC 项添加一个值与向空间域中的每个像素添加一个常数值之间的数值相关性是什么。我的意思是添加一个值......比如说...... 5 例如......在空间域中并不意味着如果你在每个 DC 值上添加一个 5 的值,你会得到相同的结果。亮度肯定会增加,但我不确定如何量化使用逆 DCT 后会增加多少亮度。

您应该注意的一个警告是,如果您尝试为每个DCT 系数添加一个值,您实际上是在模拟加性高斯白噪声。值越高,图像中引入的噪点就越多。因此,如果您采用逆 DCT,结果可能不符合您的喜好。因此,请确保您向 DC 值添加一个常数(即 DCT 块的左上角)


长话短说,理论上可以在频域中做到这一点,但实际上我没有看到任何意义。

于 2014-05-19T13:03:25.390 回答