SaliencyMapDemo / src /saliency.py
umyuu
リファクタリング
46c8ce2
raw
history blame
3.05 kB
# -*- coding: utf-8 -*-
"""SaliencyMapを計算する"""
from typing import Any, Tuple, Literal
import numpy as np
import cv2
class SaliencyMap:
"""
画像から顕著性マップを計算するクラス。
Example:
from src.saliency import SaliencyMap
saliency = SaliencyMap("SpectralResidual")
success, saliencyMap = saliency.compute(image)
"""
def __init__(
self,
algorithm: Literal["SpectralResidual", "FineGrained"] = "SpectralResidual",
):
"""
SaliencyMapオブジェクトを初期化します。
Parameters:
algorithm: 使用する顕著性マップアルゴリズムの種類。
有効なアルゴリズムについてはOpenCVのドキュメントを参照してください。
https://docs.opencv.org/4.9.0/d8/d65/group__saliency.html
"""
self.algorithm = algorithm
# OpenCVのsaliencyを作成します。
if algorithm == "SpectralResidual":
self.saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
else:
self.saliency = cv2.saliency.StaticSaliencyFineGrained_create()
def compute(self, image: np.ndarray) -> Tuple[bool, Any]:
"""
入力画像から顕著性マップを計算します。
Parameters:
image: 入力画像
Returns:
Tuple[bool, Any]: 顕著性マップの計算結果。
bool値がTrueの場合は計算成功、Falseの場合は失敗。
顕著性マップのデータ。
"""
return self.saliency.computeSaliency(image)
def convert_colormap(
image: np.ndarray,
saliency_map: np.ndarray,
colormap_name: Literal["jet", "hot", "turbo"] = "jet"
):
"""
入力画像と顕著性マップを合成し、指定されたカラーマップを適用します。
Parameters:
image: 入力画像
saliency_map: 顕著性マップ
colormap_name: カラーマップの種類
"jet": Jetカラーマップ
"hot": Hotカラーマップ
"turbo": Turboカラーマップ
Returns:
np.ndarray: 合成された画像 (RGBA形式)
"""
maps = {"jet": cv2.COLORMAP_JET, "hot": cv2.COLORMAP_HOT, "turbo": cv2.COLORMAP_TURBO}
# colormap_nameが有効かどうかをチェック
if colormap_name not in maps:
raise ValueError(f"Invalid colormap name: {colormap_name}")
# 顕著性マップをカラーマップに変換
saliency_map = (saliency_map * 255).astype("uint8")
saliency_map = cv2.applyColorMap(saliency_map, maps[colormap_name])
#return saliencyMap
# 入力画像とカラーマップを重ね合わせ
overlay = cv2.addWeighted(image, 0.5, saliency_map, 0.5, 0)
#return overlay
return cv2.cvtColor(overlay, cv2.COLOR_BGR2RGBA)