Main Content

jaccard

イメージ セグメンテーションのための Jaccard 類似度係数

説明

similarity = jaccard(BW1,BW2) は、バイナリ イメージ BW1BW2 の交点を BW1BW2 の和集合で割った値、別名、Jaccard 指数を計算します。イメージには、バイナリ イメージ、ラベル イメージまたは categorical イメージを指定できます。

similarity = jaccard(L1,L2) は、ラベル イメージ L1L2 の各ラベルの Jaccard 指数を計算します。

similarity = jaccard(C1,C2) は、categorical イメージ C1C2 の各カテゴリの Jaccard 指数を計算します。

すべて折りたたむ

セグメント化するオブジェクトを含むイメージを読み取ります。イメージをグレースケールに変換し、結果を表示します。

A = imread('hands1.jpg');
I = im2gray(A);
figure
imshow(I)
title('Original Image')

動的輪郭 (snakes) 法を使用して手をセグメント化します。

mask = false(size(I));
mask(25:end-25,25:end-25) = true;
BW = activecontour(I, mask, 300);

セグメンテーションを比較するためのグラウンド トゥルースを読み取ります。

BW_groundTruth = imread('hands1-mask.png');

このセグメンテーションの Jaccard 指数を計算します。

similarity = jaccard(BW, BW_groundTruth);

マスクを重ねて表示します。色はマスクの違いを示します。

figure
imshowpair(BW, BW_groundTruth)
title(['Jaccard Index = ' num2str(similarity)])

この例では、イメージを複数の領域にセグメント化する方法を説明します。この例では、各領域の Jaccard 類似度係数を計算します。

セグメント化する複数の領域を含むイメージを読み取ります。

RGB = imread('yellowlily.jpg');

典型的な色の特性を区別する 3 つの領域用にスクリブルを作成します。最初の領域には黄色の花が分類されます。2 番目の領域には、緑色の茎および葉が分類されます。最後の領域には、茶色の土が2 つのイメージのパッチに分かれて分類されます。領域は、要素が ROI の左上隅の x 座標と y 座標、ROI の幅、および ROI の高さを示す 4 要素ベクトルで指定されます。

region1 = [350 700 425 120]; % [x y w h] format
BW1 = false(size(RGB,1),size(RGB,2));
BW1(region1(2):region1(2)+region1(4),region1(1):region1(1)+region1(3)) = true;

region2 = [800 1124 120 230];
BW2 = false(size(RGB,1),size(RGB,2));
BW2(region2(2):region2(2)+region2(4),region2(1):region2(1)+region2(3)) = true;

region3 = [20 1320 480 200; 1010 290 180 240]; 
BW3 = false(size(RGB,1),size(RGB,2));    
BW3(region3(1,2):region3(1,2)+region3(1,4),region3(1,1):region3(1,1)+region3(1,3)) = true;
BW3(region3(2,2):region3(2,2)+region3(2,4),region3(2,1):region3(2,1)+region3(2,3)) = true;

イメージの上にシード領域を表示します。

figure
imshow(RGB)
hold on
visboundaries(BW1,'Color','r');
visboundaries(BW2,'Color','g');
visboundaries(BW3,'Color','b');
title('Seed Regions')

測地線距離ベースの色のセグメンテーションを使用して、イメージを 3 領域にセグメント化します。

L = imseggeodesic(RGB,BW1,BW2,BW3,'AdaptiveChannelWeighting',true);

イメージのグラウンド トゥルース セグメンテーションを読み込みます。

L_groundTruth = double(imread('yellowlily-segmented.png'));

セグメンテーションの結果をグラウンド トゥルースと視覚的に比較します。

figure
imshowpair(label2rgb(L),label2rgb(L_groundTruth),'montage')
title('Comparison of Segmentation Results (Left) and Ground Truth (Right)')

セグメント化された領域ごとに Jaccard 類似度指数 (IoU) を計算します。

similarity = jaccard(L, L_groundTruth)
similarity = 3×1

    0.8861
    0.5683
    0.8414

Jaccard 類似度インデックスは 2 番目の領域で顕著に小さくなります。この結果は、イメージの右下隅の土を葉として誤って分類するセグメンテーション結果の視覚的な比較と一致しています。

入力引数

すべて折りたたむ

最初のバイナリ イメージ。任意の次元の logical 配列として指定します。

データ型: logical

2 番目のバイナリ イメージ。BW1 と同じサイズの logical 配列として指定します。

データ型: logical

最初のラベル イメージ。非負の整数から成る任意の次元の配列として指定します。

データ型: double

2 番目のラベル イメージ。L1 と同じサイズの非負の整数から成る配列として指定します。

データ型: double

最初の categorical イメージ。任意の次元の categorical 配列として指定します。

データ型: category

2 番目の categorical イメージ。C1 と同じサイズの categorical 配列として指定します。

データ型: category

出力引数

すべて折りたたむ

Jaccard 類似度係数。範囲 [0, 1] の値を持つ数値スカラーまたは数値ベクトルとして返されます。similarity が 1 の場合、2 つのイメージのセグメンテーションが完全一致であることを意味します。入力配列に応じて、次のようになります。

  • バイナリ イメージ。similarity はスカラーです。

  • ラベル イメージ。similarity はベクトルで、最初の係数はラベル 1 の Jaccard 指数、2 番目の係数はラベル 2 の Jaccard 指数となり、以下同様です。

  • categorical イメージ。similarity はベクトルで、最初の係数は最初のカテゴリの Jaccard 指数、2 番目の係数は 2 番目のカテゴリの Jaccard 指数となり、以下同様です。

データ型: double

詳細

すべて折りたたむ

Jaccard 類似度係数

2 つの集合 A および B の Jaccard 類似度係数 (別名 Intersection over Union または IoU) は次のように表されます。

jaccard(A,B) = | intersection(A,B) | / | union(A,B) |

ここで |A| は、集合 A の基数を表します。Jaccard 指数は、真陽性 (TP)、偽陽性 (FP)、および偽陰性 (FN) に関して次のように表すこともできます。

jaccard(A,B) = TP / (TP + FP + FN)

Jaccard 指数は、次のように Dice 指数に関連します。

jaccard(A,B) = dice(A,B) / (2 - dice(A,B) )

バージョン履歴

R2017b で導入

参考

|