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

6
我对matlab比较陌生,但我希望能在这个问题上提供帮助。我有一张彩色图片,想要将其转换为灰度图像,然后减少灰度级别的数量。我读入了这张图片并使用rgb2gray()将其转换为灰度图像。然而,我不知道如何将该图像转换为仅使用32个灰度级别而不是255个灰度级别。
我尝试使用colormap(gray(32)),但似乎对绘制的图像本身或图像下方的颜色条没有影响。所以我不确定还能从哪里找到答案。有什么提示吗?谢谢。

你真的不想通过简单地在8种颜色间选择级别来进一步量化它。考虑使用改进的灰度量化方法。 - mmgp
3个回答

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

这并不是一个病态示例。


2

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

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

查看imhist(I)imhist(J)的效果。

然而,如果您想要缩小图像尺寸,最好使用像Photoshop、Gimp或IrfanView这样的图像处理程序,并将其保存为32色gif。这样做可以实际上减少文件的调色板,我认为Matlab无法做到这一点。


2
小心使用 round。如果 I 不是整数类型,你最终会得到33个灰度级别。如果 I 是整数类型,你就不需要任何 round。;-) - s.bandara
@s.bandara:关于四舍五入的观点很好。此外,似乎OP实际上正在寻找imwrite,使用适当的映射,但我现在没有时间去弄清楚。 - Junuxx
@Junuxx 你知道用这种方法得到的图像可能会有多糟糕吗?(我在你的回答上评论了这个问题,只是因为当我访问这个问题时它出现在顶部,但对于其他回答同样适用。) - mmgp
@mmgp:你建议先做直方图均衡化吗? - Junuxx
1
@Junuxx,一种称为改进灰度量化的方法通常可以提供更好的结果,我可能会使用它来回答问题。 - mmgp

0

检查一下你的图像数据类型是否为uint8,我猜测是这种情况。如果是的话,将图像除以8来利用整数除法的取整效果,再乘以8,就可以了:I2=(I/8)*8I2将只有32个灰阶级别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接