目錄
引言
一、彩色基礎(chǔ)
二、彩色模型
2.1 RGB彩色模型
2.2 CMY和CMYK彩色模型
?2.3 HSI彩色模型
三、偽彩色圖像處理
3.1 灰度分層
3.2 灰度到彩色的變換
四、彩色變換
?編輯色調(diào)與色彩校正
五、平滑與銳化
5.1 平滑
5.2 銳化
引言
????????在圖像處理中,彩色的運(yùn)用受兩個(gè)主要因素的推動(dòng)。第一,彩色是--個(gè)強(qiáng)有力的描繪子,它常??珊?jiǎn)化從場(chǎng)景中提取和識(shí)別目標(biāo);第二,人可以辨別幾千種彩色色調(diào)和亮度,但相比之下只能辨別幾十種灰度色調(diào)。第二個(gè)因素在人工圖像分析中特別重要。
????????彩色圖像處理可分為兩個(gè)主要領(lǐng)域:全彩色處理和偽彩色處理.在第一類中,通常要求圖像用全彩色傳感器獲取,如彩色電視攝像機(jī)或彩色掃描儀。在第二類中,問題是對(duì)一-種特定的單色灰度或灰度范圍賦予一種顏色。 到目前為止,多數(shù)數(shù)字彩色圖像處理是在偽彩色層面完成的。但是在過去的十年里彩色傳感器和用于處理彩色圖像的硬件在價(jià)格上變得更加容易接受,因此彩色圖像處理技術(shù)應(yīng)用如今十分廣泛。
一、彩色基礎(chǔ)
????????1666年,牛頓發(fā)現(xiàn),當(dāng)一束太陽光通過一個(gè)玻璃棱鏡時(shí),會(huì)出現(xiàn)由一端為紫色、另一端為紅色的連續(xù)色譜組成的光束。
????????如上圖所示,色譜由上往下分為紅、橙、黃、綠、藍(lán)、靛、紫,在觀察色譜時(shí),顏色并不是突變二十平滑的過度到下一個(gè)顏色的。基本上,人類和某些其他動(dòng)物感知一個(gè)物體顏色是由物體反射光的性質(zhì)決定的。
????????可見光由電磁波譜中相對(duì)較窄的頻段組成,一個(gè)物體反射的光如果在所有可見光波長(zhǎng)范圍內(nèi)是平衡的,那么對(duì)于觀察者而言顯示的就是白色的。一個(gè)物體反射有限的可見光譜,則物體呈現(xiàn)某種顏色。
? ? ? ? 光的特性是彩色科學(xué)的核心。如果光是無色的,它的屬性就僅僅只是亮度或者數(shù)值。無色光就是觀察者在黑白電視上看到的光,且是迄今為止我們對(duì)圖像處理的討論的隱含分量。對(duì)于我們?nèi)祟惗?,由于人眼中的錐狀細(xì)胞是負(fù)責(zé)彩色視覺的傳感器,其主要可感知3個(gè)顏色,包括紅色,綠色,和藍(lán)色,這三種顏色又被稱為三原色(RGB)。原色相加可以產(chǎn)生二次色,如深紅色、青色和黃色,以正確的亮度將三原色或二次色相對(duì)應(yīng)的原色混合就可以產(chǎn)生白光。
?????????通常用以區(qū)別不同顏色特性的是亮度、色調(diào)和飽和度。亮度具體表達(dá)了無色的強(qiáng)度概念.色調(diào)是光波混合中與主波長(zhǎng)有關(guān)的屬性。色調(diào)表示觀察者感知的主要顏色。這樣,當(dāng)我們說一個(gè)物體為紅色、橙色或黃色時(shí),指的是其色調(diào).飽和度指的是相對(duì)的純凈度,或一種顏色混合白光的數(shù)量。純譜色是全飽和的。如深紅色(紅加白)和淡紫色(紫加白)這樣的彩色是欠飽和的,飽和度與所加白光的數(shù)量成反比。
????????色調(diào)與飽和度一起稱為色度,因此,顏色可用其亮度和色度來表征。形成任何特殊彩色的紅、綠、藍(lán)的數(shù)量稱為三色值,并分別表示為X, Y和Z。這樣,一種顏色就可由其三色值系數(shù)定義為:;x,y,z三者相加結(jié)果為1。
二、彩色模型
????????彩色模型(也稱為彩色空間或彩色系統(tǒng))的目的是在某些標(biāo)準(zhǔn)下用通??梢越邮艿姆绞椒奖愕貙?duì)彩色加以說明。本質(zhì)上,彩色模型是坐標(biāo)系統(tǒng)和子空間的說明,其中,位于系統(tǒng)中的每種顏色都由單個(gè)點(diǎn)來表示。
2.1 RGB彩色模型
????????在RGB模型中,每種顏色出現(xiàn)在紅、綠、藍(lán)的原色光譜分量中。該模型基于笛卡兒坐標(biāo)系。所考慮的彩色子空間下圖的立方體,圖中RGB原色值位于3個(gè)角上;二次色青色、深紅色和黃色位于另外3個(gè)角上,黑色位于原點(diǎn)處,白色位于離原點(diǎn)最遠(yuǎn)的角上。在該模型中,灰度(RGB值相等的點(diǎn))沿著連接這兩點(diǎn)的直線從黑色延伸到白色。在這一模型中的不同顏色是位于立方體上的或立方體內(nèi)部的點(diǎn),且由自原點(diǎn)延伸的向量來定義。
????????在RGB彩色模型中表示的圖像由3個(gè)分量圖像組成,每種原色一幅分量圖像。
當(dāng)紅藍(lán)綠三色分別有一個(gè)顏色沒有時(shí)
temp = np.zeros([512, 512], np.uint8)
x = np.linspace(0, 1, temp.shape[0])
X = np.uint8(normalize(x) * 255)
X = np.tile(X, [512, 1])
y = np.linspace(0, 1, temp.shape[0])
Y = np.uint8(normalize(y) * 255)
Y = np.tile(Y, [512, 1])
# R=0
R_1 = temp
G_1 = X
B_1 = np.rot90(Y)
# G=0
B_2 = np.rot90(Y)
R_2 = np.flip(X)
G_2 = temp
# B=0
B_3 = temp
G_3 = X
R_3 = np.rot90(np.fliplr(Y))
plt.figure(figsize=(20, 5))
plt.gray()
plt.subplot(343), plt.imshow(R_1, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(342), plt.imshow(G_1, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(341), plt.imshow(B_1, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(347), plt.imshow(R_2, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(346), plt.imshow(G_2, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(345), plt.imshow(B_2, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 4, 11), plt.imshow(R_3, ), plt.title('Red Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 4, 10), plt.imshow(G_3, ), plt.title('Green Channel'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 4, 9), plt.imshow(B_3, ), plt.title('Blue Channel'), plt.xticks([]), plt.yticks([])
img1 = np.dstack([R_1, G_1, B_1])
img2 = np.dstack([R_2, G_2, B_2])
img3 = np.dstack([R_3, G_3, B_3])
plt.subplot(3, 4, 4), plt.imshow(img1), plt.title('result'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 4, 8), plt.imshow(img2), plt.title('result'), plt.xticks([]), plt.yticks([])
plt.subplot(3, 4, 12), plt.imshow(img3), plt.title('result'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()
2.2 CMY和CMYK彩色模型
? ? ? ? 我們知道青色、深紅色、黃色是光的二次色,即顏料的原色。大多數(shù)在紙上沉積彩色顏料的設(shè)備,如彩色打印機(jī)和復(fù)印機(jī)要求輸入CMY數(shù)據(jù)或在內(nèi)部進(jìn)行RGB到CMY的轉(zhuǎn)換。
?CMY轉(zhuǎn)換到CMKY
def rgb_cmy(img):
img_norm = normalize(img).astype(np.float32)
img_cmy = 1 - img_norm
return img_cmy
def rgb_cmyk(img):
height, width, channel = img.shape
img_cmy = 1 - normalize(img).astype(np.float32)
img_c = np.zeros((height, width), dtype=np.float32)
img_m = np.zeros((height, width), dtype=np.float32)
img_y = np.zeros((height, width), dtype=np.float32)
img_k = np.zeros((height, width), dtype=np.float32)
for h in range(height):
for w in range(width):
temp = img[h, w]
k = min(temp[0], temp[1], temp[2])
c, m, y = img_cmy[h, w]
if k == 1:
img_c[h, w] = 0
img_m[h, w] = 0
img_y[h, w] = 0
img_k[h, w] = 1
else:
img_c[h, w] = (c - k) / (1 - k)
img_m[h, w] = (m - k) / (1 - k)
img_y[h, w] = (y - k) / (1 - k)
img_k[h, w] = k
img_cmyk = np.dstack((img_c, img_m, img_y, img_k))
img_dst = normalize(img_cmyk)
return img_dst
img_ori = cv2.imread('D:\\picture\\test.jpg')
img_ori_norm = normalize(img_ori).astype(np.float32)
img_rgb = img_ori_norm[:, :, ::-1]
plt.figure(figsize=(20, 5))
img_cmy = rgb_cmy(img_rgb)
img_cmyk = rgb_cmyk(img_rgb)
plt.subplot(131), plt.imshow(img_rgb, ), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.imshow(img_cmy, ), plt.title('CMY'), plt.xticks([]), plt.yticks([])
plt.subplot(133), plt.imshow(img_cmyk, ), plt.title('CMYK'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()
?2.3 HSI彩色模型
? ? ? ? RGB和CMY模型無法很好的適應(yīng)實(shí)際上人類解釋的顏色,當(dāng)人觀察一個(gè)彩色物體時(shí),一般使用色調(diào)、飽和度、亮度來描述它,色調(diào)是一個(gè)純色的顏色屬性,而飽和度是一種純色被白光稀釋的程度的度量。亮度則是一種主觀描述,無法被實(shí)際度量。體現(xiàn)了無色的強(qiáng)度概念是描述彩色感覺的關(guān)鍵因子之一。HSI模型可在彩色圖像中從攜帶彩色信息中消去強(qiáng)度分量的影響。因此,HSI模型是開發(fā)基于彩色描述的圖像處理算法的理想工具,這種彩色描述對(duì)于人而言是自然且直觀的。
RGB模型和HSI模型的概念關(guān)系
從RGB到HSI的彩色轉(zhuǎn)換
? ? ? ? 對(duì)于給定的一幅RGB彩色格式圖像,每個(gè)RGB像素的H分量可用下式表示:
其中:
飽和度分量為:
強(qiáng)度分量為:
HSI到RGB的的彩色轉(zhuǎn)換
RG扇區(qū)():當(dāng)H的值在該扇區(qū)中時(shí),RGB分量由以下公式給出:
GB扇區(qū)():如果給定的H值在該扇區(qū)中,則首先從H中減去120°,即:
H = H - 120°
RGB分量為:
BR扇區(qū)():H減去240°
RGB分量為:
img = cv2.imread('D:\\picture\\tupian.jpg')
img_hsi = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
plt.figure(figsize=(20, 5))
plt.subplot(121), plt.imshow(img, ), plt.title('Original')
plt.subplot(122), plt.imshow(img_hsi, ), plt.title('HSI')
plt.tight_layout()
plt.show()
三、偽彩色圖像處理
????????偽彩色圖像處理是指基于一種指定的規(guī)則對(duì)灰度值賦以顏色的處理。偽彩色主要應(yīng)用是人目視觀察和解釋單幅圖像或序列圖像中的灰度級(jí)事件。
3.1 灰度分層
? ? ? ? 灰度分層和彩色編碼技術(shù)是偽彩色圖像處理的最簡(jiǎn)單的例子之一。當(dāng)一幅圖像被描述成三維函數(shù),則分層方法可以看成是放置一些平行于該圖像的坐標(biāo)平面的平面,然后,每個(gè)平面在相交的區(qū)域中“切割”圖像函數(shù)。?
? ? ? ? 若對(duì)上圖平面的每一側(cè)賦以不同的顏色,平面上面的任何灰度級(jí)的像素將編碼成一種彩色。該平面之下的任何像素將編碼成另一種顏色。位于平面上的灰度級(jí)本身將被任意賦以兩種彩色之一。
? ? ? ? 令[0,L-1]表示灰度級(jí),代表黑色[f(x,y)=0],并令代表白色[f(x,y)=L-1],灰度級(jí)到彩色賦值根據(jù)如下關(guān)系進(jìn)行:
是與第k個(gè)灰度區(qū)間有關(guān)的顏色,由位于l=k-1和l=k處的分割平面定義。
?密度分層:
def slice1(img_gray):
img_ori = img_gray / 255.
rows, cols = img_ori.shape[:2]
labels = np.zeros([rows, cols])
for i in range(rows):
for j in range(cols):
if (img_ori[i, j] < 0.125):
labels[i, j] = 0
elif (img_ori[i, j] < 0.25):
labels[i, j] = 0.2
elif (img_ori[i, j] < 0.375):
labels[i, j] = 0.4
elif (img_ori[i, j] < 0.5):
labels[i, j] = 0.5
elif (img_ori[i, j] < 0.625):
labels[i, j] = 0.6
elif (img_ori[i, j] < 0.75):
labels[i, j] = 0.8
elif (img_ori[i, j] < 0.875):
labels[i, j] = 0.9
else:
labels[i, j] = 1
return labels
img = cv2.imread('D:\\picture\\test.jpg', 0)
labels = slice1(img)
labels = np.uint8(labels * 255)
img1 = color.label2rgb(labels)
plt.figure(figsize=(20, 5))
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original')
plt.subplot(122), plt.imshow(img1, ), plt.title('RGB')
plt.tight_layout()
plt.show()
?彩色編碼:
def slice(img_gray):
rows, cols = img_gray.shape[:2]
labels = np.zeros([rows, cols], np.uint8)
for i in range(rows):
for j in range(cols):
if (img_gray[i, j] < 250):
labels[i, j] = 125
else:
labels[i, j] = 100
return labels
img = cv2.imread('D:\\picture\\test.jpg', 0)
labels = slice(img)
img_rgb = color.label2rgb(labels)
plt.figure(figsize=(20, 5))
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('Original')
plt.subplot(122), plt.imshow(img_rgb, ), plt.title('RGB')
plt.tight_layout()
plt.show()
3.2 灰度到彩色的變換
相比于前面討論的簡(jiǎn)單分層技術(shù),其他類型的變換更加通用,更能拓寬偽彩色增強(qiáng)結(jié)果的范圍。
上圖便是一種特殊的方法,對(duì)任何輸入像素的灰度執(zhí)行3個(gè)獨(dú)立的變換,之后將3個(gè)變換結(jié)果分別送人彩色電視監(jiān)視器的紅綠藍(lán)通道。
四、彩色變換
彩色變換模型為:
f(x,y)為彩色輸入圖像,g(x,y)是變換后或處理會(huì)的彩色輸出圖像。T作為一個(gè)算子存在。
下面為彩色空間分量的輸出:
img_ori = Image.open('D:\\picture\\tupian.jpg')
img_cmyk = img_ori.convert("CMYK")
img_temp = np.array(img_cmyk)
plt.figure(figsize=(10,30))
plt.subplot(541), plt.imshow(img_cmyk), plt.title('Original')
plt.subplot(545), plt.imshow(img_temp[:, :, 0], 'gray'), plt.title('Cyan')
plt.subplot(546), plt.imshow(img_temp[:, :, 1], 'gray'), plt.title('Magenta')
plt.subplot(547), plt.imshow(img_temp[:, :, 2], 'gray'), plt.title('Yellow')
plt.subplot(5, 4, 8), plt.imshow(img_temp[:, :, 3], 'gray'), plt.title('Black')
img_rgb = np.array(img_ori)
plt.subplot(5, 4, 9), plt.imshow(img_rgb[:, :, 0], 'gray'), plt.title('Red')
plt.subplot(5, 4, 10), plt.imshow(img_rgb[:, :, 1], 'gray'), plt.title('Green')
plt.subplot(5, 4, 11), plt.imshow(img_rgb[:, :, 2], 'gray'), plt.title('Blue')
img_hsi = img_ori.convert("HSV")
img_hsi = np.array(img_hsi)
plt.subplot(5, 4, 13), plt.imshow(img_hsi[:, :, 0], 'gray'), plt.title('Hue')
plt.subplot(5, 4, 14), plt.imshow(img_hsi[:, :, 1], 'gray'), plt.title('Saturation')
plt.subplot(5, 4, 15), plt.imshow(img_hsi[:, :, 2], 'gray'), plt.title('Intensity')
plt.tight_layout()
plt.show()
色調(diào)與色彩校正
彩色變換可在多數(shù)臺(tái)式計(jì)算機(jī)上執(zhí)行,與數(shù)字?jǐn)z像機(jī)、平板掃描儀和噴墨打印機(jī)相連,個(gè)人計(jì)算機(jī)就變成了數(shù)字暗室,允許我們對(duì)圖像進(jìn)行色調(diào)調(diào)整和彩色校正。許多彩色處理系統(tǒng)選擇的模型都是CIE L*a*b模型。公式如下:
是參考白色三激勵(lì)值下的一種完美的漫反射白色。?
def gamma(img, c, gamma):
img = np.array(img).astype(float)
output_img = c * img ** gamma
img_scale = np.uint8((output_img / output_img.max()) * 255)
return img_scale
img_ori = Image.open('D:\\picture\\test.jpg')
img_colour = gamma(img_ori, 1, 1.5)
plt.figure(figsize=(10, 5))
plt.subplot(121), plt.imshow(img_ori), plt.title('Original')
plt.subplot(1, 2, 2), plt.imshow(img_colour), plt.title('Colour Correct')
plt.tight_layout()
plt.show()
五、平滑與銳化
5.1 平滑
算術(shù)均值濾波法
def arithmentic(image, kernel):
img_h = image.shape[0]
img_w = image.shape[1]
m = kernel.shape[0]
n = kernel.shape[1]
# padding
padding_h = int((m - 1) / 2)
padding_w = int((n - 1) / 2)
image_pad = np.pad(image.copy(), (padding_h, padding_w), mode="constant", constant_values=0)
image_convol = image.copy()
for i in range(padding_h, img_h + padding_h):
for j in range(padding_w, img_w + padding_w):
temp = np.sum(image_pad[i - padding_h:i + padding_h + 1, j - padding_w:j + padding_w + 1] * kernel)
image_convol[i - padding_h][j - padding_w] = 1 / (m * n) * temp
image_convol = np.uint8(normalize(image_convol) * 255)
return image_convol
img_ori = cv2.imread('D:\\picture\\test.jpg')
img_ori = img_ori[:, :, ::-1]
img_rgb = np.array(img_ori)
img_hsi = cv2.cvtColor(np.array(img_ori), cv2.COLOR_RGB2HSV)
img_hsi = np.array(img_hsi)
mean_kernal = np.ones([5, 5])
mean_kernal = mean_kernal / (mean_kernal.size)
img_rgb1 = np.zeros(img_rgb.shape, np.uint8)
for i in range(3):
img_temp = img_rgb[:, :, i]
img_dst = arithmentic(img_temp, kernel=mean_kernal)
img_rgb1[:, :, i] = img_dst
img_hsi1 = np.zeros(img_rgb.shape, np.uint8)
for i in range(3):
if i == 2:
img_temp = img_hsi[:, :, i]
img_dst = arithmentic(img_temp, kernel=mean_kernal)
img_hsi1[:, :, i] = img_dst
else:
img_hsi1[:, :, i] = img_hsi[:, :, i]
img_hsi_rgb = cv2.cvtColor(img_hsi1, cv2.COLOR_HSV2RGB)
plt.figure(figsize=(15, 5))
plt.subplot(1, 2, 1), plt.imshow(img_rgb1), plt.title('RGB')
plt.subplot(1, 2, 2), plt.imshow(img_hsi_rgb), plt.title('HSI RGB')
plt.tight_layout()
plt.show()
5.2 銳化
????????考慮采用拉普拉斯方法來處理圖像銳化問題,之前我們有學(xué)過拉普拉斯算子,在RGB彩色系統(tǒng)中,向量的拉普拉斯變換為:
可以通過分別計(jì)算每一個(gè)分量圖像的拉普拉斯來計(jì)算全彩色圖像的拉普拉斯。文章來源:http://www.zghlxwxcb.cn/news/detail-484686.html
def la(img_gray):
kernel_laplacian = np.array((
[1, 1, 1],
[1, -8, 1],
[1, 1, 1]), np.int8)
imgkernel_laplacian = cv2.filter2D(img_gray, -1, kernel_laplacian)
laplacian_img = np.uint8(normalize(img_gray + imgkernel_laplacian) * 255)
return laplacian_img
img_ori = cv2.imread('D:\\picture\\test.jpg')
img_ori = img_ori[:, :, ::-1]
img_rgb = np.array(img_ori)
img_hsi = cv2.cvtColor(np.array(img_ori), cv2.COLOR_RGB2HSV)
img_hsi = np.array(img_hsi)
img_rgb_new = np.zeros(img_rgb.shape, np.uint8)
for i in range(3): # 計(jì)算每個(gè)分量的拉普拉斯
img_temp = img_rgb[:, :, i]
img_dst = la(img_temp)
img_rgb_new[:, :, i] = img_dst
img_hsi1 = np.zeros(img_rgb.shape, np.uint8)
for i in range(3):
if i == 2:
img_temp = img_hsi[:, :, i]
img_dst = la(img_temp)
img_hsi1[:, :, i] = img_dst
else:
img_hsi1[:, :, i] = img_hsi[:, :, i]
img_hsi_rgb = cv2.cvtColor(img_hsi1, cv2.COLOR_HSV2RGB)
plt.figure(figsize=(15, 5))
plt.subplot(1, 2, 1), plt.imshow(img_rgb_new), plt.title('RGB')
plt.subplot(1, 2, 2), plt.imshow(img_hsi_rgb), plt.title('HSI RGB')
plt.tight_layout()
plt.show()
文章來源地址http://www.zghlxwxcb.cn/news/detail-484686.html
到了這里,關(guān)于數(shù)字圖像處理第六章——彩色圖像處理的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!