白黒の(540, 960, 1)
の範囲の値を持つ[0..255]
形状の画像があります。 「ヒートマップ」表現に変換する必要があります。例として、255
のあるピクセルは熱が最も多く、0
のあるピクセルは最も熱が少ない必要があります。その他の中間。また、ヒートマップをNumpy配列として返す必要があるため、後でビデオにマージできます。これを達成する方法はありますか?
2つの方法があります。1つはMatplotlibを使用し、もう1つはOpenCVのみを使用します。
メソッド#1:OpenCV
+ _matplotlib.pyplot.get_cmap
_
グレースケール(1チャネル)_->
_ヒートマップ(3チャネル)変換を実装するには、まず画像にグレースケールとしてロードします。デフォルトでは、OpenCVは画像を3チャネル、8ビットBGRとして読み込みます。 cv2.imread()
を_cv2.IMREAD_GRAYSCALE
_パラメータと共に使用するか、または cv2.cvtColor()
を使用して、画像をグレースケールとして直接読み込むことができます_cv2.COLOR_BGR2GRAY
_パラメータを使用してBGR画像をグレースケールに変換します。画像を読み込んだら、このグレースケール画像をMatplotlibに入れてヒートマップ画像を取得します。 MatplotlibはRGB形式を返すため、OpenCVで使用するには、Numpy形式に変換しなおしてBGR色空間に切り替える必要があります。以下は、科学的赤外線カメラ画像をinferno
カラーマップの入力として使用する例です。希望するユースケースに応じて利用可能な組み込みカラーマップについては、 Matplotlibでのカラーマップの選択 を参照してください。
入力画像:
出力ヒートマップ画像:
コード
_import matplotlib.pyplot as plt
import numpy as np
import cv2
image = cv2.imread('frame.png', 0)
colormap = plt.get_cmap('inferno')
heatmap = (colormap(image) * 2**16).astype(np.uint16)[:,:,:3]
heatmap = cv2.cvtColor(heatmap, cv2.COLOR_RGB2BGR)
cv2.imshow('image', image)
cv2.imshow('heatmap', heatmap)
cv2.waitKey()
_
メソッド#2:cv2.applyColorMap()
OpenCVの組み込みヒートマップ機能を使用できます。これが_cv2.COLORMAP_HOT
_ヒートマップを使用した結果です
コード
_import cv2
image = cv2.imread('frame.png', 0)
heatmap = cv2.applyColorMap(image, cv2.COLORMAP_HOT)
cv2.imshow('heatmap', heatmap)
cv2.waitKey()
_
注:OpenCVの組み込み実装は短くて迅速ですが、より大きなカラーマップの選択があるため、方法#1を使用することをお勧めします。 Matplotlibには 数百のさまざまなカラーマップ があり、 独自のカスタムカラーマップを作成する が可能ですが、OpenCVには12のみから選択できます。組み込みのOpenCVカラーマップ選択は次のとおりです。
画像を適切なグレースケール表現に変換する必要があります。これは、特にimread(filename, cv2.IMREAD_GRAYSCALE)
を使用して、いくつかの方法で実行できます。これにより、画像の形状が(54,960)
(ヒント、3番目の次元なし)。