带你认识Python图像量化处理及局部马赛克特效

本文分享自华为云社区《[Python图像处理] 二十.图像量化处理和采样处理及局部马赛克特效》,作者: eastmount 。
本文主要讲述如何进行图像量化处理和采样处理及局部马赛克特效 。
一.图像量化处理图像通常是自然界景物的客观反映,并以照片形式或视频记录的介质连续保存,获取图像的目标是从感知的数据中产生数字图像,因此需要把连续的图像数据离散化,转换为数字化图像,其工作主要包括两方面——量化和采样 。数字化幅度值称为量化,数字化坐标值称为采样 。本章主要讲解图像量化和采样处理的概念,并通过Python/ target=_blank class=infotextkey>Python和OpenCV实现这些功能 。
1.1 概述【带你认识Python图像量化处理及局部马赛克特效】所谓量化(Quantization),就是将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化 。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量 。图6-1是将图像的连续灰度值转换为0至255的灰度级的过程 。

带你认识Python图像量化处理及局部马赛克特效

文章插图
如果量化等级为2,则将使用两种灰度级表示原始图片的像素(0-255),灰度值小于128的取0,大于等于128的取128;如果量化等级为4,则将使用四种灰度级表示原始图片的像素,新图像将分层为四种颜色,0-64区间取0,64-128区间取64,128-192区间取128,192-255区间取192;依次类推 。
图6-2是对比不同量化等级的“Lena”图 。其中(a)的量化等级为256,(b)的量化等级为64,(c)的量化等级为16,(d)的量化等级为8,(e)的量化等级为4,(f)的量化等级为2 。

带你认识Python图像量化处理及局部马赛克特效

文章插图
1.2 操作下面讲述Python图像量化处理相关代码操作 。其核心流程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示 。下述代码将灰度图像转换为两种量化等级 。
# -*- coding: utf-8 -*-import cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('lena.png')#获取图像高度和宽度height = img.shape[0]width = img.shape[1]#创建一幅图像new_img = np.zeros((height, width, 3), np.uint8)#图像量化操作 量化等级为2for i in range(height): for j in range(width): for k in range(3): #对应BGR三分量 if img[i, j][k] < 128:gray = 0 else:gray = 128 new_img[i, j][k] = np.uint8(gray)#显示图像cv2.imshow("src", img)cv2.imshow("", new_img)#等待显示cv2.waitKey(0)cv2.destroyAllwindows()其输出结果如图6-3所示,它将灰度图像划分为两种量化等级 。

带你认识Python图像量化处理及局部马赛克特效

文章插图
下面的代码分别比较了量化等级为2、4、8的量化处理效果 。
# -*- coding: utf-8 -*-import cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('lena.png')#获取图像高度和宽度height = img.shape[0]width = img.shape[1]#创建一幅图像new_img1 = np.zeros((height, width, 3), np.uint8)new_img2 = np.zeros((height, width, 3), np.uint8)new_img3 = np.zeros((height, width, 3), np.uint8)#图像量化等级为2的量化处理for i in range(height): for j in range(width): for k in range(3): #对应BGR三分量 if img[i, j][k] < 128:gray = 0 else:gray = 128new_img1[i, j][k] = np.uint8(gray)#图像量化等级为4的量化处理for i in range(height): for j in range(width): for k in range(3): #对应BGR三分量 if img[i, j][k] < 64:gray = 0 elif img[i, j][k] < 128:gray = 64 elif img[i, j][k] < 192:gray = 128 else:gray = 192new_img2[i, j][k] = np.uint8(gray)#图像量化等级为8的量化处理for i in range(height): for j in range(width): for k in range(3): #对应BGR三分量 if img[i, j][k] < 32:gray = 0 elif img[i, j][k] < 64:gray = 32 elif img[i, j][k] < 96:gray = 64 elif img[i, j][k] < 128:gray = 96 elif img[i, j][k] < 160:gray = 128 elif img[i, j][k] < 192:gray = 160 elif img[i, j][k] < 224:gray = 192 else:gray = 224new_img3[i, j][k] = np.uint8(gray)#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']#显示图像titles = [u'(a) 原始图像', u'(b) 量化-L2', u'(c) 量化-L4', u'(d) 量化-L8'] images = [img, new_img1, new_img2, new_img3] for i in xrange(4):plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'),plt.title(titles[i])plt.xticks([]),plt.yticks([]) plt.show()


推荐阅读