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')

Figure contains an axes object. The axes object with title Original Image contains an object of type 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)])

Figure contains an axes object. The axes object with title Jaccard Index = 0.72158 contains an object of type image.

この例では、イメージを複数の領域にセグメント化する方法を説明します。この例では、各領域の 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')

Figure contains an axes object. The axes object with title Seed Regions contains 7 objects of type line, image.

測地線距離ベースの色のセグメンテーションを使用して、イメージを 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)')

Figure contains an axes object. The axes object with title Comparison of Segmentation Results (Left) and Ground Truth (Right) contains an object of type image.

セグメント化された領域ごとに 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 で導入

参考

|