天天看點

OpenCV-Python之圖像直方圖的繪制

  • 圖像直方圖的兩個基本屬性:range[0, 256]和bins(組塊)
  • 直方圖無空間資訊
  • 中間灰階級像素多,動态範圍小,圖像對比度低
  • 直方圖均勻分布時圖像最清晰
    OpenCV-Python之圖像直方圖的繪制
    圖像的直方圖是用來表現圖像中亮度分布的直方圖,給出的是圖像中某個亮度或者某個範圍亮度下共有幾個像素,即統計一幅圖某個亮度像素數量。

b

i

n

s

i

z

e

=

b

i

n

bin_{size}=\frac{圖像中不同像素值的個數}{bin的數目}

binsize​=bin的數目圖像中不同像素值的個數​

方法一:利用matplotlib

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt

def histogram_demo(image):
    plt.hist(image.ravel(), 256, [0, 256])#ravel函數功能是将多元數組降為一維數組
    plt.show()

image = cv.imread('./data/lena.jpg', 1)
cv.imshow('souce image', image)
histogram_demo(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
OpenCV-Python之圖像直方圖的繪制
  1. numpy的ravel函數功能是将多元數組降為一維數組
  2. hist函數原型:
hist(x, bins=None, range=None, density=None, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, normed=None, hold=None, data=None, **kwargs)
           

方法二: 利用OpenCV的API

def image_hist(image): #畫三通道圖像的直方圖
   color = ("blue", "green", "red")#畫筆顔色的值可以為大寫或小寫或隻寫首字母或大小寫混合
   for i, color in enumerate(color):
       hist = cv.calcHist([image], [i], None, [256], [0, 256])
       plt.plot(hist, color=color)
       plt.xlim([0, 256])
   plt.show()

image = cv.imread('./data/lena.jpg', 1)
cv.imshow('souce image', image)
image_hist(image)
cv.waitKey(0)
cv.destroyAllWindows()
           
calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) 
           
  • images參數表示輸入圖像,傳入時應該用中括号[ ]括起來
  • channels參數表示傳入圖像的通道,如果是灰階圖像,那就不用說了,隻有一個通道,值為0,如果是彩色圖像(有3個通道),那麼值為0,1,2,中選擇一個,對應着BGR各個通道。這個值也得用[ ]傳入。
  • mask參數表示掩膜圖像。如果統計整幅圖,那麼為None。主要是如果要統計部分圖的直方圖,就得構造相應的掩膜來計算。
  • histSize參數表示灰階級的個數,需要中括号,比如[256]
  • ranges參數表示像素值的範圍,通常[0,256]。此外,假如channels為[0,1],ranges為[0,256,0,180],則代表0通道範圍是0-256,1通道範圍0-180。
  • hist參數表示計算出來的直方圖。