訂閱
糾錯(cuò)
加入自媒體

OpenCV:直方圖均衡

步驟:

第 1 步:手動(dòng)均衡

第 2 步:通過(guò)使用 OpenCV 函數(shù)

什么是圖像直方圖?

它是圖像強(qiáng)度分布的圖形表示。它量化了所考慮的每個(gè)強(qiáng)度值的像素?cái)?shù)。

第 1 步:手動(dòng)均衡

%matplotlib inline

from IPython.display import display, Math, Latex

import numpy as np

import matplotlib.pyplot as plt

from PIL import Image

img = Image.open('DATA/einstein.jpg')

plt.imshow(img)

輸出:


顯示彩色圖像

將圖像轉(zhuǎn)換為 numpy 數(shù)組,以便 OpenCV 可以使用:

img = np.a(chǎn)sanyarray(img)

img.shape

輸出:

(2354, 2560, 3)

將 RGB 轉(zhuǎn)換為灰度:

import cv2

img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

img.shape

輸出:

(2354, 2560)

顯示圖像:

plt.imshow(img, cmap='gray')

輸出:


我們現(xiàn)在知道如何處理直方圖了

img.max()

輸出:

255

img.min()

輸出:

0

img.shape

輸出:

(2354, 2560)

把它展平:

flat = img.flatten()

# 1 row 2354 x 2560 = 6.026.240

flat.shape

輸出:

(6026240,)

顯示直方圖

plt.hist(flat, bins=50)

請(qǐng)注意,灰度值在某個(gè)值周?chē)植己懿?/p>

什么是直方圖均衡?

為了更清楚,從上圖中,你可以看到像素似乎聚集在可用強(qiáng)度范圍的中間。直方圖均衡所做的就是擴(kuò)大這個(gè)范圍。

# formula for creating the histogram

display(Math(r'P_x(j) = sum_{i=0}^{j} P_x(i)'))

# create our own histogram function

def get_histogram(image, bins):

   # array with size of bins, set to zeros

   histogram = np.zeros(bins)

   # loop through pixels and sum up counts of pixels

   for pixel in image:

       histogram[pixel] += 1

       # return our final result

       return histogram

hist = get_histogram(flat, 256)

plt.plot(hist)

[]

# create our cumulative sum function

def cumsum(a):

  a = iter(a)

  b = [next(a)]

  for i in a:

   b.a(chǎn)ppend(b[-1] + i)

   return np.a(chǎn)rray(b)
   

# execute the fn

cs = cumsum(hist)


# display the result

plt.plot(cs)

[]

# formula to calculate cumulation sum

display(Math(r's_k = sum_{j=0}^{k} { rac{n_j}{N}}'))

# re-normalize cumsum values to be between 0-255

# numerator & denomenator

nj = (cs - cs.min()) * 255

N = cs.max() - cs.min()

# re-normalize the cdf

cs = nj / N

plt.plot(cs)

[]


Casting:

# cast it back to uint8 since we can't use floating point values in imagescs =

cs.a(chǎn)stype('uint8')

plt.plot(cs)

輸出:

[]

獲取 CDF:

# get the value from cumulative sum for every index in flat, and set that as img_new

img_new = cs[flat]

# we see a much more evenly distributed histogram

plt.hist(img_new, bins=50)

它是如何工作的?

均衡意味著將一個(gè)分布(給定的直方圖)映射到另一個(gè)分布(強(qiáng)度值的更廣泛和更均勻的分布),因此強(qiáng)度值分布在整個(gè)范圍內(nèi)。

# get the value from cumulative sum for every index in flat, and set that as img_new

img_new = cs[flat]

# we see a much more evenly distributed histogram

plt.hist(img_new, bins=50)

# put array back into original shape since we flattened it

img_new = np.reshape(img_new, img.shape)

img_new

輸出:

array([[233, 231, 228, ..., 216, 216, 215],

      [233, 230, 228, ..., 215, 215, 214],

      [233, 231, 229, ..., 213, 213, 212],

      ...,

      [115, 107,  96, ..., 180, 187, 194],

      [111, 103,  93, ..., 187, 189, 192],

      [111, 103,  93, ..., 187, 189, 192]], dtype=uint8)

一探究竟:

# set up side-by-side image display

fig = plt.figure()

fig.set_figheight(15)

fig.set_figwidth(15)

fig.a(chǎn)dd_subplot(1,2,1)

plt.imshow(img, cmap='gray')

# display the new image

fig.a(chǎn)dd_subplot(1,2,2)

plt.imshow(img_new, cmap='gray')

plt.show(block=True)

使用 OpenCV equalizeHist(img) 方法

第 2 步:通過(guò)使用 OpenCV 函數(shù)

# Reading image via OpenCV and Equalize it right away!

img = cv2.imread('DATA/einstein.jpg',0)

equ = cv2.equalizeHist(img)

準(zhǔn)備好!這就是你需要做的!

fig = plt.figure()

fig.set_figheight(15)

fig.set_figwidth(15)

fig.a(chǎn)dd_subplot(1,2,1)

plt.imshow(img, cmap='gray')

# display the Equalized (equ) image

fig.a(chǎn)dd_subplot(1,2,2)

plt.imshow(equ, cmap='gray')

plt.show(block=True)

print("That?s it! Thank you once again!I hope will be helpful.")

輸出:

That?s it! Thank you once again!

I hope will be helpful.

image.png

       原文標(biāo)題 : OpenCV:直方圖均衡

聲明: 本文由入駐維科號(hào)的作者撰寫(xiě),觀點(diǎn)僅代表作者本人,不代表OFweek立場(chǎng)。如有侵權(quán)或其他問(wèn)題,請(qǐng)聯(lián)系舉報(bào)。

發(fā)表評(píng)論

0條評(píng)論,0人參與

請(qǐng)輸入評(píng)論內(nèi)容...

請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字

您提交的評(píng)論過(guò)于頻繁,請(qǐng)輸入驗(yàn)證碼繼續(xù)

  • 看不清,點(diǎn)擊換一張  刷新

暫無(wú)評(píng)論

暫無(wú)評(píng)論

    人工智能 獵頭職位 更多
    掃碼關(guān)注公眾號(hào)
    OFweek人工智能網(wǎng)
    獲取更多精彩內(nèi)容
    文章糾錯(cuò)
    x
    *文字標(biāo)題:
    *糾錯(cuò)內(nèi)容:
    聯(lián)系郵箱:
    *驗(yàn) 證 碼:

    粵公網(wǎng)安備 44030502002758號(hào)