目的
GradCAMの出力みたいな画像が作りたい、と思い調べてみたメモ。
サンプルコード環境
バージョン | |
---|---|
python | 3.10.9 |
cv2 | 4.6.0 |
手順
- ベース画像の読み込み
- 同サイズの出力をヒートマップ(カラーマップ)化
- アルファブレンディングでオーバーレイする
サンプルコード
0. 使用ライブラリ
import cv2
import numpy as np # サンプルマップ生成用
import matplotlib.pyplot as plt # 画像表示確認用
import skimage.data import cat # サンプル画像用
1. 画像読み込み
scikit-imageのサンプルデータで。
# img = cv2.imread("path/to/img")
img = cat()
height, width, _channel = img.shape
plt.imshow(img)
plt.show()
2. カラーマップ生成
ここが本来処理・解析結果の部分になる。
基本的にuint8のndarrayとなるように作成し、cv2.applyColorMapに渡せばよい。
# 適当な格子列生成
x = np.arange(width)
y = np.arange(height)
X, Y = np.meshgrid(x, y)
Z = X + Y
# Zを0-255にスケーリング
Z_uint8 = np.array((Z - Z.min()) / (Z.max() - Z.min()) * 255, dtype=np.uint8)
# カラーマップ化
colormap = cv2.applyColorMap(Z_uint8, cv2.COLORMAP_JET)
plt.imshow(colormap)
plt.show()
3. アルファブレンディング
アルファブレンディング(=透過処理して画像をオーバーレイ)を適用。cv2.addWeightedを使えばOK
alpha = 0.5 # 割合は0-1で調整。
blend = cv2.addWeighted(img, alpha, colormap, 1-alpha, 0)
plt.imshow(blend)
plt.show()
ひとまずこれで満足。