欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python圖像處理之圖像量化處理詳解

 更新時間:2022年02月07日 10:11:32   作者:Eastmount  
這篇文章將介紹圖像量化處理,即將圖像像素點(diǎn)對應(yīng)亮度的連續(xù)變化區(qū)間轉(zhuǎn)換為單個特定值的過程。文中的示例代碼講解詳細(xì),需要的可以參考一下

一.圖像量化處理原理

量化(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)文章

最新評論