【Python/OpenCV】線形濃度変換(ヒストグラム拡張など)

この記事では、Python版OpenCVで画像の線形濃度変換(ヒストグラム拡張など)する方法をソースコード付きで解説します。

線形濃度変換

線形濃度変換とは、横軸を入力画像の画素値、縦軸を出力画像の画素値とする線形マッピングです。
GIMPやPhotoshopなどの画像加工ソフトに濃度を変更するツールとして組み込まれています。
線形濃度変換は、画像のコントラストを調整し、画像を人が視認しやすいように変換することができます。
【詳細】トーンカーブ(線形濃度変換)の原理・計算式

今回は、Python言語+OpenCV+NumPyを用いて代表的な変換4つ(原理はこちらを参照)を実装してみました。

ソースコード(Python3+OpenCV3)

サンプルプログラムのソースコードです。

#-*- coding:utf-8 -*-
import cv2
import numpy as np


def main():
    # 入力画像を読み込み
    img = cv2.imread("input.jpg")

    # グレースケール変換
    gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

    # 線形濃度変換
    a, k = 0.7, 20
    zmin, zmax = 20.0, 220.0
    # gray = a * gray    # 変換1
    # gray = gray + k    # 変換2
    gray = a * (gray - 127.0) + 127.0 # 変換3
    #gray = gray.max() * (gray - zmin)/(zmax - zmin) # 変換4

    # 画素値を0~255の範囲内に収める
    gray[gray < 0] = 0
    gray[gray > 255] = 255

    # 結果の出力
    cv2.imwrite("output.jpg", gray)


if __name__ == "__main__":
    main()

※動作には、OpenCVライブラリのインストールが必要です。

実行結果

サンプルプログラムの実行結果です。

■入力画像(右)、出力画像(右)

【おすすめ記事】
PythonでOpenCV入門 サンプル集
【Python】画像処理プログラミング入門
【画像処理入門】アルゴリズム&プログラミング

シェア&フォローお願いします!