我对matlab相当陌生,但我希望有人可以帮助解决这个问题。所以我有一张彩色图像,我想将其转换为灰度,然后减少灰度级的数量。所以我读入图像并使用 rgb2gray() 将图像转换为灰度。但是,我不确定如何将图像转换为仅使用 32 个灰度级而不是 255 个灰度级。
我试图使用颜色图(灰色(32)),但这似乎对绘制的图像本身或图像下的颜色条没有影响。所以我不知道还能去哪里看。那里有任何提示吗?谢谢。
我对matlab相当陌生,但我希望有人可以帮助解决这个问题。所以我有一张彩色图像,我想将其转换为灰度,然后减少灰度级的数量。所以我读入图像并使用 rgb2gray() 将图像转换为灰度。但是,我不确定如何将图像转换为仅使用 32 个灰度级而不是 255 个灰度级。
我试图使用颜色图(灰色(32)),但这似乎对绘制的图像本身或图像下的颜色条没有影响。所以我不知道还能去哪里看。那里有任何提示吗?谢谢。
虽然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
相应bits = 4
量化bits = 3
:
现在相同的图像,但通过做量化(img/(256/(2^bits)))*(256/(2^bits))
:
这不是一个病态的例子。
您可以通过简单的舍入来减少图像中不同值的数量:
I = rgb2gray(imread('image.gif'));
J = 8*round(I/8)
见imhist(I)
和imhist(J)
的效果。
但是,如果您想减小图像大小,最好使用 Photoshop、Gimp 或 IrfanView 等图像处理程序,并将其保存为 32 色 gif。这样,您实际上会减少文件的调色板,我认为这是 Matlab 无法做到的。
检查您的图像数据的类型是否是uint8
我怀疑的。如果是这种情况,将图像除以 8 以滥用整数除法的地板效应,再乘以 8,您就设置好了:I2=(I/8)*8
。I2
将只有 32 个灰度级。