首頁 > 軟體

Python影象運算之影象灰度直方圖對比詳解

2022-08-12 14:02:20

一.灰度增強直方圖對比

影象灰度上移變換使用的表示式為:

DB=DA+50

該演演算法將實現影象灰度值的上移,從而提升影象的亮度,結合直方圖對比的實現程式碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影象
img = cv2.imread('lena-hd.png')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取影象高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影象灰度上移變換 DB=DA+50
for i in range(height):
    for j in range(width):
        if (int(grayImage[i,j]+50) > 255):
            gray = 255
        else:
            gray = int(grayImage[i,j]+50)
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪製掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪製掩膜設定後的影象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪製直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其執行結果如圖1所示,其中(a)表示原始影象,(b)表示對應的灰度直方圖,(c)表示灰度上移後的影象,(d)是對應的直方圖。對比發現,圖1(d)比圖1(b)的灰度級整體高了50,曲線整體向右平移了50個單位。

二.灰度減弱直方圖對比

該演演算法將減弱影象的對比度,使用的表示式為:

DB=DA×0.8

Python結合直方圖實現灰度對比度減弱的程式碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影象
img = cv2.imread('lena-hd.png')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取影象高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影象對比度減弱變換 DB=DA×0.8
for i in range(height):
    for j in range(width):
        gray = int(grayImage[i,j]*0.8)
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪製掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪製掩膜設定後的影象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪製直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其執行結果如圖2所示,其中(a)和(b)表示原始影象和對應的灰度直方圖,(c)和(d)表示灰度減弱或對比度縮小的影象及對應的直方圖。圖2(d)比圖2(b)的灰度級整體縮小了0.8倍,繪製的曲線更加密集。

三.影象反色直方圖對比

該演演算法將影象的顏色反色,對原影象的畫素值進行反轉,即黑色變為白色,白色變為黑色,使用的表示式為:

DB=255-DA

實現程式碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影象
img = cv2.imread('lena-hd.png')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取影象高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影象灰度反色變換 DB=255-DA
for i in range(height):
    for j in range(width):
        gray = 255 - grayImage[i,j]
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪製掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#繪製掩膜設定後的影象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#繪製直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其執行結果如圖3所示,其中(a)和(b)表示原始影象和對應的灰度直方圖,(c)和(d)表示灰度反色變換影象及對應的直方圖。圖3(d)與圖3(b)是反相對稱的,整個灰度值滿足DB=255-DA表示式。

四.影象對數變換直方圖對比

該演演算法將增加低灰度區域的對比度,從而增強暗部的細節,使用的表示式為:

下面程式碼實現了影象灰度的對數變換及直方圖對比。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影象
img = cv2.imread('lena-hd.png')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#獲取影象高度和寬度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#影象灰度對數變換
for i in range(height):
    for j in range(width):
        gray = 42 * np.log(1.0 + grayImage[i,j])
        result[i,j] = np.uint8(gray)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#計算灰度變換的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#原始影象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪製原始影象直方圖
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#灰度變換後的影象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#灰度變換影象的直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其執行結果如圖4所示,其中(a)和(b)表示原始影象和對應的灰度直方圖,(c)和(d)表示灰度對數變換影象及對應的直方圖。

五.影象閾值化處理直方圖對比

該演演算法原型為threshold(Gray,127,255,cv2.THRESH_BINARY),當前畫素點的灰度值大於thresh閾值時(如127),其畫素點的灰度值設定為最大值(如9位灰度值最大為255);否則,畫素點的灰度值設定為0。二進位制閾值化處理及直方圖對比的Python程式碼如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#讀取影象
img = cv2.imread('lena-hd.png')

#影象灰度轉換
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#二進位制閾值化處理
r, result = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)

#計算原圖的直方圖
hist = cv2.calcHist([img], [0], None, [256], [0,256])

#計算閾值化處理的直方圖
hist_res = cv2.calcHist([result], [0], None, [256], [0,256])

#原始影象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#繪製原始影象直方圖
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#閾值化處理後的影象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#閾值化處理影象的直方圖
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其執行結果如圖5所示,其中(a)和(b)表示原始影象和對應的灰度直方圖,(c)和(d)表示影象閾值化處理及對應的直方圖,圖5(d)中可以看到,灰度值僅僅分佈於0(黑色)和255(白色)兩種灰度級。

六.總結

本文主要講解影象直方圖理論知識以及直方圖繪製方法,包括灰度增強直方圖對比、灰度減弱直方圖對比、影象反色直方圖對比、影象對數變換直方圖對比、影象閾值化處理直方圖對比。灰度直方圖是灰度級的函數,描述的是影象中每種灰度級畫素的個數,反映影象中每種灰度出現的頻率。這篇文章的知識點將為後續影象處理和影象運算對比提供支撐。

以上就是Python影象運算之影象灰度直方圖對比詳解的詳細內容,更多關於Python灰度直方圖對比的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com