3

私はMATLABプログラミングクラスを受講していますが、インストラクターから常に書くように言われました

img = double(imread('file.tif'));

それよりも

img = imread('file.tif');

を省略するとdouble(...)「エラーが発生する」可能性があるためです。これらのエラーが発生する理由について私は混乱しています。

これは、各ピクセルの2乗値を取得するインタラクティブセッションの例です(注-入力画像はグレースケールです)。この値は、doubleを使用した場合にのみ正しくなります。

>> img = imread('cat.tif');
>> img_double = double(imread('cat.tif'));
>> img = img .^2;
>> img_double = img_double .^2;
>> img(1:10, 1:10)

ans =

  255  255  255  255  255  255  255  255  255  255
  225  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  255
  255  255  255  255  255  255  255  255  255  121
  255  255  255  255  255  255  255  255  255   49

>> img_double(1:10, 1:10)

ans =

  Columns 1 through 5

       16129       16129       16129       16129       16129
         225         361         625        1089        1681
         324         484         961        1681        2209
         400         729        1369        2401        3025
         576        1225        2209        3249        3969
         900        1849        3025        4096        4900
        1369        2809        4096        5184        5625
        2209        3969        5476        6241        6241
        3249        5041        6400        7056        6724
        4489        6241        7569        7569        6724

  Columns 6 through 10

       16129       16129       16129       16129       16129
        2025        2209        2209        1849        1521
        2809        2809        2401        2025        1521
        3249        3249        2809        2025        1369
        3969        3481        2809        1849        1089
        4624        3969        2809        1681         841
        5041        3969        2601        1369         529
        5184        3721        2209         961         289
        5184        3481        1681         576         121
        5041        2809        1225         289          49

なぜこうなった?

4

1 に答える 1

6

MATLABで画像をdoubleとして読み取る必要はありません。デフォルトでは、画像はタイプの要素の行列でuint8あり、範囲は0〜255です。計算のニーズに応じて、画像をさまざまなタイプ(、、、、uint16など)uint32にキャストできます。uint64double

あなたの場合、要素の値を2乗するuint8とオーバーフローが発生するため、最大値は255になります。

于 2013-03-26T03:04:53.970 に答える