Python圖像處理之圖像量化處理詳解
一.圖像量化處理原理
量化(Quantization)旨在將圖像像素點(diǎn)對應(yīng)亮度的連續(xù)變化區(qū)間轉(zhuǎn)換為單個特定值的過程,即將原始灰度圖像的空間坐標(biāo)幅度值離散化。量化等級越多,圖像層次越豐富,灰度分辨率越高,圖像的質(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)遍歷原始圖像中所有像素點(diǎn),判斷每個像素點(diǎn)應(yīng)該屬于的量化等級,最后將臨時圖像顯示。下面的代碼將灰度圖像轉(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): #對應(yīng)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): #對應(yīng)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): #對應(yīng)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): #對應(yīng)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) #用來正常顯示中文標(biāo)簽 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)量化處理
除了通過對像素進(jìn)行統(tǒng)計比較量化處理,還可以根據(jù)像素之間的相似性進(jìn)行聚類處理。這里補(bǔ)充一個基于K-Means聚類算法的量化處理過程,它能夠?qū)⒉噬珗D像RGB像素點(diǎn)進(jìn)行顏色分割和顏色量化。此外,該部分只是帶領(lǐng)讀者簡單認(rèn)識該方法,更多K-Means聚類的知識將在圖像分割文章中進(jìn)行詳細(xì)敘述[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) #設(shè)置標(biāo)簽 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) #用來正常顯示中文標(biāo)簽 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é)
本文主要講解了圖像的量化處理,從基本概念到操作,再到擴(kuò)展進(jìn)行全方位講解,并且補(bǔ)充了基于K-Means聚類算法的量化處理案例。該部分的知識點(diǎn)能夠?qū)⑸钪械膱D像轉(zhuǎn)換為數(shù)字圖像,更好地為后續(xù)的圖像處理提供幫助。
以上就是Python圖像處理之圖像量化處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像量化處理的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python 常用日期處理 -- calendar 與 dateutil 模塊的使用
這篇文章主要介紹了Python如何使用calendar 與 dateutil 模塊處理日期,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09Django使用mysqlclient服務(wù)連接并寫入數(shù)據(jù)庫的操作過程
這篇文章主要介紹了Django使用mysqlclient服務(wù)連接并寫入數(shù)據(jù)庫,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-07-07Python PyQt5干貨滿滿小項目輕松實現(xiàn)高效摳圖去背景
PyQt5以一套Python模塊的形式來實現(xiàn)功能。它包含了超過620個類,600個方法和函數(shù)。本篇文章手把手帶你用PyQt5輕松實現(xiàn)圖片扣除背景,大家可以在過程中查缺補(bǔ)漏,提升水平2021-11-11TensorFlow神經(jīng)網(wǎng)絡(luò)構(gòu)造線性回歸模型示例教程
這篇文章主要為大家介紹了TensorFlow構(gòu)造線性回歸模型示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11python基于tkinter實現(xiàn)gif錄屏功能
一直在思索實現(xiàn)一個透明的窗體,然后可以基于這個窗體可以開發(fā)出各種好玩的應(yīng)用,這一期,我們將實現(xiàn)有趣的GIF錄屏功能2021-05-05Python 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