最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python OpenCV直方圖均衡化詳解

 更新時間:2022年02月08日 10:38:54   作者:盼小輝丶  
本文中將介紹如何使用OpenCV函數(shù)執(zhí)行直方圖均衡,并將其應(yīng)用于灰度和彩色圖像,以及將亮度歸一化并提高圖像的對比度。感興趣的小伙伴可以了解一下

前言

圖像處理技術(shù)是計算機(jī)視覺項目的核心,通常是計算機(jī)視覺項目中的關(guān)鍵工具,可以使用它們來完成各種計算機(jī)視覺任務(wù)。在本文中,將介紹如何使用 OpenCV 函數(shù) cv2.equalizeHist() 執(zhí)行直方圖均衡,并將其應(yīng)用于灰度和彩色圖像,cv2.equalizeHist() 函數(shù)將亮度歸一化并提高圖像的對比度。

灰度直方圖均衡化

使用 cv2.equalizeHist() 函數(shù)來均衡給定灰度圖像的對比度:

# 加載圖像并轉(zhuǎn)換為灰度圖像
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])

為了深入了解直方圖均衡,我們對原始灰度圖像進(jìn)行修改,為圖像的每個像素添加/減去 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')
# 其他圖像的可視化方法類似,不再贅述
# ...

程序運(yùn)行的輸出如下圖所示:

在上圖中,我們可以看到三個均衡化后的圖像非常相似,這也反映在均衡化后的直方圖中,這是因為直方圖均衡化傾向于標(biāo)準(zhǔn)化圖像的亮度,同時增加對比度。

顏色直方圖均衡化

使用相同的方法,我們可以在彩色圖像中執(zhí)行直方圖均衡,將直方圖均衡應(yīng)用于 BGR 圖像的每個通道(雖然這不是彩色圖像直方圖均衡的最佳方法),創(chuàng)建 equalize_hist_color() 函數(shù),使用 cv2.split() 分割 BGR 圖像并將 cv2.equalizeHist() 函數(shù)應(yīng)用于每個通道,最后,使用 cv2.merge() 合并結(jié)果通道:

def equalize_hist_color(img):
    # 使用 cv2.split() 分割 BGR 圖像
    channels = cv2.split(img)
    eq_channels = []
    # 將 cv2.equalizeHist() 函數(shù)應(yīng)用于每個通道
    for ch in channels:
        eq_channels.append(cv2.equalizeHist(ch))
    # 使用 cv2.merge() 合并所有結(jié)果通道
    eq_image = cv2.merge(eq_channels)
    return eq_image

接下來,將此函數(shù)應(yīng)用于三個不同的圖像:原始 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'])
# 其他圖像的可視化方法類似,不再贅述
# ...

將直方圖均衡化應(yīng)用于 BGR 圖像的每個通道并不是顏色直方圖均衡化的好方法,這是由于 BGR 色彩空間的加性特性導(dǎo)致彩色圖像的顏色變化很大。由于我們獨(dú)立地改變?nèi)齻€通道中的亮度和對比度,因此在合并均衡通道時,這可能會導(dǎo)致圖像中出現(xiàn)新的色調(diào),正如上圖所看到的那樣。

一種顏色直方圖均衡化更好的方法是將 BGR 圖像轉(zhuǎn)換為包含亮度/強(qiáng)度通道的色彩空間( Yuv、Lab、HSVHSL )。然后,只在亮度通道上應(yīng)用直方圖均衡,最后合并通道并將它們轉(zhuǎn)換回 BGR 顏色空間,以 HSV 空間為例,創(chuàng)建 equalize_hist_color_hsv() 函數(shù)實現(xiàn)上述顏色直方圖歸一化方法:

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

接下來,將此函數(shù)應(yīng)用于三個不同的圖像:原始 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() 函數(shù)與上一示例相同
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 通道得到的結(jié)果比均衡 BGR 圖像的所有通道的效果要好很多,也可以將這種方法用于其他包含亮度/強(qiáng)度通道的色彩空間( Yuv、LabHSL )。

以上就是Python OpenCV直方圖均衡化詳解的詳細(xì)內(nèi)容,更多關(guān)于OpenCV直方圖均衡化的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • jupyter代碼塊沒有運(yùn)行圖標(biāo)的解決方案

    jupyter代碼塊沒有運(yùn)行圖標(biāo)的解決方案

    這篇文章主要介紹了jupyter代碼塊沒有運(yùn)行圖標(biāo)的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • 使用Async IO在Python中進(jìn)行異步編程的步驟詳解

    使用Async IO在Python中進(jìn)行異步編程的步驟詳解

    許多程序員都熟悉編寫順序(同步)代碼,在異步世界中,事件的發(fā)生獨(dú)立于主程序流程,異步編程范例有助于并發(fā)執(zhí)行這些任務(wù),并確保您可以克服等待時間并更有效地使用資源,本文給大家介紹了使用Async IO在Python中進(jìn)行異步編程,需要的朋友可以參考下
    2023-11-11
  • Python中如何實現(xiàn)真正的按位取反運(yùn)算

    Python中如何實現(xiàn)真正的按位取反運(yùn)算

    按位取反是位運(yùn)算符,而位運(yùn)算符是應(yīng)用在兩個數(shù)的運(yùn)算上,會對數(shù)字的二進(jìn)制所有位數(shù)進(jìn)行從低到高的運(yùn)算,下面這篇文章主要給大家介紹了關(guān)于Python中如何實現(xiàn)真正的按位取反運(yùn)算的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • 詳解python開發(fā)環(huán)境搭建

    詳解python開發(fā)環(huán)境搭建

    這篇文章主要介紹了詳解python開發(fā)環(huán)境搭建 ,記錄一下過程,方便自己以后配置,也方便正在學(xué)習(xí)中的同事配置他們的環(huán)境。
    2016-12-12
  • Python實現(xiàn)一個簡單的畢業(yè)生信息管理系統(tǒng)的示例代碼

    Python實現(xiàn)一個簡單的畢業(yè)生信息管理系統(tǒng)的示例代碼

    這篇文章主要介紹了Python實現(xiàn)一個簡單的畢業(yè)生信息管理系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • 分享20個實用的Python?Excel自動化腳本

    分享20個實用的Python?Excel自動化腳本

    這篇文章主要介紹了20個實用的Python?Excel自動化腳本,用于自動化處理和分析Excel文件,提高工作效率,從批量填充單元格、設(shè)置行高與列寬到生成數(shù)據(jù)透視表和圖表,涵蓋了數(shù)據(jù)處理和分析的各個方面,需要的朋友可以參考下
    2025-02-02
  • 關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用

    關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用

    本篇文章主要介紹了關(guān)于Tensorflow中的tf.train.batch函數(shù)的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python3實現(xiàn)將文件樹中所有文件和子目錄歸檔到tar壓縮文件的方法

    Python3實現(xiàn)將文件樹中所有文件和子目錄歸檔到tar壓縮文件的方法

    這篇文章主要介紹了Python3實現(xiàn)將文件樹中所有文件和子目錄歸檔到tar壓縮文件的方法,涉及Python3使用tarfile模塊實現(xiàn)tar壓縮文件的技巧,需要的朋友可以參考下
    2015-05-05
  • Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解

    Python學(xué)習(xí)之魔法函數(shù)(filter,map,reduce)詳解

    這篇文章我們將來學(xué)習(xí)一下,Python中的三個高級函數(shù):filter()、map()、reduce(),這三個函數(shù)也被稱為魔法函數(shù),感興趣的小伙伴可以了解一下
    2022-04-04
  • python異常處理try的實例小結(jié)

    python異常處理try的實例小結(jié)

    python提供了兩個非常重要的功能來處理python程序在運(yùn)行中出現(xiàn)的異常和錯誤。你可以使用該功能來調(diào)試python程序。今天通過本文給大家介紹python異常處理try的實例詳解,感興趣的朋友一起看看吧
    2021-10-10

最新評論

清原| 财经| 郎溪县| 喀喇| 闽侯县| 慈利县| 迭部县| 滦平县| 额敏县| 楚雄市| 靖远县| 庆安县| 闻喜县| 海原县| 灵山县| 诸暨市| 丰镇市| 甘孜| 从江县| 康定县| 姜堰市| 佳木斯市| 龙门县| 宿州市| 江孜县| 荆州市| 闻喜县| 大埔县| 高邑县| 安丘市| 南皮县| 田东县| 宝应县| 中江县| 应用必备| 托里县| 浙江省| 马山县| 黄大仙区| 永修县| 班戈县|