私と一緒に Python 画像処理を学ぶ丨画像のグレースケール非線形変換とは

要約: この記事では主にグレースケールの線形変換について説明します。基本的な知識が役立つことを願っています。

この記事は、HUAWEI CLOUD コミュニティ「[Python 画像処理] 16. 画像のグレースケール非線形変換の対数変換とガンマ変換」、著者:eastmount から共有されています。

この記事では主に非線形変換について説明し、対数変換やガンマ変換などのカスタム メソッドを使用して画像をグレースケールします。

1. 画像のグレースケール非線形変換

画像のグレースケール非線形変換には、主に対数変換、累乗変換、指数変換、および区分関数変換が含まれます.画像のグレースケール処理は、非線形関係によって実行されます.以下では、主に3つの一般的なグレースケール非線形変換について説明します.

元の画像のグレー値は、DB=DA×DA/255 の式に従って非線形に変換され、コードは次のようになります。

# -*- coding: utf-8 -*-
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.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×DA/255
for i in range(height):
 for j in range(width):
 gray = int(grayImage[i,j])*int(grayImage[i,j]) / 255
 result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

イメージのグレースケール非線形変換の出力結果を次の図に示します。

2. 画像のグレースケール対数変換

画像のグレースケールの対数変換は、一般に次の式で表されます。

ここで、c はスケール比較定数、DA は元の画像のグレー値、DB は変換されたターゲット グレー値です。下の図に示すように、対数曲線の下のグレー値の変化を表します。

対数曲線は、画素値の低い領域では傾きが大きく、画素値の高い領域では傾きが小さいため、画像を対数変換すると、暗い領域のコントラストが改善されます。この変換を使用して、画像の暗い部分を強調し、圧縮された高価値画像の暗いピクセルを拡大できます。

対数変換は、低いグレースケール値を拡大し、高いグレースケール値を圧縮する効果を実現し、分光画像の表示に広く使用されています。典型的なアプリケーションはフーリエ スペクトルであり、そのダイナミック レンジは 0 ~ 106 と広い場合があります。スペクトルを直接表示すると、画像表示デバイスのダイナミック レンジが要件を満たさないことが多く、多くの暗い詳細が失われます。対数変換を使用すると、画像のダイナミック レンジは次のようになります。ダイナミック レンジは、はっきりと表示できるように適度に非線形に圧縮されます。下の画像では、変換されていないスペクトルが対数変換されて、低グレー領域のコントラストが増加し、暗い領域のディテールが強調されています。

次のコードは、画像のグレースケールの対数変換を実装します。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#绘制曲线
def log_plot(c):
    x = np.arange(0, 256, 0.01)
    y = c * np.log(1 + x)
 plt.plot(x, y, 'r', linewidth=1)
 plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
 plt.title(u'对数变换函数')
 plt.xlim(0, 255), plt.ylim(0, 255)
 plt.show()
#对数变换
def log(c, img):
 output = c * np.log(1.0 + img)
 output = np.uint8(output + 0.5)
 return output
#读取原始图像
img = cv2.imread('test.png')
#绘制对数变换曲线
log_plot(42)
#图像灰度对数变换
output = log(42, img)
#显示图像
cv2.imshow('Input', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

次の図は、対数関数処理後の効果を示しています.対数変換は、全体的なコントラストが低く、グレー値が低い画像強調効果に適しています.

対応する対数関数曲線を図に示します

3. 画像のグレースケール ガンマ変換

指数変換またはベキ変換とも呼ばれるガンマ変換は、一般的に使用されるもう 1 つのグレースケール非線形変換です。画像のグレースケールのガンマ変換は、一般に次の式で表されます。

  • γ>1 の場合、画像内のグレー レベルの高い領域が引き伸ばされ、グレー レベルの低い部分が圧縮されます。
  • γ<1 の場合、画像内のグレー レベルの低い領域が引き伸ばされ、グレー レベルの高い部分が圧縮されます。
  • γ=1 の場合、グレースケール変換は線形であり、元の画像は線形に変化します。

Python は画像グレースケールのガンマ変換コードを次のように実装します。これは主に power 関数を呼び出すことによって実装されます。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import cv2
#绘制曲线
def gamma_plot(c, v):
    x = np.arange(0, 256, 0.01)
    y = c*x**v
 plt.plot(x, y, 'r', linewidth=1)
 plt.rcParams['font.sans-serif']=['SimHei'] #正常显示中文标签
 plt.title(u'伽马变换函数')
 plt.xlim([0, 255]), plt.ylim([0, 255])
 plt.show()
#伽玛变换
def gamma(img, c, v):
 lut = np.zeros(256, dtype=np.float32)
 for i in range(256):
 lut[i] = c * i ** v
 output_img = cv2.LUT(img, lut) #像素灰度值的映射
 output_img = np.uint8(output_img+0.5) 
 return output_img
#读取原始图像
img = cv2.imread('test.png')
#绘制伽玛变换曲线
gamma_plot(0.00000005, 4.0)
#图像灰度伽玛变换
output = gamma(img, 0.00000005, 4.0)
#显示图像
cv2.imshow('Imput', img)
cv2.imshow('Output', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

次の図は、ガンマ変換処理後の効果を示しています. ガンマ変換は、画像のコントラストが低く、全体的な輝度値が高い場合 (またはカメラの露出オーバーのため)、明らかな画像強調効果があります.

対応するべき乗関数曲線を図 1 に示します。

 

フォローをクリックして、HUAWEI CLOUDの新技術について初めて学びましょう〜

{{o.name}}
{{m.name}}

おすすめ

転載: my.oschina.net/u/4526289/blog/5572461