最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。
この例では、粒度分布を使用してイメージ内の雪片のサイズ分布を計算する方法を示します。粒度分布は、最初に各オブジェクトを明示的にセグメント化 (検出) せずにイメージ内のオブジェクトの大きさの分布を決定します。
イメージ 'snowflakes.png' を読み取ります。これは雪片の写真です。
I = imread('snowflakes.png');
imshow(I)
最初の手順では、イメージでの強度コントラストを最大化します。これを実行するには、コントラストを制限する適応ヒストグラム均等化を実行する関数 adapthisteq
を使用します。データ型の全ダイナミック レンジを満たすように、関数 imadjust
を使用してイメージ強度を再スケーリングします。
claheI = adapthisteq(I,'NumTiles',[10 10]);
claheI = imadjust(claheI);
imshow(claheI)
粒度分布は、雪片の表面積強度分布をサイズの関数として推定します。粒度分布でのイメージ オブジェクトは、サイズが増大する "ふるい" によって取捨選択される石のようなものであり、そのサイズは各パスを通過した後の残りを収集することで決まります。イメージ オブジェクトのふるい分けは、構造体要素のサイズを増加させながらイメージを開き、開いた後で残りの表面積強度 (イメージでのピクセル値の総和) をカウントすることで実行します。
構造体要素のサイズを増大させると表面積強度がゼロになるように、カウンターの制限を選択します。表示目的のために、表面積配列の最初のエントリは空白にします。
radius_range = 0:22; intensity_area = zeros(size(radius_range)); for counter = radius_range remain = imopen(claheI, strel('disk', counter)); intensity_area(counter + 1) = sum(remain(:)); end figure plot(intensity_area, 'm - *') grid on title('Sum of pixel values in opened image versus radius') xlabel('radius of opening (pixels)') ylabel('pixel value sum of opened objects (intensity)')
2 回連続したオープニング間で表面積強度が大幅に下がる場合は、イメージに小さいオープニングと同じようなサイズのオブジェクトがあるということです。これは、表面積強度配列の 1 次導関数と等しく、イメージには雪片のサイズ分布が含まれています。関数 diff
で 1 次導関数を計算します。
intensity_area_prime = diff(intensity_area); plot(intensity_area_prime, 'm - *') grid on title('Granulometry (Size Distribution) of Snowflakes') ax = gca; ax.XTick = [0 2 4 6 8 10 12 14 16 18 20 22]; xlabel('radius of snowflakes (pixels)') ylabel('Sum of pixel values in snowflakes as a function of radius')
グラフの局部的最小値とその半径の値に注意してください。局部的最小値により、その半径をもっている雪片があることが分かります。最小ポイントが負になると、その半径での雪片の累積強度が大きくなります。たとえば、負の最小ポイントは、5 ピクセルの半径マークで発生します。5 ピクセルの半径の雪片は、次の手順で抽出できます。
open5 = imopen(claheI,strel('disk',5)); open6 = imopen(claheI,strel('disk',6)); rad5 = imsubtract(open5,open6); imshow(rad5,[])
adapthisteq
| imadjust
| imopen
| imsubtract
| strel