小编给大家分享一下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聚类算法的量化处理过程,它能够将彩色图像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)
以上是“Python中图像量化处理的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。