OpenCVで顕著性検出(Saliency Detection)


関連記事: 画像解析

今回の記事はOpenCVに入っている顕著性(Saliency)について解説したいと思います。

目次

1. Saliency Detectionの概要
2. 実験・コード
__2.1 データロード
__2.2 サリエンシーディテクションの関数
__2.3. SpectralResidualの顕著性
__2.4. FineGrainedの顕著性

1. Saliency Detectionの概要

顕著性を検出するには多くの方法があります。 OpenCVでは、顕著性検出用に提供されているアルゴリズムは3つのカテゴリに分類されます。

Static saliency : 画像から検出するモジュールです。Motion saliency : 動画のフレームに依存するモジュールです。今回は static saliencyについて解説します。static saliencyのアルゴリズムは、画像の人が良く注目する部分を検出できるようにするさまざまな画像機能を使用します。 OpenCVには、スペクトル残差と細粒度の2つのアルゴリズムがすでに実装されています。

Spectral Residual
このアルゴリズムは、入力画像の対数スペクトルを分析し、スペクトルドメイン内の画像のスペクトル残差を抽出し、プロトオブジェクトの位置を示唆する顕著性マップを構築する高速な方法が実装されています。

Fine Grained
人間の目の網膜は神経節細胞で構成されています。 神経節細胞には、オンセンターとオフセンターの2種類があります。 オンセンターは、暗い背景に囲まれた明るい領域に反応します。 オフセンターは、明るい背景に囲まれた暗い領域に反応します。

このアルゴリズムは、オンセンター(on-center )とオフセンター(off-center)の違いに基づいて顕著性を計算します。

opencv/opencv_contribのモジュール:
cv2.saliency.StaticSaliencySpectralResidual_create()
cv2.saliency.StaticSaliencyFineGrained_create()

2. 実験・コード

概要:
入力データ: ウィキペディアからの画像
環境:Google Colab GPU
ライブラリ: OpenCV
実験:顕著性による物体特定

2.1 データロード

# 画像をロード
import urllib
img_src = "https://upload.wikimedia.org/wikipedia/commons/a/a4/Robert_Downey_Jr._Expo_2011.jpg"
urllib.request.urlretrieve(img_src, img_path)

(‘input_image.jpg’, <http.client.HTTPMessage at 0x7f1ca7fe8240>)

# 画像を表示
from IPython.display import Image,display_jpeg
img_path = 'input_image.jpg'
display_jpeg(Image(img_path))

2.2 サリエンシーディテクションの関数

import cv2

def saliency_detect(input_img, output_img, method):
    img = cv2.imread(input_img, 1) # 画像読み込み

    # アルゴリズムの設定
    saliency = None
    if method == 'SR':
        saliency = cv2.saliency.StaticSaliencySpectralResidual_create()
    elif method == 'FG':
        saliency = cv2.saliency.StaticSaliencyFineGrained_create() 
    if saliency is None:
    exit()

    # サリエンシーディテクション
    bool, map = saliency.computeSaliency(img)
    i_saliency = (map * 255).astype("uint8")

    # スレッショルド作成
    i_threshold = cv2.threshold(i_saliency, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]

    # heatmap作成
    heatmap = cv2.applyColorMap(i_saliency, cv2.COLORMAP_HOT)

    # 画像を保存
    cv2.imwrite(output_img, heatmap)
    cv2.imwrite("th_" + output_img, i_threshold)

2.3. SpectralResidualの顕著性

手と顔の顕著性を検出しました。

# SpectralResidual

input_img = 'input_image.jpg'
output_img = 'output_image1.jpg'
saliency_detect(input_img, output_img, method='SR')

display_jpeg(Image(img_path))
display_jpeg(Image(output_img))
display_jpeg(Image("th_" + output_img))

2.4. FineGrainedの顕著性

FineGrainedは照明 、手、顔の顕著性を検出しました。

# FineGrained

input_img = 'input_image.jpg'
output_img = 'output_image2.jpg'
saliency_detect(input_img, output_img, method='FG')

display_jpeg(Image(img_path))
display_jpeg(Image(output_img))
display_jpeg(Image("th_" + output_img))