2013-01-21 114 views
5

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

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

+0

你真的不想通过简单地选择8种颜色的间隔进行量化。考虑使用改进的灰度量化方法。 – mmgp

回答

0

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

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'。 ;-) –

+0

@ s.bandara:关于四舍五入的好处。此外,看起来OP可能实际上是在寻找'imwrite',使用适当的地图,但我现在没有时间弄清楚。 – Junuxx

+0

@Junuxx你是否意识到由此产生的图像可能看起来有多糟? (我在回答这个问题时只是因为它出现在顶部,当我访问这个问题时,这一点同样有效) – mmgp

2

虽然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 = 5相应quantizations,bits = 4,和bits = 3使用上述方法:

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

现在同样的图像,但量化做(img/(256/(2^bits)))*(256/(2^bits))

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

这不是一个病理例子。