如何使用OpenCV實現(xiàn)圖像均衡???
我們已經(jīng)練習(xí)了很多圖像處理——操作圖像(精確地說是圖像矩陣)。為此,我們探索了圖像的均衡方法,以便在一定程度上增強(qiáng)對比度,以使被處理的圖像看起來比原始圖像更好,這種技術(shù)稱為直方圖均衡化。
通常,發(fā)生的情況是在捕獲圖像時,它與自然視圖并不相同。為了滿足自然視圖的水平,應(yīng)進(jìn)行后處理。因此,直方圖均衡化(歸一化)是通過調(diào)整圖像的像素值來增強(qiáng)對比度的技術(shù)之一。
可以在下面看到一個示例:原始圖像和均等圖像。

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

該方法對于亮和暗圖像都效果更好,特別是在醫(yī)學(xué)領(lǐng)域中,分析X射線圖像的重要性更高。 在查看科學(xué)圖像(例如熱圖像和衛(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。
對每個矩陣應(yīng)用均衡方法。
將均衡的圖像矩陣與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í)行此操作,但是它將花費更多的時間進(jìn)行計算。即使在這里,我們也有兩個方面:
1.讀入圖像時RGB。
根據(jù)顏色組合分離像素。我們可以使用NumPy操作將其切細(xì)。
對每個矩陣應(yīng)用均衡方法。
將均衡的圖像矩陣與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
當(dāng)將原始圖像矩陣作為參數(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)
我們探索和實施不同的方法來增加圖像強(qiáng)度,從而學(xué)到了很多東西。特別是,嘗試通過引用和學(xué)習(xí)從頭實現(xiàn)代碼。
使用庫方法始終是一件好事,因為它們似乎更加優(yōu)化并且可以100%工作。
圖像處理是一門非常重要的學(xué)科,確實值得嘗試,要有很多好奇心和自己的探索。
雙一流高校研究生團(tuán)隊創(chuàng)建 ↓
專注于計算機(jī)視覺原創(chuàng)并分享相關(guān)知識 ?
整理不易,點贊三連!
