@Python图像处理笔记
一、图像的采样与量化
开发环境Pycharm+Anaconda
需要导入的模块:
// An highlighted block
import matplotlib.pylab as pylab
from PIL import Image
from scipy import signal
from skimage.transform import rescale
import numpy as np
import io
实现代码:
// An highlighted block
# 图像的采样:对图像像素点进行选择或拒绝,属于空间操作。
# 1.上采样:增大图像->猜测未知像素的值->双线性或三次插值的像素领域的内插值
def upResizeImage(im):
im1 = im.resize((im.width * 5, im.height * 5), Image.NEAREST) # 基于最近邻的图像插值导致图像质量较低
im2 = im.resize((im.width * 5, im.height * 5), Image.BILINEAR) # 双线性插值
im3 = im.resize((im.width * 5, im.height * 5), Image.BICUBIC) # 双三次插值
pylab.subplot(2, 2, 1), pylab.imshow(im), pylab.title('origin')
pylab.subplot(2, 2, 2), pylab.imshow(im1), pylab.title('nearest')
pylab.subplot(2, 2, 3), pylab.imshow(im2), pylab.title('bilinear')
pylab.subplot(2, 2, 4), pylab.imshow(im3), pylab.title('bicubic')
pylab.show()
# 2.下采样:缩小图像->删除某些元素->去除黑色斑点和伪影(混叠是因为采样率小于奈奎斯特速率)
def lowResizePIL(im): # PIL.Image.resize 抗混叠
pylab.figure(figsize=(15, 10)), pylab.imshow(im), pylab.show()
im1 = im.resize((im.width // 5, im.height // 5), Image.ANTIALIAS)
def rescaleScikit(im, atalias=False): # scikit-image.rescale 默认false抗混叠
im1 = im.copy()
pylab.figure(figsize=(20, 15))
for i in range(4):
pylab.subplot(2, 2, i + 1), pylab.imshow(im1, cmap='gray'), pylab.axis('off')
pylab.title('image size = ' + str(im1.shape[1]) + 'x' + str(im1.shape[0]))
im1 = rescale(im1, scale=0.5, multichannel=True, anti_aliasing=atalias)
pylab.subplots_adjust(wspace=0.1, hspace=0.1)
pylab.show()
def calc_snr(img, axis=0, ddof=0): # 计算信噪比
a = np.asanyarray(img)
m = a.mean(axis)
sd = a.std(axis=axis, ddof=ddof)
return np.where(sd == 0, 0, m / sd)
# 量化:与图像的强度有关,可以由每个像素所使用的比特数来定义,数字图像通常被量化到256灰度级
# 使用PIL.convert() 进行颜色量化
def quanColor(img):
pylab.figure(figsize=(20, 30))
num_colors = [1 << n for n in range(8, 0, -1)] # << 位操作--左移,二进制的 0000_0001 左移 n 位 = 10、100、1000...
snr_list = []
i = 1
for num_color in num_colors:
im1 = img.convert('P', palette=Image.ADAPTIVE, colors=num_color)
pylab.subplot(2, 4, i), pylab.imshow(im1), pylab.axis('off')
snr_list.append(calc_snr(im1, None))
pylab.title('Image with # colors = ' + str(num_color) + '\nSNR = ' + str(np.round(snr_list[-1], 3)), size=10)
i += 1
pylab.subplots_adjust(wspace=0.2, hspace=0)
pylab.show()
pylab.plot(num_colors,snr_list,'r.-')
pylab.xlabel('Max# colors in the image')
pylab.ylabel('SNR')
pylab.title('Change in SNR with w. r. t. #colors')
pylab.xscale('log',basex=2)
pylab.gca().invert_xaxis()
pylab.show()
if __name__ == '__main__':
clockImg = Image.open(r"..\images\clock.png")
pylab.figure(figsize=(10, 10)), pylab.imshow(clockImg), pylab.show()
upResizeImage(clockImg)
lowResizePIL(clockImg)
# scikit-image.rescale 抗混叠
umbcImg = io.imread(r"..\images\umbc.png")
print(umbcImg.shape)
rescaleScikit(umbcImg)
rescaleScikit(umbcImg, atalias=True)
parrotImg = Image.open(r"..\images\parrot.jpg")
quanColor(parrotImg)
实现结果: