6.17 大規模イメージのモザイク処理

大規模な地理空間領域は、通常、多くの小さい航空写真または衛星イメージで構成されます。大規模イメージのモザイク処理では、それらの小さい地理空間イメージを貼り合せて1つの大きいイメージにし、空間領域全体のわかりやすいビューを取得します。

GeoRasterには、切れ目、重複、欠落したソースGeoRasterオブジェクトに対応できる大規模モザイク処理ファンクションがあります。これによって、幾何補正されたイメージと幾何補正されないイメージの両方がサポートされます。これは、内部的再投影と幾何補正、共通ポイント・ルール、および簡易カラー・バランスに対応します。特定のピラミッド・レベルでモザイク処理することも可能です。このモザイク処理プロセスでは、仮想モザイクに対して物理モザイクとも呼ばれる1つのGeoRasterオブジェクトが生成されます(仮想モザイクの詳細は、「仮想モザイク」を参照してください)。

SDO_GEOR.mosaicプロシージャおよびSDO_GEOR_AGGR.mosaicSubsetプロシージャはイメージのモザイク処理をサポートしますが、SDO_GEOR_AGGR.mosaicSubsetの方がより多くの高度な機能とオプションを備えており、パラレル処理も実装されているため、このプロシージャの使用を強くお薦めします。SDO_GEOR_AGGR.mosaicSubsetは、ソース・イメージとして仮想モザイク(GeoRaster表のリスト、GeoRaster列のあるデータベース・ビュー、REF CURSORなど)を使用できます。

SDO_GEOR.mosaicプロシージャは、幾何補正され、同じSRIDに基づいて地理空間的に配置され、同じ解像度を持つソースGeoRasterイメージのセットをモザイク処理します。モザイクの結果は、別のGeoRasterオブジェクトです。ソース・イメージ間に重複がある場合、モザイクの結果は、重複する領域にある最後のソース・イメージの内容を含みます。このプロシージャは、事前処理されて完全に配置されたソース・イメージに対して適切に動作します。

この項の例では、ソース・イメージは、次の列を使用して定義されたソースGeoRaster表のGRTAB、GRTAB1およびGRTAB2に格納されます。

  (id          NUMBER PRIMARY KEY,
  cloud_cover  NUMBER     -- percentage of cloud coverage 
  last_update  TIMESTAMP  -- GeoRaster object's last update time
  grobj        SDO_GEORASTER )

これらの表で、GeoRasterオブジェクトのspatialExtent属性に対してOracle Spatialの空間索引が作成されています。

次の例で、モザイク処理されたイメージは、「記憶域パラメータ」で定義されているGEORASTER_TABLEに格納されます。

例6-18 SDO_GEOR.mosaic (表および列名)

例6-18に、SDO_GEOR.mosaicプロシージャを示します。

DECLARE
  gr sdo_georaster;
BEGIN
  INSERT INTO georaster_table (georid, georaster) 
      VALUES (12, sdo_geor.init('rdt_1'))
      RETURNING georaster INTO gr;
  sdo_geor.mosaic('grtab', 'grobj', gr, 'blocking=optimalpadding blocksize=(512,512,1)');
  UPDATE georaster_table SET georaster=gr WHERE id=12;
END;
/

ただし、実際のソース・イメージは、通常、異なる解像度や大規模な重複領域を持つ異なる環境下で、または異なる地理参照システムを使用して収集されます。この場合、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用して、これらのソース・イメージを1つの均一なモザイク・イメージにモザイク処理できます。SDO_GEOR.mosaicと比較して、SDO_GEOR_AGGR.mosaicSubsetプロシージャではより多くの機能とオプションが提供されます。

  • ソース・イメージは、同じ座標系(SRID)にある必要はなく、同じ地理参照情報または解像度を持ちます。

  • ソース・イメージは、ユーザーが指定したピラミッド・レベルでモザイク処理されます。

  • ソース・イメージは、ユーザーが指定したバンドでモザイク処理されます。

  • 出力イメージは、入力イメージとは異なる座標系および解像度を持つことができます(outSRIDおよびoutResolutionsパラメータ)。

  • mosaicParamパラメータを通じて重複する領域の出力を詳細に制御できます(commonPointRuleでは重複する領域での出力のために使用するセル値を指定でき、NODATAでは重複する領域でのNODATA値を考慮するかどうかを指定できます)。

  • 出力モザイク・イメージを指定した点に配置できます(参照点)。ソース・イメージは、mosaicParamに指定されたresampleTolerance値より多くずれている場合、参照点に揃えるためにリサンプリングできます。

  • fillGapmosaicParamtrueである場合、ソース・イメージ間に2ピクセル未満の小さい切れ目があっても、周囲のピクセル値を使用して埋めることができます。

  • 制限付きのカラー・バランス(線形ストレッチおよび正規化)がサポートされます。

  • モザイク処理プロセスを高速化するためにパラレル処理がサポートされます。

例6-19 SDO_GEOR_AGGR.mosaicSubset

例6-19では、SDO_GEOR_AGGR.mosaicSubsetを使用して、2つのGeoRaster表(GRTAB1およびGRTAB2)のすべてのソース・イメージを、XおよびY次元で30mの解像度を持つSRID 4326の大規模なモザイク・イメージにモザイク処理します。

DECLARE
  resolutions sdo_number_array;
  gr sdo_georaster;
BEGIN
    insert into georaster_table (georid, georaster)
        values (10, sdo_geor.init('RDT_1',10))
         returning georaster into gr;
 
    resolutions := sdo_number_array(30, 30);
    sdo_geor_aggr.mosaicSubset('grtab1, grtab2', 'grobj, grobj',
                               0, 4326, null, null, null,
                               null, null, null, resolutions, 'unit=meter',
                               'commonPointRule = end, nodata=true, resampleTolerance=0.2, resampling=bilinear, fillGap=true',
                               'blocking=optimalpadding blocksize=(512, 512, 3)', gr, null, 'parallel=4');
 
      update georaster_table set georaster = gr where georid=10;
      commit;                                                              
END;
/

次に、例6-19について説明します:

  • 幾何補正されていないソース・イメージは幾何補正され、SRID 4326ではないソース・イメージはSRID 4326に再投影されます。

  • 30m以外の解像度を持つソース・イメージは、30mの解像度にスケール変更されます。

  • mosaicParamパラメータのnodataキーワードはtrueに指定されているため、重複する領域のNODATA値は考慮されません。

  • mosaicParamパラメータのresampleToleranceキーワードは0.2に指定されているため、ソース・イメージがターゲットから0.2ピクセルより多くオフセットされる場合、ソース・イメージはリサンプリングされます。

  • リサンプリング・メソッドは、mosaicParamパラメータでbilinearに指定されています。

  • 並列度は、parallelParamパラメータで4に指定されています。

SDO_GEOR_AGGR.getMosaicSubsetをコールする前にSDO_GEOR_AGGR.validateForMosaicSubsetをコールして、ソース・イメージがモザイク処理可能であることを確認できます。

6.17.1 モザイク処理中のカラー・バランス

モザイク処理操作のソース・イメージは、イメージを取得したときの照明条件、時間または他の要素の違いのために、異なる輝度または色を持つ可能性があります。カラー・バランスは、周囲のイメージとの色の違いを最小限に抑えて、結果のモザイクをシームレスに表示します。

SDO_GEOR_AGGR.mosaicSubsetおよびSDO_GEOR_AGGR.getMosaicSubsetは、モザイク処理中の基本的なカラー・バランス・メソッドを提供します。いくつかのカラー・バランス・メソッドが提供されます。mosaicParamパラメータのキーワードcolorbalanceで識別されます。

  • LINEARSTRETCHING: 参照の最小および最大範囲にソース・イメージの各バンドの最小-最大ストレッチを実行します。

  • STATISTICSMATCHING: ソース・イメージの各バンドの平均および標準偏差をストレッチして参照の平均値および標準偏差値と一致するように、イメージのストレッチを実行します。

  • HISTOGRAMMATCHING: 結果のイメージのヒストグラムが参照のヒストグラムと一致するように、イメージのストレッチを実行します。

カラー・バランス・メソッドの参照値を指定するいくつかの方法があります。キーワードcbreference(mosaicParamパラメータ内)で識別されます。

  • VALUE: 参照値は、referenceValue1referenceValue2またはrefHistogramsパラメータで直接提供されます。

  • IMAGE: 参照値は、referenceImageパラメータで指定されるイメージから導出されます。参照イメージは、ソース・イメージと同じ数のバンドを持つ必要があります。

  • OVERLAP: 参照値は、周囲のイメージの重複した領域で周囲のイメージによって決定されます。このオプションでは、参照値を重複した領域から導出できるように、ソース・イメージに十分に大きい重複が含まれる必要があります。線形ストレッチ方法はこのオプションに適切な結果を提供しないため、重複した領域の参照は線形ストレッチ・メソッドでサポートされていないことに注意してください。

例6-20 LINEARSTRETCHINGカラー・バランス

この例では、SDO_GEOR_AGGR.mosaicSubsetプロシージャでソース・イメージのLINEARSTRETCHINGカラー・バランス・メソッドを使用する方法を示します。参照の最小値および最大値は、referenceValue1およびreferenceValue2パラメータで指定されます。例では、各バンドに異なる参照値が含まれています。

DECLARE
gr sdo_georaster;
resolutions  sdo_number_array;
ref_min    sdo_number_arrray;
ref_max   sdo_number_array;
BEGIN
    -- create the new GeoRaster object for mosaic
    insert into georaster_table (georid, georaster)
        values (10, sdo_geor.init('RDT_1',10))
         returning georaster into gr;
    
    -- set the output resolution
     resolutions := sdo_number_array(30, 30);


    -- Set the reference values, there are 3 values, one for each band
    ref_min := sdo_number_array(10, 10, 10);
    ref_max := sdo_number_array(200, 255, 230);

    -- Mosaic
    sdo_geor_aggr.MosaicSubset('georaster_table_1', 
                   'georaster', null, 32610, null, null, null, null,
                    null, null, null, resolutions, null, 
                   'colorBalance=linearstretching, cbreference=value', 
                   'blocking=optimalpadding, blocksize=(512,512,3)', 
                    gr, null, 'parallel=4', referenceValue1=>ref_min,
                    referenceValue2=>ref_max);
 
     update georaster_table set georaster = gr where georid=10;
     commit;                                                              
END;
/

例6-21 HISTOGRAMMATCHINGカラー・バランス

この例では、SDO_GEOR_AGGR.mosaicSubsetプロシージャでソース・イメージのHISTOGRAMMATCHINGカラー・バランス・メソッドを使用する方法を示します。参照のヒストグラムは、参照イメージから導出されます。参照イメージは、ソース・イメージと同じ数のバンドを持つ必要があります。

DECLARE
gr sdo_georaster;
resolutions  sdo_number_array;
ref_gr    sdo_georaster;
BEGIN
    -- create the new GeoRaster object for mosaic
    insert into georaster_table (georid, georaster)
        values (10, sdo_geor.init('RDT_1',10))
         returning georaster into gr;
    
    -- set the output resolution
    resolutions := sdo_number_array(30, 30);

-- retrieve the reference image 
Select georaster into ref_gr from georaster_table where georid = 1;

    -- Mosaic
    sdo_geor_aggr.MosaicSubset('georaster_table_1', 
                   'georaster', null, 32610, null, null, null, null,
                    null, null, null, resolutions, null, 
                   'colorBalance=histogramMatching, cbreference=image', 
                   'blocking=optimalpadding, blocksize=(512,512,3)', 
                    gr, null, 'parallel=4', refereneImage=>ref_gr);
 
     update georaster_table set georaster = gr where georid=10;
     commit;                                                              
END;
/

例6-22 STATISTICSMATCHINGカラー・バランス

この例では、SDO_GEOR_AGGR.mosaicSubsetプロシージャでソース・イメージのSTATISTICSMATCHINGカラー・バランス・メソッドを使用する方法を示します。参照の統計値は、周囲のイメージの重複した領域から計算されます。これには、重複した領域が周囲のイメージとの色の違いを反映できるように、ソース・イメージに大きな重複が含まれる必要があります。

DECLARE
gr sdo_georaster;
resolutions  sdo_number_array;
BEGIN
    -- create the new GeoRaster object for mosaic
    insert into georaster_table (georid, georaster)
        values (10, sdo_geor.init('RDT_1',10))
         returning georaster into gr;
    
    -- set the output resolution
    resolutions := sdo_number_array(30, 30);

    -- Mosaic
    sdo_geor_aggr.MosaicSubset('georaster_table_1', 
                   'georaster', null, 32610, null, null, null, null,
                    null, null, null, resolutions, null, 
                   'colorBalance=statisticsMatching, cbreference=overlap', 
                   'blocking=optimalpadding, blocksize=(512,512,3)', 
                    gr, null, 'parallel=4');
 
     update georaster_table set georaster = gr where georid=10;
     commit;                                                              
END;
/

6.17.2 パラレル圧縮、コピーおよびサブセット化

幾何補正、オルソ補正および再投影をパラレル化するには、SDO_GEOR.rectifyを使用します。ワーピングをパラレル化するには、SDO_GEOR.warpをコールします。すべてのラスター代数操作もパラレル化されます。

SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用すると、様々なタイプのパラレル操作、たとえばパラレル圧縮と解凍、パラレル・コピーまたは形式変更コピー、パラレル・サブセット化、パラレル再投影、パラレル幾何補正を実行できます。コピー操作およびサブセット化操作は直接パラレル化されません。JPEGおよびDEFLATEでは、再フォーマットが必要ない場合にSDO_GEOR.changeFormatCopyプロシージャをコールしてパラレル圧縮と解凍を実行できます。このトピックでは、パラレル化された圧縮、コピーおよびサブセット化操作の例を示します。これらのどのケースでも、SDO_GEOR_AGGR.mosaicSubsetプロシージャは単一のGeoRasterオブジェクトに作用します。

パラレル化操作をわかりやすく説明するために、この項の例ではほとんどのパラメータにnull値を使用しています。実際のアプリケーションでは、SDO_GEOR_AGGR.mosaicSubsetプロシージャのその他のパラメータすべてを適用できますが、mosaicParamパラメータは、入力が単一GeoRasterオブジェクトのときは効果を持ちません。

例6-23 パラレル圧縮

例6-23に、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用するパラレル圧縮を示します。これは、DEFLATEとJPEGの両方の圧縮および解凍に適用されます。

DECLARE
  gr sdo_georaster;
  cur sys_refcursor;
  crop_area sdo_geometry := null;
BEGIN
  -- create a new georaster object with georid = 2 
  -- to hold the compressed image
  delete from georaster_table where georid = 2;
  insert into georaster_table(georid, georaster) values (2, 
     sdo_geor.init('RDT2', 2)) returning georaster into gr;
 
  
  -- reblock and compress the image with georid = 1 into JPEG using parallel degree of 8 
  open cur for 'select georaster from georaster_table where georid = 1';
  sdo_geor_aggr.mosaicSubset(cur, 0, null, null, null, crop_area, 
                             null, null, null, null, null, null,
                             'compression=JPEG-F, blocking=optimalpadding, blocksize=(512,512,3)',
                             gr, null, 'parallel=8');
 
  update georaster_table set georaster = gr where georid = 2;
  commit;
END;
/

前述の例では、storageParamパラメータを調整すると、圧縮と解凍を含むパラレル化したSDO_GEOR.changeFormatCopy操作として機能するようになります。

例6-24 パラレル・サブセット化およびコピー

例6-24に、SDO_GEOR_AGGR.mosaicSubsetプロシージャを使用するパラレル・サブセット化およびコピーを示します。

DECLARE
  gr sdo_georaster;
  cur sys_refcursor;
  crop_area sdo_geometry := null;
BEGIN
  -- create a new georaster object with georid = 2 to hold the copy
  delete from georaster_table where georid = 2;
  insert into georaster_table(georid, georaster) values (2, 
     sdo_geor.init('RDT2', 2)) returning georaster into gr;
 

  -- set the crop_area for subsetting. 
  crop_area := sdo_geometry(2003, 26986, null, sdo_elem_info_array(1,1003,1),
                sdo_ordinate_array(237040,   897924, 
                                   237013.3, 897831.6,
                                   237129,   897840,
                                   237182.5, 897785.5, 
                                   237239.9, 897902.7,
                                   237223,   897954,
                                   237133,   897899,
                                   237040,   897924));

  -- subset from the image with georid = 1 using parallel degree of 8 
  -- and do polygon clipping
  -- If the crop_area is set to null, the same call will do a simple parallelized copying without subsetting. 
  open cur for 'select georaster from georaster_table where georid = 1';
  sdo_geor_aggr.mosaicSubset(cur, 0, null, null, null, crop_area,
                             'true', null, null, null, null, null,
                             'pyramid=true', gr, null, 'parallel=8');
  update georaster_table set georaster = gr where georid = 2;
  commit;
END;
/

例6-24では、storageParamパラメータを調整すると、圧縮と解凍を含むパラレル化したコピーまたはSDO_GEOR.changeFormatCopy操作として機能するようになります。