[Python从零到壹] 四十.图像处理基础篇之图像量化处理

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Python从零到壹] 四十.图像处理基础篇之图像量化处理相关的知识,希望对你有一定的参考价值。

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。

上一篇文章介绍图像几何变换,包括图像镜像、图像仿射和图像透视。这篇文章将介绍图像量化处理,即将图像像素点对应亮度的连续变化区间转换为单个特定值的过程。希望文章对您有所帮助,如果有不足之处,还请海涵。

文章目录

下载地址:

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

第四部分 Python图像处理基础

第五部分 Python图像运算和图像增强

第六部分 Python图像识别和图像处理经典案例

第七部分 NLP与文本挖掘

第八部分 人工智能入门知识

第九部分 网络攻防与AI安全

第十部分 知识图谱构建实战

扩展部分 人工智能高级案例

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


一.图像量化处理原理

量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。图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聚类算法的量化处理案例。该部分的知识点能够将生活中的图像转换为数字图像,更好地为后续的图像处理提供帮助。

最近寒假日更,为了感谢读者。同时感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:

祝大家新年快乐,虎年大吉,阖家幸福,万事如意,小珞珞给大家拜年了。亲情是真的很美,很治愈。希望小珞珞和他妈妈能开心每一天,全家人身体健康。小珞珞这小样子可爱极了,爱你们喔!

(By:娜璋之家 Eastmount 2022-02-05 夜于贵阳 https://blog.csdn.net/Eastmount )


参考资料:

  • [1]冈萨雷斯著. 数字图像处理(第3版)[M]. 北京:电子工业出版社,2013.
  • [2]yunfung. 数字图像基础之图像取样和量化(Image Sampling and Quantization)[EB/OL]. (2017-04-23). https://www.cnblogs.com/yunfung/p/6753337.html.
  • [3]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社,2008.
  • [4]Eastmount. [Python图像处理] 三十.图像量化及采样处理万字详细总结[EB/OL]. (2020-11-10). https://blog.csdn.net/Eastmount/article/details/109605161.
  • [5]Eastmount. [数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解[EB/OL]. (2015-05-28). https://blog.csdn.net/eastmount/article/details/46010637.
  • [6]杨秀璋, 颜娜. Python网络数据爬取及分析从入门到精通(分析篇)[M]. 北京:北京航天航空大学出版社, 2018.

以上是关于[Python从零到壹] 四十.图像处理基础篇之图像量化处理的主要内容,如果未能解决你的问题,请参考以下文章

[Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理

[Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解

[Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解

[Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理

[Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解

[Python从零到壹] 四十八.图像增强及运算篇之形态学开运算闭运算和梯度运算