Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

dice

イメージ セグメンテーションのための Sørensen-Dice 類似度係数

説明

similarity = dice(BW1,BW2) は、バイナリ イメージ BW1BW2 との間の Sørensen-Dice 類似度係数を計算します。

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

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

すべて折りたたむ

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

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

動的輪郭セグメンテーションの Dice 指数をグラウンド トゥルースと比較して計算します。

similarity = dice(BW, BW_groundTruth);

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

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

Figure contains an axes object. The axes object with title Dice Index = 0.83828 contains an object of type image.

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

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

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;

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

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
montage({label2rgb(L),label2rgb(L_groundTruth)})
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.

セグメント化された領域ごとに Dice 類似度係数を計算します。Dice 類似度係数は 2 番目の領域で顕著に小さくなります。この結果は、イメージの右下隅の土を葉として誤って分類するセグメンテーション結果の視覚的な比較と一致しています。

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

    0.9396
    0.7247
    0.9139

入力引数

すべて折りたたむ

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

データ型: logical

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

データ型: logical

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

データ型: double

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

データ型: double

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

データ型: category

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

データ型: category

出力引数

すべて折りたたむ

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

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

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

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

データ型: double

詳細

すべて折りたたむ

Dice 類似度係数

2 つの集合 A および B の Dice 類似度係数は次のように表されます。

dice(A,B) = 2 * | intersection(A,B) | / ( | A | + | B | )

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

dice(A,B) = 2 * TP / ( 2 * TP + FP + FN)

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

dice(A,B) = 2 * jaccard(A,B) / (1 + jaccard(A,B) )

バージョン履歴

R2017b で導入