欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

基于OpenCV的直方圖匹配的實(shí)現(xiàn)方法

 更新時(shí)間:2021年04月02日 09:15:51   作者:小白學(xué)視覺  
這篇文章主要介紹了基于OpenCV的直方圖匹配的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

01. 什么是圖像直方圖?

在開始定義直方圖之前,為簡單起見我們先使用灰度圖像,稍后再解釋彩色圖像的處理過程。

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

圖1:生成圖像直方圖的過程

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

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

import matplotlib.pyplot as plt
import 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)

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

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

直方圖均衡化通常用于增強(qiáng)圖像的對比度。因此,該技術(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

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

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

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

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

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

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

04. 什么是直方圖匹配?

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

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

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

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

圖6:直方圖匹配

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

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)

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

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

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

總結(jié)

到此這篇關(guān)于基于OpenCV的直方圖匹配的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)OpenCV直方圖匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python開發(fā)前景如何

    python開發(fā)前景如何

    在本篇文章中小編給大家整理了關(guān)于python開發(fā)前景的知識(shí)點(diǎn)及相關(guān)內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)參考下。
    2020-06-06
  • 解決selenium模塊利用performance獲取network日志請求報(bào)錯(cuò)的問題(親測有效)

    解決selenium模塊利用performance獲取network日志請求報(bào)錯(cuò)的問題(親測有效)

    這篇文章主要介紹了解決selenium模塊利用performance獲取network日志請求報(bào)錯(cuò)的問題(親測有效),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 基于python3生成標(biāo)簽云代碼解析

    基于python3生成標(biāo)簽云代碼解析

    這篇文章主要介紹了基于python3生成標(biāo)簽云代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python分別打包出32位和64位應(yīng)用程序

    python分別打包出32位和64位應(yīng)用程序

    本文給大家分享的是如何使用python打包出32位和64位的應(yīng)用程序的方法,非常的簡單實(shí)用,有需要的小伙伴可以參考下
    2020-02-02
  • python 爬蟲請求模塊requests詳解

    python 爬蟲請求模塊requests詳解

    這篇文章主要介紹了python 爬蟲請求模塊requests詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • python email smtplib模塊發(fā)送郵件代碼實(shí)例

    python email smtplib模塊發(fā)送郵件代碼實(shí)例

    本篇文章給大家分享了python email smtplib模塊發(fā)送郵件的相關(guān)代碼分享,有需要的朋友參考學(xué)習(xí)下。
    2018-04-04
  • Python Pandas學(xué)習(xí)之Pandas數(shù)據(jù)結(jié)構(gòu)詳解

    Python Pandas學(xué)習(xí)之Pandas數(shù)據(jù)結(jié)構(gòu)詳解

    Pandas中一共有三種數(shù)據(jù)結(jié)構(gòu),分別為:Series、DataFrame和MultiIndex(老版本中叫Panel )。其中Series是一維數(shù)據(jù)結(jié)構(gòu),DataFrame是二維的表格型數(shù)據(jù)結(jié)構(gòu),MultiIndex是三維的數(shù)據(jù)結(jié)構(gòu)。本文將詳細(xì)為大家講解這三個(gè)數(shù)據(jù)結(jié)構(gòu),需要的可以參考一下
    2022-02-02
  • Python中if語句的基本格式實(shí)例代碼

    Python中if語句的基本格式實(shí)例代碼

    在Python中,if語句用于根據(jù)條件執(zhí)行不同的代碼塊。本文詳細(xì)介紹了Python中if語句的基本格式使用方法及實(shí)例代碼,有需要的同學(xué)可以參考閱讀
    2023-05-05
  • Pytest如何使用mark的方法

    Pytest如何使用mark的方法

    本文主要介紹了Pytest如何使用mark的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Pytorch中TensorDataset與DataLoader的使用方式

    Pytorch中TensorDataset與DataLoader的使用方式

    這篇文章主要介紹了Pytorch中TensorDataset與DataLoader的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論