Python圖像處理之圖像量化處理詳解
一.圖像量化處理原理
量化(Quantization)旨在將圖像像素點對應亮度的連續(xù)變化區(qū)間轉(zhuǎn)換為單個特定值的過程,即將原始灰度圖像的空間坐標幅度值離散化。量化等級越多,圖像層次越豐富,灰度分辨率越高,圖像的質(zhì)量也越好;量化等級越少,圖像層次欠豐富,灰度分辨率越低,會出現(xiàn)圖像輪廓分層的現(xiàn)象,降低了圖像的質(zhì)量。圖8-1是將圖像的連續(xù)灰度值轉(zhuǎn)換為0至255的灰度級的過程[1-3]。

如果量化等級為2,則將使用兩種灰度級表示原始圖片的像素(0-255),灰度值小于128的取0,大于等于128的取128;如果量化等級為4,則將使用四種灰度級表示原始圖片的像素,新圖像將分層為四種顏色,0-64區(qū)間取0,64-128區(qū)間取64,128-192區(qū)間取128,192-255區(qū)間取192,依次類推。
圖8-2是對比不同量化等級的“Lena”圖。其中(a)的量化等級為256,(b)的量化等級為64,(c)的量化等級為16,(d)的量化等級為8,(e)的量化等級為4,(f)的量化等級為2。

二.圖像量化實現(xiàn)
圖像量化的實現(xiàn)過程是建立一張臨時圖片,接著循環(huán)遍歷原始圖像中所有像素點,判斷每個像素點應該屬于的量化等級,最后將臨時圖像顯示。下面的代碼將灰度圖像轉(zhuǎn)換為兩種量化等級[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]
#創(chuàng)建一幅圖像
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()其輸出結(jié)果如圖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]
#創(chuàng)建一幅圖像
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()輸出結(jié)果如圖8-4所示,該代碼調(diào)用matplotlib.pyplot庫繪制了四幅圖像,其中(a)表示原始圖像,(b)表示等級為2的量化處理,(c)表示等級為4的量化處理,(d)表示等級為8的量化處理。

四.K-Means聚類實現(xiàn)量化處理
除了通過對像素進行統(tǒng)計比較量化處理,還可以根據(jù)像素之間的相似性進行聚類處理。這里補充一個基于K-Means聚類算法的量化處理過程,它能夠?qū)⒉噬珗D像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')?
#圖像二維像素轉(zhuǎn)換為一維
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)
#圖像轉(zhuǎn)換回uint8二維類型
centers = np.uint8(centers)
res = centers[labels.flatten()]
dst = res.reshape((img.shape))
#圖像轉(zhuǎn)換為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()輸出結(jié)果如圖8-5所示。

它通過K-Means聚類算法將彩色人物圖像的灰度聚集成八種顏色。核心代碼如下:
cv2.kmeans(data, 8, None, criteria, 10, flags)
五.總結(jié)
本文主要講解了圖像的量化處理,從基本概念到操作,再到擴展進行全方位講解,并且補充了基于K-Means聚類算法的量化處理案例。該部分的知識點能夠?qū)⑸钪械膱D像轉(zhuǎn)換為數(shù)字圖像,更好地為后續(xù)的圖像處理提供幫助。
以上就是Python圖像處理之圖像量化處理詳解的詳細內(nèi)容,更多關于Python圖像量化處理的資料請關注腳本之家其它相關文章!
相關文章
Python 常用日期處理 -- calendar 與 dateutil 模塊的使用
這篇文章主要介紹了Python如何使用calendar 與 dateutil 模塊處理日期,幫助大家更好的理解和學習python,感興趣的朋友可以了解下2020-09-09
Django使用mysqlclient服務連接并寫入數(shù)據(jù)庫的操作過程
這篇文章主要介紹了Django使用mysqlclient服務連接并寫入數(shù)據(jù)庫,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07
Python PyQt5干貨滿滿小項目輕松實現(xiàn)高效摳圖去背景
PyQt5以一套Python模塊的形式來實現(xiàn)功能。它包含了超過620個類,600個方法和函數(shù)。本篇文章手把手帶你用PyQt5輕松實現(xiàn)圖片扣除背景,大家可以在過程中查缺補漏,提升水平2021-11-11
TensorFlow神經(jīng)網(wǎng)絡構(gòu)造線性回歸模型示例教程
這篇文章主要為大家介紹了TensorFlow構(gòu)造線性回歸模型示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11
python基于tkinter實現(xiàn)gif錄屏功能
一直在思索實現(xiàn)一個透明的窗體,然后可以基于這個窗體可以開發(fā)出各種好玩的應用,這一期,我們將實現(xiàn)有趣的GIF錄屏功能2021-05-05
Python requests.post方法中data與json參數(shù)區(qū)別詳解
這篇文章主要介紹了Python requests.post方法中data與json參數(shù)區(qū)別詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
在NumPy中創(chuàng)建空數(shù)組/矩陣的方法
今天小編就為大家分享一篇在NumPy中創(chuàng)建空數(shù)組/矩陣的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06

