技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

動画・画像にSaliency Mapを重ねて出力する(Python, OpenCV)

pythonOpenCVを使って顕著性マップ(saliency map)を元の画像に重ねて表示する。
重ねて表示することで動画や画像を目視しながら分析することができる。

顕著性マップ(saliency map)とは

サリエンシーマップとは、人々の視線が最初に向かう領域を表現するヒートマップのこと。視覚的な重要度をピクセル単位で示すためのもので、画像の自動編集やマーケティングの分析などに活用されている。
アルゴリズムとしては古典的なアルゴリズムベースのものに加え、近年では深層学習を使ってサリエンシーマップを推定する技術の研究も盛んである。
OpenCVなどで実装されているものは古典的なアルゴリズムで、計算量はO(N)(Nはピクセル数)。

実装

1. 必要なライブラリをインストール

pip3 install opencv-python
pip3 install opencv-contrib-python


2. 実装

import cv2

def __saliency(src):
    saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
    (success, saliemcy_map) = saliency.computeSaliency(src)
    if success is False:
        return (False, None)
    saliemcy_map = (saliemcy_map * 255).astype("uint8")
    heatmap = cv2.applyColorMap(saliemcy_map, cv2.COLORMAP_JET)
    # src1の重み0.7 src2の重み0.5 ガンマ1.0
    weight = cv2.addWeighted(src,0.7, heatmap ,0.5 ,1.0)
    return (success, weight)


def movie_saliency(src_file = "sample_video.mp4", dst_file = "sample_output.mp4"):
    input_video = cv2.VideoCapture(src_file)
    fps = input_video.get(cv2.CAP_PROP_FPS)
    frame_width = int(input_video.get(cv2.CAP_PROP_FRAME_WIDTH))
    frame_height = int(input_video.get(cv2.CAP_PROP_FRAME_HEIGHT))
    output_video = cv2.VideoWriter(dst_file, cv2.VideoWriter_fourcc(*'mp4v'), fps, (frame_width, frame_height))
    while True:
        ret, frame = input_video.read()
        if ret is not True:
            break
        (success, saliemcy_map) = __saliency(frame)
        if success is True:
            output_video.write(saliemcy_map)
    input_video.release()
    output_video.release()


def img_saliency(src_file = "sample.jpg", dst_file = "sample_output.jpg"):
    image = cv2.imread(src_file)
    saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
    (success, saliemcy_map) = __saliency(image)
    if success is True:
        cv2.imwrite(dst_file, saliemcy_map)


if __name__=="__main__":
    movie_saliency()
    img_saliency()

3. 実行結果
元画像

実行結果

元動画

実行結果