在matlab中更改灰度图像中的灰度级数

时间:2013-01-21 08:38:16

标签: image-processing matlab

我对matlab很新,但我希望有人可以帮助解决这个问题。所以我有一个彩色图像,我想转换为灰度,然后减少灰度级数。所以我在图像中读到并使用rgb2gray()将图像转换为灰度。但是,我不确定如何将图像转换为仅使用32个灰度级而不是255个灰度级。

我试图使用colormap(灰色(32)),但这似乎对绘制的图像本身或图像下的颜色条没有影响。所以我不知道还能在哪里看。有什么提示吗?感谢。

3 个答案:

答案 0 :(得分:3)

虽然result = (img/8)*8确实将范围[0,255]中的灰度图像转换为该范围的子集但现在仅使用32个值,但它可能会产生不希望的伪像。可能产生视觉上更好的图像的方法称为改进的灰度量化(缩写为IGS)。执行它的伪代码可以表示为:

mult = 256 / (2^bits)
mask = 2^(8 - bits) - 1
prev_sum = 0
for x = 1 to width
    for y = 1 to height
        value = img[x, y]
        if value >> bits != mask:
            prev_sum = value + (prev_sum & mask)
        else:
            prev_sum = value
        res[x, y] = (prev_sum >> (8 - bits)) * mult

作为示例,请使用上述方法考虑下图以及bits = 5bits = 4bits = 3的相应量化:

enter image description here enter image description here enter image description here enter image description here

现在是相同的图像,但通过执行(img/(256/(2^bits)))*(256/(2^bits))量化:

enter image description here enter image description here enter image description here enter image description here

这不是一个病态的例子。

答案 1 :(得分:2)

您可以通过简单的舍入来减少图像中不同值的数量:

I = rgb2gray(imread('image.gif'));
J = 8*round(I/8)

请参阅imhist(I)imhist(J)了解效果。

但是,如果您想减小图像尺寸,最好使用Photoshop,Gimp或IrfanView等图像处理程序,并保存为32色gif。这样你实际上会减少文件的调色板,我认为这是Matlab无法做到的。

答案 2 :(得分:0)

检查您怀疑的图像数据类型是否为uint8。如果是这种情况,则将图像除以8以滥用整数除法的地板效果,再次乘以8,并设置为:I2=(I/8)*8I2只有32个灰度级。