<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          基于OpenCV的直方圖匹配

          共 5078字,需瀏覽 11分鐘

           ·

          2020-11-19 09:26

          點(diǎn)擊上方小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂

          重磅干貨,第一時(shí)間送達(dá)

          如何為圖像生成直方圖,如何使直方圖相等,最后如何將圖像直方圖修改為與其他直方圖相似。


          01. 什么是圖像直方圖?


          在開(kāi)始定義直方圖之前,為簡(jiǎn)單起見(jiàn)我們先使用灰度圖像,稍后再解釋彩色圖像的處理過(guò)程。

          圖像直方圖表示圖像的像素分布情況。換言之,圖像直方圖顯示具有特定像素值的圖像點(diǎn)數(shù)量。例如,假設(shè)正常圖像的像素強(qiáng)度在0到255之間變化。為了生成其直方圖,我們只需要計(jì)算像素值為0的像素?cái)?shù)量,然后計(jì)算1并繼續(xù)到255即可。在圖1中,我們有一個(gè)5 * 5的樣本圖像,我們通過(guò)計(jì)算每個(gè)像素強(qiáng)度的數(shù)量來(lái)創(chuàng)建直方圖表。

          圖1:生成圖像直方圖的過(guò)程


          02. 如何生成圖像直方圖?


          在python中,我們可以使用以下兩個(gè)函數(shù)來(lái)創(chuàng)建然后顯示圖像的直方圖。

          import matplotlib.pyplot as pltimport numpy as np
          def generate_histogram(img, do_print): """ @params: img: can be a grayscale or color image. We calculate the Normalized histogram of this image. @params: do_print: if or not print the result histogram @return: will return both histogram and the grayscale image """ if len(img.shape) == 3: # img is colorful, so we convert it to grayscale gr_img = np.mean(img, axis=-1) else: gr_img = img '''now we calc grayscale histogram''' gr_hist = np.zeros([256])
          for x_pixel in range(gr_img.shape[0]): for y_pixel in range(gr_img.shape[1]): pixel_value = int(gr_img[x_pixel, y_pixel]) gr_hist[pixel_value] += 1
          '''normalizing the Histogram''' gr_hist /= (gr_img.shape[0] * gr_img.shape[1]) if do_print: print_histogram(gr_hist, name="n_h_img", title="Normalized Histogram") return gr_hist, gr_img
          def print_histogram(_histrogram, name, title): plt.figure() plt.title(title) plt.plot(_histrogram, color='#ef476f') plt.bar(np.arange(len(_histrogram)), _histrogram, color='#b7b7a4') plt.ylabel('Number of Pixels') plt.xlabel('Pixel Value') plt.savefig("hist_" + name)

          代碼1:生成直方圖


          在大多數(shù)情況下,當(dāng)我們創(chuàng)建直方圖時(shí),我們通過(guò)將每個(gè)強(qiáng)度值的像素?cái)?shù)除以歸一化因子(即圖像寬度和圖像高度的乘積)來(lái)對(duì)直方圖進(jìn)行歸一化。為了便于使用,如果generate_histogram函數(shù)的輸入圖像是彩色圖像,我們首先將其轉(zhuǎn)換為灰度圖像(請(qǐng)參見(jiàn)第6行)。


          03. 如何均衡圖像直方圖?


          直方圖均衡化通常用于增強(qiáng)圖像的對(duì)比度。因此,該技術(shù)不能保證始終提高圖像質(zhì)量。計(jì)算CDF(累積分布函數(shù))是均衡圖像直方圖的常用方法。在圖2中,我們計(jì)算了在圖1中創(chuàng)建的樣本圖像的CDF。此外,在圖3中,我們顯示了先前樣本的均衡直方圖。

          圖2:計(jì)算CDF。

          圖3:均方圖。

          為了計(jì)算python中的均衡直方圖,我們創(chuàng)建了以下代碼:

          def equalize_histogram(img, histo, L):    eq_histo = np.zeros_like(histo)    en_img = np.zeros_like(img)    for i in range(len(histo)):        eq_histo[i] = int((L - 1) * np.sum(histo[0:i]))    print_histogram(eq_histo, name="eq_"+str(index), title="Equalized Histogram")    '''enhance image as well:'''    for x_pixel in range(img.shape[0]):        for y_pixel in range(img.shape[1]):            pixel_val = int(img[x_pixel, y_pixel])            en_img[x_pixel, y_pixel] = eq_histo[pixel_val]    '''creating new histogram'''    hist_img, _ = generate_histogram(en_img, print=False, index=index)    print_img(img=en_img, histo_new=hist_img, histo_old=histo, index=str(index), L=L)    return eq_histo

          代碼2:均衡直方圖


          這是我們拍攝的3張不同圖片,并用作示例。如圖4所示,對(duì)于第一個(gè)圖像,直方圖顯示低強(qiáng)度像素的數(shù)量多于明亮像素。對(duì)于第二張圖像,情況完全相反,其中較亮像素的密度遠(yuǎn)大于較暗像素的密度。第三張圖片似乎具有半正態(tài)直方圖。

          圖4:三種不同類型的圖像及其直方圖和均等的直方圖。


          使用均衡直方圖增強(qiáng)圖像

          如前所述,我們可以使用圖像的均衡直方圖修改圖像的對(duì)比度。如代碼2第12行所示,對(duì)于輸入圖像中的每個(gè)像素,我們可以使用其均等值。結(jié)果可能比原始圖像更好,但不能保證。在圖5中,我們描述了3張圖像的修改版本。如圖所示,使用其均等的直方圖修改圖像會(huì)產(chǎn)生對(duì)比度更高的圖像。此功能在許多計(jì)算機(jī)視覺(jué)任務(wù)中很有用。

          圖5:使用均衡直方圖的對(duì)比度修改。最左列是原始圖像。中間一欄是對(duì)比度修改的結(jié)果。

          最右邊的列是修改后的圖像的直方圖。


          04. 什么是直方圖匹配?


          假設(shè)我們有兩個(gè)圖像,每個(gè)圖像都有其特定的直方圖。因此,我們想在進(jìn)一步解決此問(wèn)題之前,是否可以根據(jù)另一幅圖像的對(duì)比度來(lái)修改一幅圖像?答案是肯定的。實(shí)際上,這就是直方圖匹配的定義。換句話說(shuō),給定圖像A和B,可以根據(jù)B修改A的對(duì)比度。

          當(dāng)我們要統(tǒng)一一組圖像的對(duì)比度時(shí),直方圖匹配非常有用。實(shí)際上,直方圖均衡也可以視為直方圖匹配,因?yàn)槲覀儗⑤斎雸D像的直方圖修改為與正態(tài)分布相似。

          為了匹配圖像A和B的直方圖,我們需要首先均衡兩個(gè)圖像的直方圖。然后,我們需要使用均衡后的直方圖將A的每個(gè)像素映射到B。然后,我們基于B修改A的每個(gè)像素。

          讓我們使用圖6中的以下示例來(lái)闡明以上段落。

          圖6:直方圖匹配

          在圖6中,我們將圖像A作為輸入圖像,將圖像B作為目標(biāo)圖像。我們要基于B的分布來(lái)修改A的直方圖。第一步,我們計(jì)算A和B的直方圖和均等直方圖。然后,我們需要根據(jù)該值映射A的每個(gè)像素它的均衡直方圖求B的值。因此,例如,對(duì)于A中強(qiáng)度級(jí)別為0的像素,A均衡直方圖的對(duì)應(yīng)值為4。現(xiàn)在,我們看一下B均衡直方圖并找到強(qiáng)度值對(duì)應(yīng)于4,即0。因此我們將0強(qiáng)度從A映射到0?從B開(kāi)始。對(duì)于A的所有強(qiáng)度值,我們繼續(xù)進(jìn)行。如果從A到B的均衡直方圖中沒(méi)有映射,我們只需要選擇最接近的值即可。

          def find_value_target(val, target_arr):    key = np.where(target_arr == val)[0]
          if len(key) == 0: key = find_value_target(val+1, target_arr) if len(key) == 0: key = find_value_target(val-1, target_arr) vvv = key[0] return vvv

          def match_histogram(inp_img, hist_input, e_hist_input, e_hist_target, _print=True): '''map from e_inp_hist to 'target_hist ''' en_img = np.zeros_like(inp_img) tran_hist = np.zeros_like(e_hist_input) for i in range(len(e_hist_input)): tran_hist[i] = find_value_target(val=e_hist_input[i], target_arr=e_hist_target) print_histogram(tran_hist, name="trans_hist_", title="Transferred Histogram") '''enhance image as well:''' for x_pixel in range(inp_img.shape[0]): for y_pixel in range(inp_img.shape[1]): pixel_val = int(inp_img[x_pixel, y_pixel]) en_img[x_pixel, y_pixel] = tran_hist[pixel_val] '''creating new histogram''' hist_img, _ = generate_histogram(en_img, print=False, index=3) print_img(img=en_img, histo_new=hist_img, histo_old=hist_input, index=str(3), L=L)

          代碼3:?Python中的直方圖匹配


          圖7:直方圖匹配示例。我們修改了左圖像的直方圖以匹配中心圖像的直方圖。


          圖7示出了直方圖匹配的示例。如大家所見(jiàn),盡管最左邊的圖像是明亮的圖像,但就對(duì)比度級(jí)別而言,可以將中心圖像視為更好的圖像。因此,我們決定使用中心圖像的收縮來(lái)修改最左邊的圖像。結(jié)果,即最右邊的圖像已得到改善。

          代碼鏈接:https://github.com/aliprf/CV-HistogramMatching


          交流群


          歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~


          瀏覽 100
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

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

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲一级无码 | 欧美国产日韩色图 | 五月婷婷亚洲综合 | 免费观看性欧美一级 | 影音先锋人妻啪啪aV资源网站 |