白平衡——圖像處理中的一種增強(qiáng)技術(shù)
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

俗話說,一張圖勝過千言萬語。但是,如果它傳達(dá)的內(nèi)容與我們想看的內(nèi)容不符怎么辦?我們確定它應(yīng)該來自那個圖像,但不幸的是它不是很明顯。如果說,有可能從一幅圖像中發(fā)現(xiàn)我們想要了解的背景,并且很可能在這一過程中獲得一些額外的見解,那會怎么樣?
這就是我們今天要討論的——圖像增強(qiáng)!
圖像增強(qiáng)由一組用于細(xì)化圖像的技術(shù)組成。通過這種方式,圖像在視覺上更容易被人類感知,這反過來將進(jìn)一步促進(jìn)改進(jìn)的圖像處理分析。圖像增強(qiáng)處理技術(shù)包括:
傅里葉變換
白平衡
直方圖處理
對于這篇文章,討論將圍繞python中用于圖像增強(qiáng)的各種白平衡算法的使用展開。但在此之前,讓我們記錄下基本庫。
import numpy as npimport matplotlib.pyplot as pltfrom skimage.io import imread, imshow
首先,什么是白平衡(WB)?這是一個消除不切實(shí)際的色偏的色彩校正過程,以便在我們想要的圖像中正確呈現(xiàn)白色的物體。我們將實(shí)施三種白平衡技術(shù),它們是:
白色補(bǔ)丁算法
灰度世界算法
地面真值算法
為了便于說明,我們將使用下圖:

這種方法是一種典型的顏色恒定性適應(yīng)方法,它搜索最亮的色塊以用作白色參考,類似于人類視覺系統(tǒng)的做法。請注意,要在圖像中觀察到白色,RGB 顏色空間中的每個通道都應(yīng)處于最大值。
Python中的代碼實(shí)現(xiàn):
def white_patch(image, percentile=100):"""White balance image using White patch algorithmParameters----------image : numpy arrayImage to white balancepercentile : integer, optionalPercentile value to consider as channel maximumReturns-------image_wb : numpy arrayWhite-balanced image"""white_patch_image = img_as_ubyte((image*1.0 /np.percentile(image,percentile,axis=(0, 1))).clip(0, 1))return white_patch_image#call the function to implement white patch algorithmskio.imshow(white_patch(lily, 85))

使用白色補(bǔ)丁算法增強(qiáng)百合
正如所觀察到的,可以看到圖像變得相對更亮,中間的百合花變得非常鮮艷,這就是白色補(bǔ)丁算法如何增強(qiáng)圖像的方式。接下來,讓我們看看下一個算法。
灰度世界算法是一種白平衡方法,它假設(shè)圖像平均為中性灰色。如果圖像中的顏色分布良好,則灰度世界假設(shè)成立。考慮到這個假設(shè)為真,平均反射顏色被假設(shè)為光的顏色。因此,我們可以通過查看平均顏色并將其與灰色進(jìn)行比較來估計(jì)照明色偏。
Python中的代碼實(shí)現(xiàn):
def gray_world(image):"""White balance image using Gray-world algorithmParameters----------image : numpy arrayImage to white balanceReturns-------image_wb : numpy arrayWhite-balanced image"""image_grayworld = ((image * (access.mean() /image.mean(axis=(0,1)))).clip(0,255).astype(int))# for images having a transparency channelif image.shape[2] == 4:image_grayworld[:,:,3] = 255return image_grayworld#call the function to implement gray world algorithmskio.imshow(gray_world(lily))

使用灰度世界算法增強(qiáng)百合
如圖,可以看出它與原始圖像并沒有太大的偏差,其原因之一可能是平均顏色及其與灰色的比較并不那么顯著,然后讓我們看看最后一個算法。
到目前為止,我們已經(jīng)對顏色空間在圖像上的表現(xiàn)做了假設(shè)。現(xiàn)在,我們將選擇一個補(bǔ)丁(圖像的一部分)并使用該補(bǔ)丁重新創(chuàng)建我們想要的圖像,而不是對增強(qiáng)圖像做出假設(shè)。
為該圖像選擇的補(bǔ)丁程序如下所示:
from matplotlib.patches import Rectanglefig, ax = plt.subplots()ax.imshow(lily)ax.add_patch(Rectangle((650, 550), 100, 100, edgecolor='b', facecolor='none'));

補(bǔ)丁(包含在藍(lán)色邊框中)

補(bǔ)丁的放大圖像
選擇補(bǔ)丁后,我們現(xiàn)在將繼續(xù)增強(qiáng)我們的圖像。為此,我們可以采用兩種方式:
最大值方法— 將原始圖像的每個通道歸一化為該區(qū)域每個通道的最大值
平均值在方法— 將原始圖像的每個通道歸一化為該區(qū)域每個通道的平均值
Python中的代碼實(shí)現(xiàn):
def ground_truth(image, patch, mode='mean'):"""White balance image using Ground-truth algorithmParameters----------image : numpy arrayImage to white balancrpatch : numpy arrayPatch of "true" whitemode : mean or max, optionalAdjust mean or max of each channel to match patchReturns-------image_wb : numpy arrayWhite-balanced image"""image_patch = img_patchif mode == 'mean':image_gt = ((image * (image_patch.mean() / \image.mean(axis=(0, 1))))\.clip(0, 255)\.astype(int))if mode == 'max':image_gt = ((image * 1.0 / image_patch.max(axis(0,1))).clip(0, 1))#transparency channelif image.shape[2] == 4:image_gt[:,:,3] = 255return image_gt
讓我們看看兩種模式的輸出。
使用最大值方法:
skio.imshow(ground_truth(lily, img_patch, 'max'))
使用地面真值算法增強(qiáng)圖像(最大值模式)
除了生動地強(qiáng)調(diào)百合之外,還可以觀察到花朵周圍的浮葉也得到了增強(qiáng),綠色通道被極大地突出顯示。讓我們看看這與使用均值作為模式有何不同。
使用平均值方法:
skio.imshow(ground_truth(lily, img_patch, 'mean'))
使用地面真值算法增強(qiáng)圖像(平均值模式)
輸出稍微接近白色補(bǔ)丁輸出,但后者更亮。它還強(qiáng)調(diào)了百合花的顏色,但它沒有突出浮葉的顏色,只是提亮了它。
對于地面真值算法,輸出圖像很大程度上取決于補(bǔ)丁圖像的選擇。因此,通過可視化我們想要獲得什么樣的增強(qiáng)圖像來明智地選擇補(bǔ)丁。

我們現(xiàn)在可以使用 3 種不同的方法來增強(qiáng)圖像。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

