import numpy as np
from PIL import Image
import matplotlib.pylab as pylab
from skimage.io import imread, imshow, show
def signaltonoise(a,axis,ddof=0):
a=np.asanyarray(a)
m=a.mean(axis)
sd=a.std(axis=axis,ddof=ddof)
return np.where(sd==0,0,m/sd)
img=Image.open('C:/Users/xpp/Desktop/Lena.png')#原始图像
pylab.figure(figsize=(30,45))
num_colors_list=[1 << n for n in range(8,0,-1)]#图像颜色数
snr_list=[]
i=1
for num_colors in num_colors_list:
im1=img.convert('P',palette=Image.ADAPTIVE,colors=num_colors)
snr_list.append(signaltonoise(im1,axis=None))
i+=1
pylab.plot(num_colors_list,snr_list,'r.-')
pylab.xlabel('Max# colors in the image')
pylab.ylabel('SNR')
pylab.title('Change in SNR w.r.t. # colors')
pylab.xscale('log',basex=2)
pylab.gca().invert_xaxis()[256, 128, 64, 32, 16, 8, 4, 2]

算法:图像颜色数是图像颜色的量化,包括2,4,8,16,32,64,128,256等。一种最简单而又直接的方式就是定义一个含有256*256*256=16777216个元素的数组,然后循环整幅位图,对位图某处对应的颜色值,计算数组的索引。颜色量化虽然缩小了图像的尺寸(比特/像素的数量),但是图像的质量变差了。通常情况下,信噪比是图像质量的一种度量方法,信噪比越高,图像质量越好。
本文分享自 图像处理与模式识别研究所 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!