<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
影象處理技術是計算機視覺專案的核心,通常是計算機視覺專案中的關鍵工具,可以使用它們來完成各種計算機視覺任務。在本文中,將介紹如何使用 OpenCV
函數 cv2.equalizeHist()
執行直方圖均衡,並將其應用於灰度和彩色影象,cv2.equalizeHist()
函數將亮度歸一化並提高影象的對比度。
使用 cv2.equalizeHist()
函數來均衡給定灰度影象的對比度:
# 載入影象並轉換為灰度影象 image = cv2.imread('example.png') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) hist = cv2.calcHist([gray_image], [0], None, [256], [0, 256]) # 直方圖均衡化 gray_image_eq = cv2.equalizeHist(gray_image) # 直方圖均衡化後的影象直方圖 hist_eq = cv2.calcHist([gray_image_eq], [0], None, [256], [0, 256])
為了深入瞭解直方圖均衡,我們對原始灰度影象進行修改,為影象的每個畫素新增/減去 30,並計算直方圖均衡前後的直方圖:
M = np.ones(gray_image.shape, dtype='uint8') * 30 # 為影象的每個畫素新增 30 added_image = cv2.add(gray_image, M) hist_added_image = cv2.calcHist([added_image], [0], None, [256], [0, 256]) # 直方圖均衡化 added_image_eq = cv2.equalizeHist(gray_image_eq) hist_eq_added_image = cv2.calcHist([added_image_eq], [0], None, [256], [0, 256]) # 為影象的每個畫素減去 30 subtracted_image = cv2.subtract(gray_image, M) hist_subtracted_image = cv2.calcHist([subtracted_image], [0], None, [256], [0, 256]) # 直方圖均衡化 subtracted_image_eq = cv2.equalizeHist(subtracted_image) hist_eq_subtracted_image = cv2.calcHist([subtracted_image_eq], [0], None, [256], [0, 256])
最後,繪製所有這些影象:
def show_img_with_matplotlib(color_img, title, pos): img_RGB = color_img[:, :, ::-1] ax = plt.subplot(3, 4, pos) plt.imshow(img_RGB) plt.title(title, fontsize=8) plt.axis('off') def show_hist_with_matplotlib_gray(hist, title, pos, color): ax = plt.subplot(3, 4, pos) plt.xlabel("bins") plt.ylabel("number of pixels") plt.xlim([0, 256]) plt.plot(hist, color=color) # 視覺化 show_img_with_matplotlib(cv2.cvtColor(gray_image, cv2.COLOR_GRAY2BGR), "gray", 1) show_hist_with_matplotlib_gray(hist, "grayscale histogram", 2, 'm') show_img_with_matplotlib(cv2.cvtColor(added_image, cv2.COLOR_GRAY2BGR), "gray lighter", 5) show_hist_with_matplotlib_gray(hist_added_image, "grayscale histogram", 6, 'm') show_img_with_matplotlib(cv2.cvtColor(subtracted_image, cv2.COLOR_GRAY2BGR), "gray darker", 9) show_hist_with_matplotlib_gray(hist_subtracted_image, "grayscale histogram", 10, 'm') # 其他影象的視覺化方法類似,不再贅述 # ...
程式執行的輸出如下圖所示:
在上圖中,我們可以看到三個均衡化後的影象非常相似,這也反映在均衡化後的直方圖中,這是因為直方圖均衡化傾向於標準化影象的亮度,同時增加對比度。
使用相同的方法,我們可以在彩色影象中執行直方圖均衡,將直方圖均衡應用於 BGR 影象的每個通道(雖然這不是彩色影象直方圖均衡的最佳方法),建立 equalize_hist_color()
函數,使用 cv2.split()
分割 BGR
影象並將 cv2.equalizeHist()
函數應用於每個通道,最後,使用 cv2.merge()
合併結果通道:
def equalize_hist_color(img): # 使用 cv2.split() 分割 BGR 影象 channels = cv2.split(img) eq_channels = [] # 將 cv2.equalizeHist() 函數應用於每個通道 for ch in channels: eq_channels.append(cv2.equalizeHist(ch)) # 使用 cv2.merge() 合併所有結果通道 eq_image = cv2.merge(eq_channels) return eq_image
接下來,將此函數應用於三個不同的影象:原始 BGR 影象、將原始影象的每個畫素值新增 10、將原始影象的每個畫素值減去 10,並計算直方圖均衡前後的直方圖:
# 載入影象 image = cv2.imread('example.png') # 計算直方圖均衡前後的直方圖 hist_color = hist_color_img(image) image_eq = equalize_hist_color(image) hist_image_eq = hist_color_img(image_eq) M = np.ones(image.shape, dtype="uint8") * 10 # 為影象的每個畫素新增 10 added_image = cv2.add(image, M) # 直方圖均衡前後的直方圖 hist_color_added_image = hist_color_img(added_image) added_image_eq = equalize_hist_color(added_image) hist_added_image_eq = hist_color_img(added_image_eq) # 為影象的每個畫素減去 10 subtracted_image = cv2.subtract(image, M) # 直方圖均衡前後的直方圖 hist_color_subtracted_image = hist_color_img(subtracted_image) subtracted_image_eq = equalize_hist_color(subtracted_image) hist_subtracted_image_eq = hist_color_img(subtracted_image_eq)
最後,繪製所有這些影象:
def show_img_with_matplotlib(color_img, title, pos): img_RGB = color_img[:, :, ::-1] ax = plt.subplot(3, 4, pos) plt.imshow(img_RGB) plt.title(title, fontsize=8) plt.axis('off') def show_hist_with_matplotlib_rgb(hist, title, pos, color): ax = plt.subplot(3, 4, pos) plt.xlabel("bins") plt.ylabel("number of pixels") plt.xlim([0, 256]) for (h, c) in zip(hist, color): plt.plot(h, color=c) # 視覺化 show_img_with_matplotlib(image, "image", 1) show_hist_with_matplotlib_rgb(hist_color, "color histogram", 2, ['b', 'g', 'r']) show_img_with_matplotlib(added_image, "image lighter", 5) show_hist_with_matplotlib_rgb(hist_color_added_image, "color histogram", 6, ['b', 'g', 'r']) show_img_with_matplotlib(subtracted_image, "image darker", 9) show_hist_with_matplotlib_rgb(hist_color_subtracted_image, "color histogram", 10, ['b', 'g', 'r']) # 其他影象的視覺化方法類似,不再贅述 # ...
將直方圖均衡化應用於 BGR
影象的每個通道並不是顏色直方圖均衡化的好方法,這是由於 BGR
色彩空間的加性特性導致彩色影象的顏色變化很大。由於我們獨立地改變三個通道中的亮度和對比度,因此在合併均衡通道時,這可能會導致影象中出現新的色調,正如上圖所看到的那樣。
一種顏色直方圖均衡化更好的方法是將 BGR 影象轉換為包含亮度/強度通道的色彩空間( Yuv
、Lab
、HSV
和 HSL
)。然後,只在亮度通道上應用直方圖均衡,最後合併通道並將它們轉換回 BGR
顏色空間,以 HSV
空間為例,建立 equalize_hist_color_hsv()
函數實現上述顏色直方圖歸一化方法:
def equalize_hist_color_hsv(img): H, S, V = cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV)) eq_V = cv2.equalizeHist(V) eq_image = cv2.cvtColor(cv2.merge([H, S, eq_V]), cv2.COLOR_HSV2BGR) return eq_image
接下來,將此函數應用於三個不同的影象:原始 BGR 影象、將原始影象的每個畫素值新增 10、將原始影象的每個畫素值減去 10,並計算直方圖均衡前後的直方圖:
hist_color = hist_color_img(image) # 計算直方圖均衡前後的直方圖 image_eq = equalize_hist_color_hsv(image) hist_image_eq = hist_color_img(image_eq) M = np.ones(image.shape, dtype="uint8") * 10 # 為影象的每個畫素新增 10 added_image = cv2.add(image, M) hist_color_added_image = hist_color_img(added_image) # 直方圖均衡前後的直方圖 added_image_eq = equalize_hist_color_hsv(added_image) hist_added_image_eq = hist_color_img(added_image_eq) # 為影象的每個畫素減去 10 subtracted_image = cv2.subtract(image, M) hist_color_subtracted_image = hist_color_img(subtracted_image) # 直方圖均衡前後的直方圖 subtracted_image_eq = equalize_hist_color_hsv(subtracted_image) hist_subtracted_image_eq = hist_color_img(subtracted_image_eq)
最後,繪製所有這些影象:
# show_img_with_matplotlib() 和 show_hist_with_matplotlib_rgb() 函數與上一範例相同 show_img_with_matplotlib(image, "image", 1) show_hist_with_matplotlib_rgb(hist_color, "color histogram", 2, ['b', 'g', 'r']) show_img_with_matplotlib(added_image, "image lighter", 5) show_hist_with_matplotlib_rgb(hist_color_added_image, "color histogram", 6, ['b', 'g', 'r']) # 其他影象的視覺化方法類似,不再贅述 # ...
由上圖可以看出,僅均衡 HSV
影象的 V
通道得到的結果比均衡 BGR
影象的所有通道的效果要好很多,也可以將這種方法用於其他包含亮度/強度通道的色彩空間( Yuv
、Lab
和 HSL
)。
以上就是Python OpenCV直方圖均衡化詳解的詳細內容,更多關於OpenCV直方圖均衡化的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45