File size: 3,048 Bytes
da8bdb9
8ccf878
 
da8bdb9
 
 
 
 
 
 
46c8ce2
 
da8bdb9
afb0c77
8ccf878
da8bdb9
8ccf878
da8bdb9
 
 
 
8ccf878
46c8ce2
 
 
 
 
 
 
 
 
da8bdb9
 
 
 
 
 
 
8ccf878
da8bdb9
46c8ce2
da8bdb9
 
 
 
 
46c8ce2
 
 
da8bdb9
 
 
8ccf878
 
da8bdb9
8ccf878
 
 
da8bdb9
46c8ce2
8ccf878
da8bdb9
 
8ccf878
da8bdb9
46c8ce2
 
 
da8bdb9
 
46c8ce2
da8bdb9
8ccf878
46c8ce2
 
8ccf878
46c8ce2
22a27a1
da8bdb9
8ccf878
 
da8bdb9
 
8ccf878
da8bdb9
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# -*- 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)