溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

發(fā)布時(shí)間:2020-12-23 14:01:02 來源:億速云 閱讀:585 作者:Leah 欄目:開發(fā)技術(shù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng),文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

灰度直方圖

灰度直方圖通過描述灰度級(jí)在圖像矩陣中的像素個(gè)數(shù)來展示圖像灰度級(jí)的信息,通過灰度直方圖的統(tǒng)計(jì)我們可以看到每個(gè)灰度值的占有率。下面是一個(gè)灰度直方圖的實(shí)現(xiàn):

import cv2
import numpy as np
import sys
import matplotlib.pyplot as plt

#計(jì)算灰度直方圖
def calcGrayHist(image):
  rows,clos = image.shape
  #創(chuàng)建一個(gè)矩陣用于存儲(chǔ)灰度值
  grahHist = np.zeros([256],np.uint64)
  print('這是初始化矩陣')
  print(grahHist )
  for r in range(rows):
    for c in range(clos):
      #通過圖像矩陣的遍歷來將灰度值信息放入我們定義的矩陣中
      grahHist[image[r][c]] +=1
  print('這是賦值后的矩陣')
  print(grahHist)
  return grahHist
if __name__=="__main__":
  image = cv2.imread("../img/aa.jpg",cv2.IMREAD_GRAYSCALE)
  grahHist = calcGrayHist(image)
  x_range = range(256)
  plt.plot(x_range,grahHist,'-',linewidth= 3,c='k')
  #設(shè)置坐標(biāo)軸的范圍
  y_maxValue = np.max(grahHist)
  plt.axis([0,255,0,y_maxValue])
  #設(shè)置標(biāo)簽
  plt.xlabel('gray Level')
  plt.ylabel("number of pixels")
  #顯示灰度直方圖
  plt.show()

運(yùn)行結(jié)果

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

線性變換

線性變換的公式為:

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

圖像的線性變換無疑就是利用矩陣的乘法就行線性變換,比如一個(gè)矩陣I ,2I,3I (np.unt8 ndarry類型就是unt8類型)就是一個(gè)矩陣的變換.

import cv2
import numpy as np
import sys

if __name__=="__main__":
  img = cv2.imread("../img/ae.jpg",cv2.IMREAD_GRAYSCALE)
  a=2
  #線性變換 定義float類型
  O = float(a)*img
  #數(shù)據(jù)截取 如果大于255 取 255
  O[0>255] = 255
  #數(shù)據(jù)類型的轉(zhuǎn)換
  O = np.round(O)
  O = O.astype(np.uint8)
  cv2.imshow("img",img)
  cv2.imshow('enhance',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

運(yùn)行結(jié)果:

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

灰度級(jí)范圍越大就代表對(duì)比度越高,反之對(duì)比度越低視覺上清晰度就越低。我們通過a=2的線性對(duì)比度拉伸將灰度級(jí)范圍擴(kuò)大到[0,255]之間,如上圖我們改變灰度級(jí)的范圍后圖像變的清晰。

直方圖正規(guī)化

將圖像O中的最小灰度級(jí)記為OminOmin,最大灰度級(jí)記為OmaxOmax,假如輸出的圖像P的灰度級(jí)范圍為[Pmin,PmaxPmin,Pmax],則O 與 P的關(guān)系為:

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

其中P(r,c)就代表P的第r行第c列的灰度值。這個(gè)過程就是直方圖的正規(guī)化。我們一般令P的范圍是[0,255],所以直方圖的正規(guī)化是在求a,b變換的值的方法,我們可以得到:

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

下面我們使用OpenCV來實(shí)現(xiàn)上面的理論:

import cv2
import numpy as np
import sys
from enhance.GrayHist import mget
if __name__=="__main__":
  img = cv2.imread("../img/o3.jpg",cv2.IMREAD_GRAYSCALE)
  #求出img 的最大最小值
  Maximg = np.max(img)
  Minimg = np.min(img)
  print(Maximg, Minimg, '-----------')
  #輸出最小灰度級(jí)和最大灰度級(jí)
  Omin,Omax = 0,255
  #求 a, b
  a = float(Omax - Omin)/(Maximg - Minimg)
  b = Omin - a*Minimg
  print(a,b,'-----------')
  #線性變換
  O = a*img + b
  O = O.astype(np.uint8)
  #利用灰度直方圖進(jìn)行比較 mget為GrayHist中的寫方法
  mget(img)
  mget(O)


  cv2.imshow('img',img)
  cv2.imshow('enhance',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

伽瑪變換

將一張圖的灰度值歸至[0,1]后,對(duì)于8位圖來說,除以255即可。伽瑪變換就是令O(r,c)=I(r,c)γI(r,c)γ,0≤r<H,0≤≤r<H,0≤c<W.
當(dāng)γγ等于1時(shí)圖像不發(fā)生變換,而當(dāng)γγ大于0且小于1時(shí)就可以增強(qiáng)圖像的對(duì)比度,相反的當(dāng)γγ大于1時(shí)就可以使圖像對(duì)比度降低。 以下是伽瑪變換在OpenCV中的實(shí)現(xiàn):

import cv2
import numpy as np
import sys

# 伽瑪變換 power函數(shù)實(shí)現(xiàn)冪函數(shù)

if __name__ == "__main__":
  img = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
  # 歸1
  Cimg = img / 255
  # 伽瑪變換
  gamma = 0.5
  O = np.power(Cimg,gamma)
  #效果
  cv2.imshow('img',img)
  cv2.imshow('O',O)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

運(yùn)行結(jié)果:

如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)

直方圖的均衡化

  • 計(jì)算圖像的灰度直方圖

  • 計(jì)算灰度直方圖的累加直方圖

  • 根據(jù)累加的直方圖和直方圖均衡化的原理得到輸入灰度級(jí)與輸出灰度級(jí)之間的映射關(guān)系

  • 使用循環(huán)的方式得到輸出圖像的每一個(gè)像素的灰度級(jí)

import cv2
import numpy as np
from enhance.GrayHist import calcGrayHist

#直方圖的均衡化
if __name__ == "__main__":
  image = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
  rows,cols = image.shape
  #計(jì)算灰度直方圖
  grayHist = calcGrayHist(image)
  #計(jì)算累加灰度直方圖
  zeroCumuMoment = np.zeros([256], np.uint32)
  for p in range(256):
    if p == 0:
      zeroCumuMoment[p] = grayHist[0]
    else:
      zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]
  #根據(jù)累加的灰度直方圖得到輸入與輸出灰度級(jí)之間的映射關(guān)系
  output = np.zeros([256],np.uint8)
  cofficient = 256.0/(rows*cols)
  for p in range(256):
    q = cofficient * float(zeroCumuMoment[p])-1
    if q >=0:
      output[p] = np.math.floor(q)
    else:
      output[p] = 0
  #得出均衡化圖像
  equalHistimg = np.zeros(image.shape,np.uint8)
  for r in range(rows):
    for c in range(cols):
      equalHistimg[r][c] = output[image[r][c]]
  cv2.imshow('image',image)
  cv2.imshow('histimage',equalHistimg)
  cv2.waitKey(0)
  cv2.destroyAllWindows()

上述就是小編為大家分享的如何在python中利用opencv對(duì)圖像進(jìn)行增強(qiáng)了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI