Python图像处理笔记--采样与量化

@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 位 = 101001000...
    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)

实现结果:

采样
在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值