使用DCT系数更改图像亮度和对比度

时间:2014-05-16 13:33:15

标签: image matlab image-processing dct

我试图在频域中执行一些图像变换(使用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 = dct2(img); % or blKsz=512; %full image

差异显而易见。

我做错了什么?这是我选择我添加和乘法的值(它们是完全随机的)的方式吗?我还想提一下,如果我在输出中添加了来自idct的偏移伪像(每个块的前3个左上角像素与其他像素不同)。

我知道每个dct块的左上角值具有块的亮度平均值。我应该只修改这个而不修改其他值吗?块大小如何影响结果?

1 个答案:

答案 0 :(得分:0)

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

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

对比度增强

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

亮度增强

通过查看空间域,如果你拍摄每个像素并为其添加一个常数,那么你实际上是在增加整体的“电源”#34;图像。如果您要查看任何图像与添加到每个像素的常数值的图像之间的频谱,对于DCT块,DC值的系数将相同之外(顶部)每个街区的左下角)。因此,如果要增加频域中的亮度,则应为每个DCT块中的每个DC值添加一个常量值。但是,我不确定在向每个块中的DC项添加值与向空间域中的每个像素添加常量值之间的数值相关性是什么。我的意思是添加一个值......让我们说...例如...... 5在空间域中并不意味着如果你为每个DC值添加值5,你会得到相同的结果。肯定会有亮度增加,但我不确定如何量化一旦你采取逆DCT后亮度会增加多少。

您需要注意的一个警告是,如果您尝试向每个 DCT系数添加一个值,那么您基本上就是在模拟additive white Gaussian noise。值越高,引入图像的噪声就越多。因此,如果您采用逆DCT,结果可能不利于您的喜好。因此,请确保向DC值添加常量(即DCT块的左上角)


长话短说,理论上可以在频域中执行此操作,但实际上我并没有看到这一点。