如何使用OpenCV實現(xiàn)圖像均衡???
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
我們已經(jīng)練習了很多圖像處理——操作圖像(精確地說是圖像矩陣)。為此,我們探索了圖像的均衡方法,以便在一定程度上增強對比度,以使被處理的圖像看起來比原始圖像更好,這種技術稱為直方圖均衡化。
通常,發(fā)生的情況是在捕獲圖像時,它與自然視圖并不相同。為了滿足自然視圖的水平,應進行后處理。因此,直方圖均衡化(歸一化)是通過調(diào)整圖像的像素值來增強對比度的技術之一。
可以在下面看到一個示例:原始圖像和均等圖像。

如果我們要繪制圖像直方圖,它將看起來像下面的樣子:

-
該方法對于亮和暗圖像都效果更好,特別是在醫(yī)學領域中,分析X射線圖像的重要性更高。 -
在查看科學圖像(例如熱圖像和衛(wèi)星圖像)時也非常有用。
在本文中,我們將通過使用openCV庫以及使用justNumPy和從頭開始實現(xiàn)此方法Matplotlib。盡管我們想不使用來做NumPy,但要花很多時間才能計算出來。

添加依賴庫
import numpy as npimport cv2import jsonfrom matplotlib import pyplot as plt
def read_this(image_file, gray_scale=False):image_src = cv2.imread(image_file)if gray_scale:image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)else:image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB)return image_src
上面的函數(shù)讀取gray_scale或中的圖像,RGB然后返回圖像矩陣。
為了均衡,我們可以簡單地使用equalizeHist()庫中可用的方法cv2。
1.讀入圖像時RGB。
根據(jù)顏色組合分離像素。我們可以使用split()庫中可用的方法cv2。
對每個矩陣應用均衡方法。
將均衡的圖像矩陣與merge()庫中可用的方法合并在一起cv2。
2.讀入圖像時gray_scale。
3.繪制原始圖像和均衡圖像。
def equalize_this(image_file, with_plot=False, gray_scale=False):image_src = read_this(image_file=image_file, gray_scale=gray_scale)if not gray_scale:g_image, b_image = cv2.split(image_src)r_image_eq = cv2.equalizeHist(r_image)g_image_eq = cv2.equalizeHist(g_image)b_image_eq = cv2.equalizeHist(b_image)image_eq = cv2.merge((r_image_eq, g_image_eq, b_image_eq))cmap_val = Noneelse:image_eq = cv2.equalizeHist(image_src)cmap_val = 'gray'if with_plot:fig = plt.figure(figsize=(10, 20))ax1 = fig.add_subplot(2, 2, 1)ax1.axis("off")ax1.title.set_text('Original')ax2 = fig.add_subplot(2, 2, 2)ax2.axis("off")ax2.title.set_text("Equalized")cmap=cmap_val)cmap=cmap_val)return Truereturn image_eq
equalize_this(image_file='lena_original.png', with_plot=True)

equalize_this(image_file = 'lena_original.png',with_plot = True,gray_scale = True)

為此,我們正在使用NumPy所有矩陣運算。同樣,我們可以使用for循環(huán)來執(zhí)行此操作,但是它將花費更多的時間進行計算。即使在這里,我們也有兩個方面:
1.讀入圖像時RGB。
根據(jù)顏色組合分離像素。我們可以使用NumPy操作將其切細。
對每個矩陣應用均衡方法。
將均衡的圖像矩陣與dstack(tup=())庫中可用的方法合并在一起NumPy。
2.讀入圖像時gray_scale。
3.繪制原始圖像和均衡圖像。
讓我們編寫我們自己的函數(shù)來計算圖像均衡,圖像像素值通常在0到255之間。因此,總共有256個像素。
def enhance_contrast(image_matrix, bins=256):image_flattened = image_matrix.flatten()image_hist = np.zeros(bins)# frequency count of each pixelfor pix in image_matrix:+= 1# cummulative sumcum_sum = np.cumsum(image_hist)norm = (cum_sum - cum_sum.min()) * 255# normalization of the pixel valuesn_ = cum_sum.max() - cum_sum.min()uniform_norm = norm / n_uniform_norm = uniform_norm.astype('int')# flat histogramimage_eq = uniform_norm[image_flattened]# reshaping the flattened matrix to its original shapeimage_eq = np.reshape(a=image_eq, newshape=image_matrix.shape)return image_eq
當將原始圖像矩陣作為參數(shù)傳遞時,上述函數(shù)將返回一個均衡的圖像矩陣。
讓我們編寫另一個函數(shù),該函數(shù)為RGB圖像和gray_scale使用上述功能的圖像計算均衡。
def equalize_this(image_file, with_plot=False, gray_scale=False, bins=256):image_src = read_this(image_file=image_file, gray_scale=gray_scale)if not gray_scale:r_image = image_src[:, :, 0]g_image = image_src[:, :, 1]b_image = image_src[:, :, 2]r_image_eq = enhance_contrast(image_matrix=r_image)g_image_eq = enhance_contrast(image_matrix=g_image)b_image_eq = enhance_contrast(image_matrix=b_image)image_eq = np.dstack(tup=(r_image_eq, g_image_eq, b_image_eq))cmap_val = Noneelse:image_eq = enhance_contrast(image_matrix=image_src)cmap_val = 'gray'if with_plot:fig = plt.figure(figsize=(10, 20))ax1 = fig.add_subplot(2, 2, 1)ax1.axis("off")ax1.title.set_text('Original')ax2 = fig.add_subplot(2, 2, 2)ax2.axis("off")ax2.title.set_text("Equalized")cmap=cmap_val)cmap=cmap_val)return Truereturn image_eq
equalize_this(image_file='lena_original.png', with_plot=True)

equalize_this(image_file='lena_original.png', with_plot=True, gray_scale=True)

我們探索和實施不同的方法來增加圖像強度,從而學到了很多東西。特別是,嘗試通過引用和學習從頭實現(xiàn)代碼。
使用庫方法始終是一件好事,因為它們似乎更加優(yōu)化并且可以100%工作。
圖像處理是一門非常重要的學科,確實值得嘗試,要有很多好奇心和自己的探索。
— — 完 — —
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

