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

输出结果如图6-4所示,该代码调用matplotlib.pyplot库绘制了四幅图像,其中(a)表示原始图像,(b)表示等级为2的量化处理,(c)表示等级为4的量化处理,(d)表示等级为8的量化处理 。


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

文章插图
1.3 K-Means聚类量化处理上一小节的量化处理是通过遍历图像中的所有像素点,进行灰度图像的幅度值离散化处理 。本小节补充一个基于K-Means聚类算法的量化处理过程,它能够将彩色图像RGB像素点进行颜色分割和颜色量化 。更多知识推荐大家学习前一篇文章 。
# coding: utf-8import cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('people.png') #图像二维像素转换为一维data = https://www.isolves.com/it/cxkf/yy/Python/2022-09-14/img.reshape((-1,3))data = np.float32(data)#定义中心 (type,max_iter,epsilon)criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#设置标签flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚类 聚集成4类compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)#图像转换回uint8二维类型centers = np.uint8(centers)res = centers[labels.flatten()]dst = res.reshape((img.shape))#图像转换为RGB显示img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)dst = cv2.cvtColor(dst, cv2.COLOR_BGR2RGB)#用来正常显示中文标签plt.rcParams['font.sans-serif']=['SimHei']#显示图像titles = [u'原始图像', u'聚类量化 K=4'] images = [img, dst] for i in xrange(2):plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'),plt.title(titles[i])plt.xticks([]),plt.yticks([]) plt.show()输出结果如图6-4所示,它通过K-Means聚类算法将彩色人物图像的灰度聚集成四种颜色 。

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

文章插图
二.图像采样处理2.1 概述图像采样(Image Sampling)处理是将一幅连续图像在空间上分割成M×N个网格,每个网格用一个亮度值或灰度值来表示,其示意图如图6-5所示 。

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

文章插图
图像采样的间隔越大,所得图像像素数越少,空间分辨率越低,图像质量越差,甚至出现马赛克效应;相反,图像采样的间隔越小,所得图像像素数越多,空间分辨率越高,图像质量越好,但数据量会相应的增大 。图6-6展示了不同采样间隔的“Lena”图 。

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

文章插图
2.2 操作下面讲述Python图像采样处理相关代码操作 。其核心流程是建立一张临时图片,设置需要采样的区域大小(如16×16),接着循环遍历原始图像中所有像素点,采样区域内的像素点赋值相同(如左上角像素点的灰度值),最终实现图像采样处理 。代码是进行16×16采样的过程 。
# -*- coding: utf-8 -*-import cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('scenery.png')#获取图像高度和宽度height = img.shape[0]width = img.shape[1]#采样转换成16*16区域numHeight = height/16numwidth = width/16#创建一幅图像new_img = np.zeros((height, width, 3), np.uint8)#图像循环采样16*16区域for i in range(16): #获取Y坐标y = i*numHeight for j in range(16): #获取X坐标x = j*numwidth #获取填充颜色 左上角像素点b = img[y, x][0]g = img[y, x][1]r = img[y, x][2] #循环设置小区域采样 for n in range(numHeight): for m in range(numwidth): new_img[y+n, x+m][0] = np.uint8(b) new_img[y+n, x+m][1] = np.uint8(g) new_img[y+n, x+m][2] = np.uint8(r)#显示图像cv2.imshow("src", img)cv2.imshow("", new_img)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()输出结果如下图所示:

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

文章插图
同样,可以对彩色图像进行采样处理,下面的代码将彩色风景图像采样处理成8×8的马赛克区域 。
# -*- coding: utf-8 -*-import cv2import numpy as npimport matplotlib.pyplot as plt#读取原始图像img = cv2.imread('scenery.png')#获取图像高度和宽度height = img.shape[0]width = img.shape[1]#采样转换成8*8区域numHeight = height/8numwidth = width/8#创建一幅图像new_img = np.zeros((height, width, 3), np.uint8)#图像循环采样8*8区域for i in range(8): #获取Y坐标y = i*numHeight for j in range(8): #获取X坐标x = j*numwidth #获取填充颜色 左上角像素点b = img[y, x][0]g = img[y, x][1]r = img[y, x][2] #循环设置小区域采样 for n in range(numHeight): for m in range(numwidth): new_img[y+n, x+m][0] = np.uint8(b) new_img[y+n, x+m][1] = np.uint8(g) new_img[y+n, x+m][2] = np.uint8(r)#显示图像cv2.imshow("src", img)cv2.imshow("Sampling", new_img)#等待显示cv2.waitKey(0)cv2.destroyAllWindows()


推荐阅读