1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        如何使用OpenCV實(shí)現(xiàn)圖像均衡???

        共 4514字,需瀏覽 10分鐘

         ·

        2021-05-13 07:33

        我們已經(jīng)練習(xí)了很多圖像處理——操作圖像(精確地說是圖像矩陣)。為此,我們探索了圖像的均衡方法,以便在一定程度上增強(qiáng)對比度,以使被處理的圖像看起來比原始圖像更好,這種技術(shù)稱為直方圖均衡化。


        通常,發(fā)生的情況是在捕獲圖像時(shí),它與自然視圖并不相同。為了滿足自然視圖的水平,應(yīng)進(jìn)行后處理。因此,直方圖均衡化(歸一化)是通過調(diào)整圖像的像素值來增強(qiáng)對比度的技術(shù)之一。


        可以在下面看到一個(gè)示例:原始圖像和均等圖像。

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

        直方圖均衡化的重要性


        1. 該方法對于亮和暗圖像都效果更好,特別是在醫(yī)學(xué)領(lǐng)域中,分析X射線圖像的重要性更高。
        2. 在查看科學(xué)圖像(例如熱圖像和衛(wèi)星圖像)時(shí)也非常有用。


        執(zhí)行步驟


        在本文中,我們將通過使用openCV庫以及使用justNumPy和從頭開始實(shí)現(xiàn)此方法Matplotlib。盡管我們想不使用來做NumPy,但要花很多時(shí)間才能計(jì)算出來。


        添加依賴庫

        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然后返回圖像矩陣。


        用庫實(shí)現(xiàn)代碼


        為了均衡,我們可以簡單地使用equalizeHist()庫中可用的方法cv2。

        1.讀入圖像時(shí)RGB。

        • 根據(jù)顏色組合分離像素。我們可以使用split()庫中可用的方法cv2。

        • 對每個(gè)矩陣應(yīng)用均衡方法。

        • 將均衡的圖像矩陣與merge()庫中可用的方法合并在一起cv2。

        2.讀入圖像時(shí)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:        r_image, 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 = None else: 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")
        ax1.imshow(image_src, cmap=cmap_val) ax2.imshow(image_eq, cmap=cmap_val) return True return 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


        實(shí)現(xiàn)代碼


        為此,我們正在使用NumPy所有矩陣運(yùn)算。同樣,我們可以使用for循環(huán)來執(zhí)行此操作,但是它將花費(fèi)更多的時(shí)間進(jìn)行計(jì)算。即使在這里,我們也有兩個(gè)方面:

        1.讀入圖像時(shí)RGB。

        • 根據(jù)顏色組合分離像素。我們可以使用NumPy操作將其切細(xì)。

        • 對每個(gè)矩陣應(yīng)用均衡方法。

        • 將均衡的圖像矩陣與dstack(tup=())庫中可用的方法合并在一起NumPy。

        2.讀入圖像時(shí)gray_scale。

        3.繪制原始圖像和均衡圖像。


        讓我們編寫我們自己的函數(shù)來計(jì)算圖像均衡,圖像像素值通常在0到255之間。因此,總共有256個(gè)像素。

        def enhance_contrast(image_matrix, bins=256):    image_flattened = image_matrix.flatten()    image_hist = np.zeros(bins)
        # frequency count of each pixel for pix in image_matrix: image_hist[pix] += 1
        # cummulative sum cum_sum = np.cumsum(image_hist) norm = (cum_sum - cum_sum.min()) * 255 # normalization of the pixel values n_ = cum_sum.max() - cum_sum.min() uniform_norm = norm / n_ uniform_norm = uniform_norm.astype('int')
        # flat histogram image_eq = uniform_norm[image_flattened] # reshaping the flattened matrix to its original shape image_eq = np.reshape(a=image_eq, newshape=image_matrix.shape)
        return image_eq

        當(dāng)將原始圖像矩陣作為參數(shù)傳遞時(shí),上述函數(shù)將返回一個(gè)均衡的圖像矩陣。

        讓我們編寫另一個(gè)函數(shù),該函數(shù)為RGB圖像和gray_scale使用上述功能的圖像計(jì)算均衡。


        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 = None else: 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")
        ax1.imshow(image_src, cmap=cmap_val) ax2.imshow(image_eq, cmap=cmap_val) return True return 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)


        總結(jié)


        • 我們探索和實(shí)施不同的方法來增加圖像強(qiáng)度,從而學(xué)到了很多東西。特別是,嘗試通過引用和學(xué)習(xí)從頭實(shí)現(xiàn)代碼。

        • 使用庫方法始終是一件好事,因?yàn)樗鼈兯坪醺觾?yōu)化并且可以100%工作。

        • 圖像處理是一門非常重要的學(xué)科,確實(shí)值得嘗試,要有很多好奇心和自己的探索。


        ?------------------------------------------------


        雙一流高校研究生團(tuán)隊(duì)創(chuàng)建 ↓

        專注于計(jì)算機(jī)視覺原創(chuàng)并分享相關(guān)知識 ?


        整理不易,點(diǎn)贊三連!

        瀏覽 48
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲成人在线网站 | 贵妇灬好爽小坏蛋 | 久久动态 | 国产区第二页 | 中文字幕一区二区三区AⅤ吉川 | 国产成人精品视频ⅤA片软件竹菊 | 成人无码www在线看免费 | 亚洲黄色视频在线观看网站 | 天天看天天摸 | 操屄视频在线观看 |