脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python图像处理之图像量化处理详解

Python图像处理之图像量化处理详解

2022-09-09 11:02Eastmount Python

这篇文章将介绍图像量化处理,即将图像像素点对应亮度的连续变化区间转换为单个特定值的过程。文中的示例代码讲解详细,需要的可以参考一下

一.图像量化处理原理

量化(Quantization)旨在将图像像素点对应亮度的连续变化区间转换为单个特定值的过程,即将原始灰度图像的空间坐标幅度值离散化。量化等级越多,图像层次越丰富,灰度分辨率越高,图像的质量也越好;量化等级越少,图像层次欠丰富,灰度分辨率越低,会出现图像轮廓分层的现象,降低了图像的质量。图8-1是将图像的连续灰度值转换为0至255的灰度级的过程[1-3]。

Python图像处理之图像量化处理详解

如果量化等级为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。

Python图像处理之图像量化处理详解

 

二.图像量化实现

图像量化的实现过程是建立一张临时图片,接着循环遍历原始图像中所有像素点,判断每个像素点应该属于的量化等级,最后将临时图像显示。下面的代码将灰度图像转换为两种量化等级[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所示,它将灰度图像划分为两种量化等级。

Python图像处理之图像量化处理详解

 

三.图像量化等级对比

下面的代码分别比较了量化等级为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的量化处理。

Python图像处理之图像量化处理详解

 

四.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所示。

Python图像处理之图像量化处理详解

它通过K-Means聚类算法将彩色人物图像的灰度聚集成八种颜色。核心代码如下:

cv2.kmeans(data, 8, None, criteria, 10, flags)

 

五.总结

本文主要讲解了图像的量化处理,从基本概念到操作,再到扩展进行全方位讲解,并且补充了基于K-Means聚类算法的量化处理案例。该部分的知识点能够将生活中的图像转换为数字图像,更好地为后续的图像处理提供帮助。

以上就是Python图像处理之图像量化处理详解的详细内容,更多关于Python图像量化处理的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/Eastmount/article/details/122789859

延伸 · 阅读

精彩推荐
  • Pythonpandas实现to_sql将DataFrame保存到数据库中

    pandas实现to_sql将DataFrame保存到数据库中

    这篇文章主要介绍了pandas实现to_sql将DataFrame保存到数据库中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    ledao10922021-07-30
  • PythonPython中装饰器学习总结

    Python中装饰器学习总结

    这篇文章主要介绍了Python中装饰器学习总结,分享了相关代码示例,小觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下 ...

    ITxiaoke12002021-01-14
  • Pythonopencv与numpy的图像基本操作

    opencv与numpy的图像基本操作

    这篇文章主要介绍了opencv与numpy的图像基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面...

    邹成卓11222021-06-05
  • PythonPython光学仿真光的偏振编程理解学习

    Python光学仿真光的偏振编程理解学习

    这篇文章主要为大家介绍了通过Python光学仿真来理解光的偏振编程学习,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...

    微小冷10132022-02-12
  • PythonPython实现计算字符串中出现次数最多的字符示例

    Python实现计算字符串中出现次数最多的字符示例

    这篇文章主要介绍了Python实现计算字符串中出现次数最多的字符,涉及Python针对字符串的遍历、统计等相关操作技巧,需要的朋友可以参考下...

    u0102665796222021-05-19
  • Pythonpython 存储json数据的操作

    python 存储json数据的操作

    这篇文章主要介绍了python 存储json数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    秋殇阁5012021-10-26
  • PythonPyChar学习教程之自定义文件与代码模板详解

    PyChar学习教程之自定义文件与代码模板详解

    pycharm默认的【新建】文件,格式很不友好,那么就需要改一下文件模板。下面这篇文章主要给大家介绍了关于PyChar学习教程之自定义文件与代码模板的相关...

    j_hao1043652020-11-26
  • Python使用beaker让Facebook的Bottle框架支持session功能

    使用beaker让Facebook的Bottle框架支持session功能

    这篇文章主要介绍了使用beaker让Facebook的Bottle框架支持session功能,session在Python的Django等框架中内置但在Bottle中并没有被集成,需要的朋友可以参考下 ...

    C Wong5802020-06-11