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

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

二.圖像量化實(shí)現(xiàn)
圖像量化的實(shí)現(xiàn)過(guò)程是建立一張臨時(shí)圖片,接著循環(huán)遍歷原始圖像中所有像素點(diǎn),判斷每個(gè)像素點(diǎn)應(yīng)該屬于的量化等級(jí),最后將臨時(shí)圖像顯示。下面的代碼將灰度圖像轉(zhuǎn)換為兩種量化等級(jí)[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)
#圖像量化操作 量化等級(jí)為2
for i in range(height):
? ? for j in range(width):
? ? ? ? for k in range(3): #對(duì)應(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所示,它將灰度圖像劃分為兩種量化等級(jí)。

三.圖像量化等級(jí)對(duì)比
下面的代碼分別比較了量化等級(jí)為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)
#圖像量化等級(jí)為2的量化處理
for i in range(height):
? ? for j in range(width):
? ? ? ? for k in range(3): #對(duì)應(yīng)BGR三分量
? ? ? ? ? ? if img[i, j][k] < 128:
? ? ? ? ? ? ? ? gray = 0
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? gray = 128
? ? ? ? ? ? new_img1[i, j][k] = np.uint8(gray)
#圖像量化等級(jí)為4的量化處理
for i in range(height):
? ? for j in range(width):
? ? ? ? for k in range(3): #對(duì)應(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)
#圖像量化等級(jí)為8的量化處理
for i in range(height):
? ? for j in range(width):
? ? ? ? for k in range(3): #對(duì)應(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)
#用來(lái)正常顯示中文標(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庫(kù)繪制了四幅圖像,其中(a)表示原始圖像,(b)表示等級(jí)為2的量化處理,(c)表示等級(jí)為4的量化處理,(d)表示等級(jí)為8的量化處理。

四.K-Means聚類(lèi)實(shí)現(xiàn)量化處理
除了通過(guò)對(duì)像素進(jìn)行統(tǒng)計(jì)比較量化處理,還可以根據(jù)像素之間的相似性進(jìn)行聚類(lèi)處理。這里補(bǔ)充一個(gè)基于K-Means聚類(lèi)算法的量化處理過(guò)程,它能夠?qū)⒉噬珗D像RGB像素點(diǎn)進(jìn)行顏色分割和顏色量化。此外,該部分只是帶領(lǐng)讀者簡(jiǎn)單認(rèn)識(shí)該方法,更多K-Means聚類(lèi)的知識(shí)將在圖像分割文章中進(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聚類(lèi) 聚集成4類(lèi)
compactness, labels, centers = cv2.kmeans(data, 8, None, criteria, 10, flags)
#圖像轉(zhuǎn)換回uint8二維類(lèi)型
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)
#用來(lái)正常顯示中文標(biāo)簽
plt.rcParams['font.sans-serif']=['SimHei']
#顯示圖像
titles = ['原始圖像', '聚類(lèi)量化 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所示。

它通過(guò)K-Means聚類(lèi)算法將彩色人物圖像的灰度聚集成八種顏色。核心代碼如下:
cv2.kmeans(data, 8, None, criteria, 10, flags)
五.總結(jié)
本文主要講解了圖像的量化處理,從基本概念到操作,再到擴(kuò)展進(jìn)行全方位講解,并且補(bǔ)充了基于K-Means聚類(lèi)算法的量化處理案例。該部分的知識(shí)點(diǎn)能夠?qū)⑸钪械膱D像轉(zhuǎn)換為數(shù)字圖像,更好地為后續(xù)的圖像處理提供幫助。
以上就是Python圖像處理之圖像量化處理詳解的詳細(xì)內(nèi)容,更多關(guān)于Python圖像量化處理的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Pytorch 如何實(shí)現(xiàn)LSTM時(shí)間序列預(yù)測(cè)
本文主要基于Pytorch深度學(xué)習(xí)框架,實(shí)現(xiàn)LSTM神經(jīng)網(wǎng)絡(luò)模型,用于時(shí)間序列的預(yù)測(cè)2021-05-05
python構(gòu)造icmp echo請(qǐng)求和實(shí)現(xiàn)網(wǎng)絡(luò)探測(cè)器功能代碼分享
本文分享了二個(gè)python示例,python構(gòu)造icmp echo請(qǐng)求、實(shí)現(xiàn)網(wǎng)絡(luò)探測(cè)器功能代碼,類(lèi)似nmap功能2014-01-01
2020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測(cè)可用
這篇文章主要介紹了2020新版本pycharm+anaconda+opencv+pyqt環(huán)境配置學(xué)習(xí)筆記,親測(cè)可用,特此分享到腳本之家平臺(tái),需要的朋友可以參考下2020-03-03
windows及l(fā)inux環(huán)境下永久修改pip鏡像源的方法
不知道有沒(méi)有人跟我一樣,在剛接觸Linux時(shí)被系統(tǒng)更新源問(wèn)題搞得暈頭轉(zhuǎn)向,不同的Linux更新源配置也是不一樣的,另外由于默認(rèn)安裝時(shí)的源大都是外國(guó)的更新源,速度相對(duì)國(guó)內(nèi)會(huì)慢很多,接下來(lái)本文主要介紹在windows和linux兩種系統(tǒng)環(huán)境中更新系統(tǒng)源的方法。2016-11-11
python base64 decode incorrect padding錯(cuò)誤解決方法
這篇文章主要介紹了python base64 decode incorrect padding錯(cuò)誤解決方法,本文使用把string補(bǔ)齊等號(hào)的方法解決了這個(gè)錯(cuò)誤,需要的朋友可以參考下2015-01-01
Python內(nèi)置函數(shù)locals()的具體示例
本文主要介紹了Python中的內(nèi)置函數(shù)locals()的具體用法和應(yīng)用場(chǎng)景,locals()函數(shù)用于獲取當(dāng)前局部符號(hào)表的字典,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09
Python pygame 項(xiàng)目實(shí)戰(zhàn)事件監(jiān)聽(tīng)
這篇文章主要介紹了Python pygame 項(xiàng)目實(shí)戰(zhàn)事件監(jiān)聽(tīng),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
探索Python?Furl高性能URL構(gòu)建解析和操作功能實(shí)例
本文將提供關(guān)于Python?Furl的全面指南,包括安裝和配置、基本概念、URL解析、URL構(gòu)建、查詢(xún)參數(shù)操作、片段處理、實(shí)際應(yīng)用場(chǎng)景以及豐富的示例代碼2024-01-01
python基礎(chǔ)教程之類(lèi)class定義使用方法
Python中的類(lèi)(Class)是一個(gè)抽象的概念,比函數(shù)還要抽象,這也就是Python的核心概念,面對(duì)對(duì)象的編程方法(OOP),其它如:Java、C++等都是面對(duì)對(duì)象的編程語(yǔ)言2014-02-02
Python Opencv使用ann神經(jīng)網(wǎng)絡(luò)識(shí)別手寫(xiě)數(shù)字功能
這篇文章主要介紹了opencv(python)使用ann神經(jīng)網(wǎng)絡(luò)識(shí)別手寫(xiě)數(shù)字,由于這里主要研究knn算法,為了圖簡(jiǎn)單,直接使用Keras的mnist手寫(xiě)數(shù)字解析模塊,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07

