web-dev-qa-db-ja.com

Python OpenCVを使用してグレースケール画像をヒートマップ画像に変換する方法

白黒の(540, 960, 1)の範囲の値を持つ[0..255]形状の画像があります。 「ヒートマップ」表現に変換する必要があります。例として、255のあるピクセルは熱が最も多く、0のあるピクセルは最も熱が少ない必要があります。その他の中間。また、ヒートマップをNumpy配列として返す必要があるため、後でビデオにマージできます。これを達成する方法はありますか?

2

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カラーマップ選択は次のとおりです。

1
nathancy

画像を適切なグレースケール表現に変換する必要があります。これは、特にimread(filename, cv2.IMREAD_GRAYSCALE)を使用して、いくつかの方法で実行できます。これにより、画像の形状が(54,960)(ヒント、3番目の次元なし)。

0
jhill515