您好,登錄后才能下訂單哦!
小編給大家分享一下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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。