Python图像处理:图像量化原理与K-Means聚类实现详解
本文详细解析Python中图像量化的基本原理,通过OpenCV实现不同量化等级(2、4、8级)的灰度图像转换,并展示如何利用K-Means聚类算法对彩色图像进行颜色分割与量化处理。内容涵盖从基础统计量化到基于像素相似性的聚类量化,提供完整代码示例与效果对比,帮助开发者理解图像数字化的核心步骤。
一.图像量化处理原理
量化的核心目标是将图像像素亮度值的连续变化区间映射为离散的特定数值,即对原始灰度图像的空间坐标幅度进行离散化处理。量化等级越高,图像呈现的层次越丰富,灰度分辨率越高,整体画质越好;反之,量化等级较低时,图像层次减少,灰度分辨率降低,容易出现轮廓分层现象,从而降低图像质量。图8-1展示了将连续灰度值转换为0至255范围内离散灰度级的过程[1-3]。

以量化等级为2为例,系统仅使用两种灰度级来代表原始图片的像素(范围0-255):灰度值小于128的像素被赋予0,而大于等于128的像素被赋予128。若量化等级设为4,则使用四种灰度级表示原始像素,新图像将分为四个颜色层级:0-64区间取0,64-128区间取64,128-192区间取128,192-255区间取192,以此类推进行区间划分。
图8-2对比了不同量化等级下“Lena”图像的效果。其中(a)对应量化等级256,(b)为64级,(c)为16级,(d)为8级,(e)为4级,(f)为2级,直观展示了等级降低带来的细节丢失情况。

二.图像量化实现
图像量化的具体实现步骤包括:创建一张临时图像,遍历原始图像的所有像素点,根据预设规则判断每个像素所属的量化等级,最后将处理后的临时图像显示出来。以下代码演示了如何将灰度图像转换为仅包含两种量化等级的形式[4]。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena-hd.png')
#获取图像高度和宽度
height = img.shape[0]
width = img.shape[1]
#创建一幅图像
new_img = 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 = 128
new_img[i, j][k] = np.uint8(gray)
#显示图像
cv2.imshow("src", img)
cv2.imshow("", new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()其输出结果如图8-3所示,该处理将原始灰度图像严格划分为两种量化等级,高亮显示边界效果。

三.图像量化等级对比
以下代码分别测试并比较了量化等级为2、4、8时的量化处理效果[5]。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('lena-hd.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 = 128
new_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 = 192
new_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 = 224
new_img3[i, j][k] = np.uint8(gray)
#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']
#显示图像
titles = ['(a) 原始图像', '(b) 量化-L2', '(c) 量化-L4', '(d) 量化-L8']
images = [img, new_img1, new_img2, new_img3]
for i in range(4):
plt.subplot(2,2,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()输出结果如图8-4所示,该代码调用matplotlib.pyplot库绘制了四幅图像进行对比:(a)为原始图像,(b)为量化等级2的处理结果,(c)为量化等级4的处理结果,(d)为量化等级8的处理结果。

四.K-Means聚类实现量化处理
除了基于像素统计值的直接量化外,还可以依据像素间的相似性进行聚类处理。本节补充介绍一种基于K-Means聚类算法的量化方法,该方法能够对彩色图像的RGB像素点进行颜色分割与量化。此部分旨在引导读者初步了解该思路,关于K-Means聚类的更深入知识将在后续的图像分割文章中详细展开[6]。
# coding: utf-8
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#图像二维像素转换为一维
data = 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, 8, 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 = ['原始图像', '聚类量化 K=8']
images = [img, dst]
for i in range(2):
plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'),
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()输出结果如图8-5所示。

该算法通过K-Means聚类将彩色人物图像的像素灰度聚集成八种主要颜色。核心代码逻辑如下:
cv2.kmeans(data, 8, None, criteria, 10, flags)
五.总结
本文系统讲解了图像量化处理技术,从基本概念出发,逐步深入到具体操作,并扩展介绍了基于K-Means聚类算法的量化案例。掌握这些知识点有助于将现实生活中的图像有效转换为数字图像,为后续更复杂的图像处理任务奠定基础。
以上就是Python图像处理之图像量化处理详解的详细内容,更多关于Python图像量化处理的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









