圖片處理-opencv-13.圖像量化處理

圖像量化處理

圖像通常是自然界景物的客觀反映,并以照片形式或視頻記錄的介質(zhì)連續(xù)保存,獲取圖像的目標(biāo)是從感知的數(shù)據(jù)中產(chǎn)生數(shù)字圖像,因此需要把連續(xù)的圖像數(shù)據(jù)離散化,轉(zhuǎn)換為數(shù)字化圖像,其工作主要包括兩方面——量化和采樣。數(shù)字化幅度值稱為量化,數(shù)字化坐標(biāo)值稱為采樣。

所謂量化(Quantization),就是將圖像像素點對應(yīng)亮度的連續(xù)變化區(qū)間轉(zhuǎn)換為單個特定值的過程,即將原始灰度圖像的空間坐標(biāo)幅度值離散化。量化等級越多,圖像層次越豐富,灰度分辨率越高,圖像的質(zhì)量也越好;量化等級越少,圖像層次欠豐富,灰度分辨率越低,會出現(xiàn)圖像輪廓分層的現(xiàn)象,降低了圖像的質(zhì)量。

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))

#讀取原始圖像
img = cv2.imread('data/test3.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#獲取圖像高度和寬度
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)

#用來正常顯示中文標(biāo)簽
plt.rcParams['font.sans-serif'] = ['SimHei']

#顯示圖像
titles = [u'(a) 原始圖像', u'(b) 量化-L2', u'(c) 量化-L4']
images = [img, new_img1, new_img2]
for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray'),
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()
image.png

K-Means聚類量化處理

import cv2
import numpy as np
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))

#讀取原始圖像
img = cv2.imread('data/test3.jpg')

#圖像二維像素轉(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, 4, 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 = [u'原始圖像', u'聚類量化 K=4']
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()
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容