要約: この記事では主にグレースケールの線形変換について説明します。基本的な知識が役立つことを願っています。
この記事は、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の新技術について初めて学びましょう〜