python中图像处理,python图像数据处理
本文将介绍图像量化,即将图像像素对应的亮度连续变化区间转换为单一特定值的过程。本文中的示例代码解释的很详细,有需要的可以参考一下。
00-1010一、图像量化处理原理二。图像量化的实现。图像量化级别的比较。用K-均值聚类实现量化处理v .综述
目录
量化是将图像像素对应的亮度连续变化区间转换为单一特定值的过程,即离散化原始灰度图像的空间坐标幅值。量化级数越多,图像层次越丰富,灰度分辨率越高,图像质量越好。量化级数越少,图像层次越不丰富,灰度分辨率越低,就会出现图像轮廓分层的现象,降低图像质量。图8-1是将图像的连续灰度值转换成0到255的灰度级的过程[1-3]。
如果量化级别为2,将使用两个灰度级(0-255)来表示原始图片的像素,小于128的灰度值为0,大于等于128的灰度值为128;如果量化级别是4,将使用四个灰度级来表示原始图像的像素,并且新图像将被分层为四种颜色,0表示区间0-64,64表示区间64-128,128表示区间128-192,192表示区间192-255,等等。
图8-2是比较不同量化等级的“Lena”图。(a)的量化级别是256,(b)是64,(c)是16,(d)是8,(e)是4,(f)是2。
一.图像量化处理原理
图像量化的实现过程是创建一个临时图像,然后循环遍历原始图像中的所有像素,判断每个像素应该属于哪个量化级别,最后显示临时图像。下面的代码将灰度图像转换成两种量化级别[4]。
# -*-编码: utf-8 -*-
# By:伊斯特蒙特
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读原文图片
img=cv2.imread(lena-hd.png )
#获取图像的高度和宽度
height=img.shape[0]
width=img.shape[1]
#创建图像
new_img=np.zeros((高度,宽度,3),np.uint8)
#图像量化操作的量化级别是2。
对于在范围(高度):的I
对于范围(宽度):内的j
对于范围(3)中的k, #对应于BGR三个分量
if img[i,j][k] 128:
灰色=0
else:
灰色=128
new_img[i,j][k]=np.uint8(灰色)
#显示图像
cv2.imshow(src ,img)
cv2.imshow( ,new_img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如图8-3所示,它将灰度图像分为两个量化级别。
二.图像量化实现
以下代码比较了量化级别2、4和8的量化效果[5]。
# -*-编码: utf-8 -*-
# By:伊斯特蒙特
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读原文图片
img=cv2.imread(lena-hd.png )
#获取图像的高度和宽度
height=img.shape[0]
width=img.shape[1]
#创建图像
new_img1=np.zeros((高度,宽度,3),np.uint8)
new_img2=np.zeros((高度,宽度,3),np.uint8)
new_img3=np.zeros((height,width,3),np.uint8)
#图像量化级别2的量化处理
对于在范围(高度):的I
对于范围内的j(
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图像量化处理的资料请关注盛行IT软件开发工作室其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。