我对matlab很新,但我希望有人能够帮助解决这个问题。所以我有一个彩色图像,我想要转换为灰度,然后减少灰度级数。所以我在图像中阅读,并使用rgb2gray()将图像转换为灰度。但是,我不确定如何将图像转换为仅使用32灰度级而不是255灰度级。更改matlab中灰度图像中灰度级的数量
我试图使用colormap(灰色(32)),但这似乎对绘图图像本身或图像下的颜色条没有影响。所以我不知道还有什么可以看的。有任何提示吗?谢谢。
我对matlab很新,但我希望有人能够帮助解决这个问题。所以我有一个彩色图像,我想要转换为灰度,然后减少灰度级数。所以我在图像中阅读,并使用rgb2gray()将图像转换为灰度。但是,我不确定如何将图像转换为仅使用32灰度级而不是255灰度级。更改matlab中灰度图像中灰度级的数量
我试图使用colormap(灰色(32)),但这似乎对绘图图像本身或图像下的颜色条没有影响。所以我不知道还有什么可以看的。有任何提示吗?谢谢。
检查您的图像数据的类型是否是我怀疑的uint8
。如果是这种情况,将图像分成8份以滥用整数除法的地板效果,再乘以8,然后设置为:I2=(I/8)*8
。 I2
将只有32个灰度级。
可以通过简单的舍入减少不同值的数量的图像中:
I = rgb2gray(imread('image.gif'));
J = 8*round(I/8)
的效果见imhist(I)
和imhist(J)
。
但是,如果您想缩小图像大小,最好使用Photoshop,Gimp或IrfanView等图像处理程序,并保存为32色gif。通过这种方式,你实际上会减少文件的调色板,我认为这是Matlab无法做到的。
虽然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
使用上述方法:
现在同样的图像,但量化做(img/(256/(2^bits)))*(256/(2^bits))
:
这不是一个病理例子。
你真的不想通过简单地选择8种颜色的间隔进行量化。考虑使用改进的灰度量化方法。 – mmgp