Main Content

measureSharpness

テスト チャートを使用した空間周波数応答の測定

説明

esfrChart オブジェクト

Imatest® eSFR テスト チャートの強調版または拡張版の傾斜したエッジ関心領域 (ROI) を自動的に検出する場合は、esfrChart オブジェクトを使用します[1]

sharpnessValues = measureSharpness(chart) は、Imatest eSFR テスト チャートのすべての傾斜したエッジ ROI における空間周波数応答 (SFR) を測定します。

sharpnessValues = measureSharpness(chart,Name=Value) は、名前と値の引数を使用して ROI と測定値を調整します。たとえば、名前と値の引数 PercentResponse を使用して、対応する空間周波数が報告される周波数応答値を指定できます。

[sharpnessValues,averageSharpness] = measureSharpness(___) は、前の構文の入力引数の任意の組み合わせを使用して、垂直方向および水平方向の ROI の平均 SFR も返します。

テスト チャート イメージ (R2024a 以降)

esfrChart オブジェクトでサポートされていないその他のタイプのテスト チャートの場合、テスト チャート イメージを使用します。傾斜したエッジ ROI の位置を特定しなければなりません。

sharpnessValues = measureSharpness(im,roiPositions) は、テスト チャート イメージ im 内の位置 roiPositions におけるすべての ROI における SFR を測定します。返された鮮鋭度テーブルには、応答が初期値およびピーク値の 50% に低下する各 ROI の周波数が含まれます。

sharpnessValues = measureSharpness(im,roiPositions,PercentResponse=p) は、名前と値の引数 PercentResponse を使用して、対応する空間周波数が報告される周波数応答値も指定します。

すべて折りたたむ

eSFR チャートのイメージをワークスペースに読み取ります。

I = imread("eSFRTestImage.jpg");

esfrChart オブジェクトを作成し、ROI 注釈を含むチャートを表示します。60 個の傾斜したエッジ ROI には緑色の数字でラベル付けされています。

chart = esfrChart(I);
displayChart(chart,displayColorROIs=false, ...
    displayGrayROIs=false,displayRegistrationPoints=false)

ROI 25 ~ 28 のエッジの鮮鋭度を測定し、測定値を sharpnessTable で返します。名前と値の引数 PercentResponse を指定して MTF70 および MTF30 の測定値を含めます。

sharpnessTable = measureSharpness(chart,ROIIndex=25:28,PercentResponse=[70 30])
sharpnessTable=4×9 table
    ROI    slopeAngle    confidenceFlag        SFR           comment                          MTF70                                           MTF70P                                        MTF30                                       MTF30P                 
    ___    __________    ______________    ____________    ____________    ____________________________________________    ____________________________________________    ________________________________________    ________________________________________

    25       4.2612          true          {84x5 table}    {0x0 double}    0.061813    0.059159    0.052978     0.06016    0.061813    0.059159    0.052978     0.06016    0.10726    0.11137    0.10976    0.11064    0.10726    0.11137    0.10976    0.11064
    26       5.0749          true          {84x5 table}    {0x0 double}     0.18617     0.18573     0.18613     0.18623     0.18617     0.18573     0.18613     0.18623    0.26279    0.26419     0.2628    0.26398    0.26279    0.26419     0.2628    0.26398
    27       4.7436          true          {84x5 table}    {0x0 double}    0.069296    0.069197    0.064096    0.068951    0.069296    0.069197    0.064096    0.068951    0.21611    0.21953    0.21891    0.21977    0.21611    0.21953    0.21891    0.21977
    28       4.7982          true          {84x5 table}    {0x0 double}     0.19005     0.20272     0.19611      0.1999     0.19005     0.20243     0.19595      0.1999    0.26278    0.27244     0.2617     0.2707    0.26278    0.27228    0.26164     0.2707

ROI 28 に対応する、鮮鋭度テーブルの 4 番目の行を選択します。ROI の SFR プロットを表示します。

idx = 4;
plotSFR(sharpnessTable(idx,:))

ROI の MTF70 および MTF30 測定値を出力します。測定値をプロットと比較します。

赤および青のカラー チャネルの MTF70 測定値は 0.2 よりわずかに小さくなり、緑および輝度のチャネルの MTF70 測定値は 0.2 よりわずかに大きくなります。これらの測定値は、ピクセルあたり 0.2 ライン ペア前後の空間周波数で 0.7 の SFR 値が生じるような SFR プロットの目視検査と一致します。

mtf70 = sharpnessTable.MTF70(idx,:)
mtf70 = 1×4

    0.1900    0.2027    0.1961    0.1999

青のチャネルの MTF30 測定値は、他のカラー チャネルの MTF30 測定値よりも顕著に小さくなります。この測定値は、青のチャネルの SFR 曲線が他のチャネルよりも迅速に低下するような SFR プロットの目視検査と一致します。

mtf30 = sharpnessTable.MTF30(idx,:)
mtf30 = 1×4

    0.2628    0.2724    0.2617    0.2707

傾斜したエッジ ROI を含むカスタム テスト チャートのイメージを読み取って表示します。

I = imread("slantedSquare.jpg");
imshow(I)

Figure contains an axes object. The axes object contains an object of type image.

上部を起点として時計回りにエッジの ROI を描画します。

numROIs = 4;
roiPos = zeros(numROIs,4);
for cnt = 1:numROIs
    hrect = drawrectangle;
    roiPos(cnt,:) = hrect.Position;
end  

Figure contains an axes object. The axes object contains 5 objects of type image, images.roi.rectangle.

選択した ROI の SFR、MTF50、および MTF50P を計算します。

sharpnessValues = measureSharpness(I,roiPos)
sharpnessValues=4×8 table
    ROI    slopeAngle    confidenceFlag         SFR           comment                        MTF50                                       MTF50P                           ROIPosition       
    ___    __________    ______________    _____________    ____________    ________________________________________    ________________________________________    ________________________

     1       3.9977          true          { 95×5 table}    {0×0 double}    0.18531    0.18554    0.17757    0.18482    0.18531    0.18554    0.17757    0.18482    205     85    269     93
     2       4.0233          true          {109×5 table}    {0×0 double}    0.18567    0.18623     0.1767    0.18533    0.18567    0.18623     0.1767    0.18533    508    188    107    234
     3       3.9977          true          {104×5 table}    {0×0 double}    0.18401    0.18393    0.17425    0.18317    0.18401    0.18393    0.17425    0.18317    243    468    295    102
     4       3.9827          true          {119×5 table}    {0×0 double}    0.18556    0.18624    0.17595    0.18534    0.18556    0.18624    0.17595    0.18534    101    215    117    242

入力引数

すべて折りたたむ

eSFR チャート。esfrChart オブジェクトとして指定します。

R2024a 以降

テスト チャート イメージ。RGB イメージまたはグレースケール イメージとして指定します。

R2024a 以降

ROI の位置。n 行 4 列の数値配列として指定します。ここで、n は ROI の数です。各 ROI の形式は [X Y Width Height] です。ここで、XY は ROI の左上隅の座標です。WidthHeight は ROI の幅と高さ (ピクセル単位) です。

水平方向のエッジの場合、横方向の (高さよりも幅が大きい) 縦横比をもつ ROI を指定します。同様に、垂直方向のエッジの場合、縦方向の (幅よりも高さが大きい) 縦横比をもつ ROI を指定します。

名前と値の引数

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: sharpnessValues = measureSharpness(chart,PercentResponse=30) は、初期値とピーク値の 30% まで SFR が低下する空間周波数を報告します。

R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

例: sharpnessValues = measureSharpness(chart,"PercentResponse",30) は、初期値とピーク値の 30% まで SFR が低下する空間周波数を報告します。

対応する空間周波数を報告する周波数応答値。範囲 [1, 100] の整数または整数ベクトルとして指定します。

PercentResponse の各値は、2 つの列を出力引数 sharpnessaverageSharpness に追加します。最初の列は、変調伝達関数 (MTF) の測定値を表します。MTF は、空間周波数が 0 のときの値を初期値とし、その初期値を基準として指定された割合だけ SFR が低下したときの周波数です。2 番目の列はピーク MTF を表します。これは、SFR の最大値を基準として指定された割合だけ SFR が低下したときの周波数です。

たとえば、PercentResponse の値が 50 の場合、sharpness table には MTF50 列と MTF50P 列が含まれます。これらの列は、初期値とピーク値のそれぞれ 50% まで SFR が低下する周波数を示します。

例: 30

測定値に含める ROI インデックス。1 と ROI 数の間の値を含む正の整数または正の整数のベクトルとして指定します。既定では、関数 measureSharpness はすべての ROI インデックスを測定値に含めます。

メモ

measureSharpness は、ROIIndexROIOrientation によって指定された ROI の交点を使用します。

この引数は、チャート オブジェクト chart を使用する場合にのみ指定できます。

例: 29:32

データ型: single | double | int8 | int16 | int32 | uint8 | uint16 | uint32

ROI の方向。"both""vertical"、または "horizontal" として指定します。関数 measureSharpness は、ROI について指定された方向でのみ測定を実行します。

メモ

measureSharpness は、ROIIndexROIOrientation によって指定された ROI の交点を使用します。

この引数は、チャート オブジェクト chart を使用する場合にのみ指定できます。

データ型: char | string

出力引数

すべて折りたたむ

エッジの SFR 測定値。table として返されます。この table には、各 ROI での測定値が 1 行ずつ格納されます。この table には常に次の変数 (列) が含まれます。

変数説明
ROIサンプリングされた ROI のインデックス。
slopeAngle傾斜したエッジと純粋な垂直方向または水平方向の間の角度。ROI の方向によって異なります。角度は度単位で測定されます。
confidenceFlag

鮮鋭度の測定値が信頼できるかどうかを示す boolean フラグ。測定値が信頼できる場合、confidenceFlagtrue です。以下の条件のために測定値が信頼できない場合、confidenceFlagfalse です。

  • slopeAngle が 3.5 度未満であるか 15 度を超えます。

  • ROI 内のコントラストが 20% 未満です。

傾斜したエッジ ROI のコントラストは、100*(IHigh - ILow)/(IHigh + ILow) として定義されます。ここで、IHighILow は、エッジ全体の高強度領域および低強度領域の推定平均強度です。カラー イメージの場合、この関数は赤のチャネルについてのみコントラストを計算します。

SFR

ROI におけるエッジの空間周波数応答。table を含むスカラー cell 配列として返されます。この table には f 個の行が含まれます。f は周波数サンプルの数です。

テスト チャート オブジェクトおよびカラー イメージの場合、この table には 5 つの列が含まれます。それらの列は、周波数の値、およびその周波数に対応する赤、緑、青、輝度の値を表します。輝度 (Y) は、次に基づいて、赤 (R)、緑 (G)、青 (B) チャネルを線形結合したものです。

Y = 0.213R + 0.715G + 0.072B

グレースケール イメージの場合、この table には 2 つの列が含まれます。それらの列は、周波数の値、およびその周波数に対応する強度の値を表します。

commentconfidenceFlagfalse の場合、comment は測定値が信頼できない理由について説明します。confidenceFlagtrue の場合、comment は空のベクトル [] です。

PercentResponse の各値は、2 つの変数をこの table に追加します。

変数説明
MTFn

初期値を基準として n で指定された割合だけ SFR が低下したときの周波数。

テスト チャート オブジェクトおよびカラー イメージの場合、MTFn は、それぞれ赤、緑、青、および輝度のチャネルにおける MTF 測定値を表す 4 要素ベクトルとして返されます。

グレースケール イメージの場合、MTFn は数値スカラーとして返されます。

MTFnP

ピーク値を基準として n で指定された割合だけ SFR が低下したときの周波数。

テスト チャート オブジェクトおよびカラー イメージの場合、MTFnP は、それぞれ赤、緑、青、および輝度のチャネルにおける MTF 測定値を表す 4 要素ベクトルとして返されます。

グレースケール イメージの場合、MTFnP は数値スカラーとして返されます。

テスト チャート イメージ im を指定した場合、この table にはさらに次の変数が含まれます。

変数説明
ROIPositionsROI の位置。[X Y Width Height] の形式の 4 要素ベクトルとして返されます。XY は ROI の左上隅の座標です。WidthHeight は ROI の幅と高さ (ピクセル単位) です。

table 内の測定値へのアクセスに関する詳細については、鮮鋭度測定値へのアクセスを参照してください。

垂直方向および水平方向のエッジの平均 SFR 測定値。1 行または 2 行の table として返されます。サンプリングされたすべての ROI の方向が同じ場合、averageSharpness は 1 行になります。サンプリングされた ROI の方向が混在している場合は 2 行になります。

averageSharpness の最初の 2 つの列は常に存在し、以下の変数を表します。

変数説明
Orientation平均化された SFR の方向。Orientation の値は、"horizontal" または "vertical" のいずれかです。
SFR

含まれる ROI のすべてのエッジの平均空間周波数応答。方向は Orientation によって指定します。

SFR は s 行 5 列の table です。s は周波数サンプルの数です。5 つの列は、周波数の値、およびその周波数に対応する赤、緑、青、輝度の平均値を表します。

輝度 (Y) は、次に基づいて、赤 (R)、緑 (G)、青 (B) チャネルを線形結合したものです。

Y = 0.213R + 0.715G + 0.072B

PercentResponse の各値は、2 つの変数をこの table に追加します。

変数説明
MTFn

初期値を基準として n で指定された割合だけ SFR が低下したときの周波数。サンプリングされた ROI のうち方向が同じすべてのものについて平均化されます。MTFn は、それぞれ赤、緑、青、および輝度のチャネルにおける MTF 測定値を表す 4 要素ベクトルとして返されます。

MTFnP

ピーク値を基準として n で指定された割合だけ SFR が低下したときの周波数。サンプリングされた ROI のうち方向が同じすべてのものについて平均化されます。MTFnP は、それぞれ赤、緑、青、および輝度のチャネルにおける MTF 測定値を表す 4 要素ベクトルとして返されます。

table 内の測定値へのアクセスに関する詳細については、鮮鋭度測定値へのアクセスを参照してください。

詳細

すべて折りたたむ

鮮鋭度測定値へのアクセス

鮮鋭度テーブル内の変数の順序は、テスト チャート イメージ im とオブジェクト chart のどちらを入力するかによって異なります。鮮鋭度テーブル内の変数にアクセスする必要がある場合、数値インデックスではなく変数名を参照します。

たとえば、鮮鋭度テーブル内の変数 slopeAngle にアクセスするには、次のようなコードを使用します。

slopeAngles = sharpnessValues.slopeAngle;

別の例として、インデックスが 3 の ROI の輝度チャネルの鮮鋭度測定値にアクセスするには、次のようなコードを使用します。最初のコマンドは、鮮鋭度テーブルに含まれる変数 slopeAngle を cell 配列として返します。2 番目のコマンドは、インデックスが 3 の ROI に対応する cell 配列の要素を検出し、その要素を SFR テーブルに抽出します。3 番目のコマンドは、SFR テーブルに含まれる変数 SFR_Y を数値列ベクトルとして返します。

sfr = sharpnessValues.SFR;
sfr3 = sfr{sharpnessValues.ROI==3};
sfr3Y = sfr3.SFR_Y;

なお、これらの 3 つの操作は以下の 1 つのコマンドで実行できます。

sfr3Y = sharpnessValues.SFR{sharpnessValues.ROI==3}.SFR_Y;

詳細については、table 内のデータへのアクセスおよび cell 配列のデータへのアクセスを参照してください。

ヒント

  • 適切に配向されたチャート上の傾斜したエッジは、水平方向または垂直方向から 5 度の角度になります。エッジの方向が 5 度から大幅に外れると、鮮鋭度の測定値は正確ではありません。

  • 鮮鋭度は、撮像領域の中心に向かって高く、周辺に向かって低くなります。水平方向の鮮鋭度は、通常、垂直方向の鮮鋭度よりも高くなります。

アルゴリズム

SFR 測定のアルゴリズムは、Peter Burns の研究に基づいています[2][3]。まず、measureSharpness が、ROI 内の各 "走査線"、またはエッジに垂直なピクセルの行または列のエッジの位置をサブピクセル解像度で決定します。たとえば、ピクセルの各行は、垂直に近いエッジの走査線です。次に、measureSharpness が走査線の位置を合わせて平均化し、オーバーサンプリングされたエッジの強度プロファイルを作成します。この関数は、強度プロファイルの微分を取得し、ウィンドウ処理関数を適用します。返される SFR 測定値は、ウィンドウ処理された微分係数をフーリエ変換した絶対値です。

参照

[2] Burns, Peter. "Slanted-Edge MTF for Digital Camera and Scanner Analysis." Society for Imaging Science and Technology; Proceedings of the Image Processing, Image Quality, Image Capture Systems Conference. Portland, Oregon, March 2000, pp. 135–138.

[3] Burns, Peter. "sfrmat3: SFR evaluation for digital cameras and scanners." URL: http://losburns.com/imaging/software/SFRedge/sfrmat3_post/index.html.

バージョン履歴

R2017b で導入

すべて展開する