彩色圖像的直方圖處理是一種重要的圖像處理技術(shù),用于改善圖像的視覺效果,增強(qiáng)圖像的對(duì)比度,或?yàn)楹罄m(xù)的圖像處理任務(wù)(如圖像分割、特征提?。┳鰷?zhǔn)備。彩色圖像通常由紅色(R)、綠色(G)、藍(lán)色(B)三個(gè)顏色通道組成,因此彩色圖像的直方圖處理相比單色圖像更為復(fù)雜。
直方圖的構(gòu)建:
首先,對(duì)于彩色圖像的每個(gè)顏色通道(R、G、B),分別計(jì)算其直方圖。直方圖是一個(gè)圖表,顯示了每個(gè)像素強(qiáng)度值(通常是0-255)在圖像中出現(xiàn)的頻率。
對(duì)于每個(gè)通道,直方圖將有256個(gè)可能的強(qiáng)度值(或“桶”),每個(gè)桶的高度表示該強(qiáng)度值在相應(yīng)通道中出現(xiàn)的次數(shù)。
直方圖均衡化:
直方圖均衡化是一種常見的彩色圖像直方圖處理方法,目的是增強(qiáng)圖像的全局對(duì)比度。
在這個(gè)過程中,對(duì)每個(gè)顏色通道的直方圖進(jìn)行變換,使得最終的輸出圖像的直方圖具有大致均勻的分布。這意味著在調(diào)整后的圖像中,每個(gè)強(qiáng)度值的像素大致相同。
這種方法特別適用于圖像的背景和前景都很暗或者都很亮的情況。
直方圖規(guī)定化(匹配):
直方圖規(guī)定化是另一種方法,它涉及修改一個(gè)圖像的直方圖以匹配另一個(gè)特定圖像的直方圖。
這通常用于標(biāo)準(zhǔn)化不同圖像的光照條件,或者在特定應(yīng)用中使圖像風(fēng)格一致。
局部直方圖處理:
除了對(duì)整個(gè)圖像進(jìn)行直方圖處理,還可以對(duì)圖像的局部區(qū)域進(jìn)行處理,以增強(qiáng)局部對(duì)比度或特定區(qū)域的細(xì)節(jié)。
顏色空間轉(zhuǎn)換:
在進(jìn)行直方圖處理之前,有時(shí)會(huì)將圖像從RGB顏色空間轉(zhuǎn)換到其他顏色空間,如HSV(色相、飽和度、亮度)或YCbCr,因?yàn)樵谶@些顏色空間中進(jìn)行處理有時(shí)會(huì)得到更好的視覺效果或更符合特定應(yīng)用的需求。
彩色圖像直方圖處理的關(guān)鍵在于理解和操作圖像的顏色分布,以及如何通過調(diào)整這些分布來改善圖像的整體或局部視覺質(zhì)量。正確應(yīng)用這些技術(shù)可以顯著提升圖像的視覺效果和適用性。
代碼實(shí)現(xiàn)下圖
提示
結(jié)果圖顯示了分別對(duì)R、G、B分量進(jìn)行直方圖均衡和將原圖轉(zhuǎn)換到HSI空間后保留H、S不變,只對(duì)I分量進(jìn)行直方圖均衡的結(jié)果。
圖像分量的分離和合并可以用cv2.split和cv2.merge函數(shù)實(shí)現(xiàn),直方圖均衡仍然用cv2.equalizeHist函數(shù)實(shí)現(xiàn)。
由于cv2.equalizeHist規(guī)定參數(shù)必須是uint8類型的,所以得到[0,1]范圍內(nèi)的I分量后還需將其轉(zhuǎn)換到[0,255]范圍內(nèi)并進(jìn)行類型轉(zhuǎn)換I_uint8 = (I*255).astype(np.uint8)后再進(jìn)行直方圖均衡。最后,將未改變的H、S分量和均衡后的I分量合并并轉(zhuǎn)換為R、G、B分量。
python代碼
import cv2
import numpy as np
import math
from matplotlib import pyplot as plt
# RGB轉(zhuǎn)HSI,輸入的三分量值域范圍為[0,255],輸出均在[0,1]之間
def RGB2HSI(r, g, b):
r = r / 255
g = g / 255
b = b / 255
num = 0.5 * ((r-g) + (r-b))
den = ((r-g) ** 2 + (r-b) * (g-b)) ** 0.5
h = math.acos(num / (den+1e-10))
if b > g:
h = 2*np.pi - h
s = 1 - 3*min(r, g, b) / (r+g+b+1e-10)
i = (r+g+b) / 3
h = h / (2*np.pi)
return h, s, i
# HSI轉(zhuǎn)RGB,輸入和輸出的值域范圍均為[0,1]
def HSI2RGB(h, s, i):
h = h * 2 * np.pi
if h < 2*np.pi/3:
b = i * (1 - s)
r = i * (1 + s * math.cos(h) / math.cos(np.pi/3 - h))
g = 3*i - (b+r)
elif h < 4*np.pi/3:
r = i * (1 - s)
g = i * (1 + s * math.cos(h - 2*np.pi/3) / math.cos(np.pi - h))
b = 3 * i - (r + g)
else:
g = i * (1 - s)
b = i * (1 + s * math.cos(h - 4*np.pi/3) / math.cos(5*np.pi/3 - h))
r = 3 * i - (g + b)
return r, g, b
img = cv2.imread('Fig0637.tif')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
rows = img.shape[0]
cols = img.shape[1]
# 分別對(duì)R,G,B三個(gè)分量執(zhí)行直方圖均衡
(R, G, B) = cv2.split(img)
R_equ = cv2.equalizeHist(R)
G_equ = cv2.equalizeHist(G)
B_equ = cv2.equalizeHist(B)
img1 = cv2.merge([R_equ, G_equ, B_equ])
# RGB空間轉(zhuǎn)換到HSI空間
H = np.zeros((rows, cols))
S = np.zeros((rows, cols))
I = np.zeros((rows, cols))
for x in range(rows):
for y in range(cols):
r, g, b = img[x, y, :]
H[x, y], S[x, y], I[x, y] = RGB2HSI(r, g, b)
# 將強(qiáng)度分量I轉(zhuǎn)換到[0,255]范圍內(nèi)再進(jìn)行直方圖均衡
I_uint8 = (I*255).astype(np.uint8)
# hist = cv2.calcHist([I_uint8], [0], None, [256], [0, 256])
# plt.subplot(1,2,1)
# plt.plot(hist)
I_equ = cv2.equalizeHist(I_uint8)
# hist_equ = cv2.calcHist([I_equ], [0], None, [256], [0, 256])
I_equ = I_equ / 255
# plt.subplot(1,2,2)
# plt.plot(hist_equ)
# plt.show()
# 保持色調(diào)H和飽和度S不變,結(jié)合均衡化后的強(qiáng)度I,轉(zhuǎn)回RGB空間
R_new = np.zeros((rows, cols))
G_new = np.zeros((rows, cols))
B_new = np.zeros((rows, cols))
for x in range(rows):
for y in range(cols):
h = H[x, y]
s = S[x, y]
i = I_equ[x, y]
# i = I[x, y]
R_new[x, y], G_new[x, y], B_new[x, y] = HSI2RGB(h, s, i)
#R_new = (255*(R_new-R_new.min())/(R_new.max()-R_new.min())).astype(np.uint8)
#G_new = (255*(G_new-G_new.min())/(G_new.max()-G_new.min())).astype(np.uint8)
#B_new = (255*(B_new-B_new.min())/(B_new.max()-B_new.min())).astype(np.uint8)
img2 = cv2.merge([R_new, G_new, B_new])
img2 = np.clip(img2, 0, 1)
plt.subplot(1, 3, 1)
plt.imshow(img)
plt.axis('off')
plt.title('orig zzinal')
plt.subplot(1, 3, 2)
plt.imshow(img1)
plt.axis('off')
plt.title('RGB_hist_equ')
plt.subplot(1, 3, 3)
plt.imshow(img2)
plt.axis('off')
plt.title('I_hist_equ')
plt.show()
結(jié)果展示
文章來源:http://www.zghlxwxcb.cn/news/detail-817865.html
總結(jié)
在灰度圖像處理中,直方圖均衡化自動(dòng)地確定一種變換,改變換試圖產(chǎn)生具有均勻灰度的直方圖。由于彩色圖像是由多個(gè)分量組成的,所以必須考了適應(yīng)多于一個(gè)分量的直方圖的灰度級(jí)技術(shù)。獨(dú)立地進(jìn)行彩色圖像分量的直方圖均衡通常是不可取的,這將產(chǎn)生不正確的彩色。一個(gè)更符合邏輯的方法是均勻地?cái)U(kuò)展彩色強(qiáng)度,而保留彩色本身。
圖像直方圖是反映一個(gè)圖像像素分布的統(tǒng)計(jì)表,其橫坐標(biāo)代表了圖像像素的種類,可以是灰度的,也可以是彩色的。縱坐標(biāo)代表了每一種顏色值在圖像中的像素總數(shù)或者占所有像素個(gè)數(shù)的百分比。圖像是由像素構(gòu)成,因?yàn)榉从诚袼胤植嫉闹狈綀D往往可以作為圖像一個(gè)很重要的特征。直方圖的顯示方式是左暗又亮,左邊用于描述圖像的暗度,右邊用于描述圖像的亮度。文章來源地址http://www.zghlxwxcb.cn/news/detail-817865.html
到了這里,關(guān)于彩色圖像處理之彩色圖像直方圖處理的python實(shí)現(xiàn)——數(shù)字圖像處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!