Oracle Database 11gのDICOM形式データの管理
このチュートリアルでは、Oracle Multimediaを使用して、Oracle Database上で医用画像データをアップロード、保存、操作、およびエクスポートする方法について説明します。
約30分
このチュートリアルでは、以下のトピックについて説明します。
このアイコンの上にカーソルを置くと、すべてのスクリーンショットがロードし、表示されます。 (警告: すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)
注: 各手順に関連したスクリーンショットのみを表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。
Oracle Multimedia DICOMを利用すると、DICOM形式の医用画像やその他の企業情報と統合されたオブジェクトを、Oracle Databaseで保存、管理、および取得することができます。 Oracle Multimedia DICOMにより、Oracle Databaseの信頼性、可用性、およびデータ管理機能が、医療アプリケーションのメディア・オブジェクトにまで適用されます。
Oracle Multimedia DICOMは、医用画像の標準形式であるDigital Imaging and Communications in Medicine(DICOM)をサポートします。
このチュートリアルでは、Oracle Multimediaを使用して、データベース上で医用画像データをアップロード、保存、操作、およびエクスポートする簡単なPL/SQLの例を示します。
Oracle Multimediaでは、ORDDicomタイプの列を使用して、DICOM形式のデータをデータベースに保存します。 次の図に、データベース表におけるORDDicomオブジェクトの例を示します。

トピック・リストに戻る
このチュートリアルを始める前に、次の手順を完了してください。
| 1. |
Oracle Database 11g Release 1とOracle Multimediaのインストール。 |
| 2. |
Oracle Database 11g Release 1 Examplesのインストール。 |
| 3. |
dicom.zipファイルの作業ディレクトリへのダウンロードおよび解凍。 |
トピック・リストに戻る
不要なデータベース接続を避けるため、ディレクトリ・オブジェクトを作成してインポートとエクスポートに必要な権限を付与します。 以下の手順を実行します。
| 1. |
PMユーザーのロックが解除されており、create any directory権限を持つことを確認します。 SQL*Plusセッションを開いて、次のコマンドを実行します。
sqlplus sys/<syspassword>@<sid> as sysdba
alter user PM identified by PM account unlock;
grant create any directory to PM;
|
| 2. |
次に、PMユーザーとしてディレクトリ・オブジェクトを作成します。 SQL*Plusセッションから、次のコマンドを実行します。
connect PM/PM@<Sid>
create or replace directory IMAGEDIR as '<file_directory>';
<file_directory>は、このチュートリアルに必要なすべてのスクリプトとファイルがある場所です。 たとえば、/home/oracle/dicomのようになります。 注: このディレクトリが存在しない場合は、作成する必要があります。
|
トピック・リストに戻る
ここでは、整数識別子(id)、ORDSYS.ORDDicomオブジェクト(dicom)、ORDSYS.ORDImageオブジェクト(imageThumb)、およびもう1つのORDSYS.ORDDicomオブジェクト(anonDicom)という4つの列を含むシンプルな表を使用します。 Oracleが提供するすべてのマルチメディア・オブジェクトとプロシージャは、ORDSYSスキーマ内に定義されています。 以下の手順を実行します。
| 1. |
SQL*Plusセッションから、次のコマンドを実行します。
@create_dicom_table
create_dicom_table.sqlコードの内容は、次のとおりです。
set echo on;
drop table medical_image_table;
create table medical_image_table (id integer primary key, dicom ordsys.orddicom, imageThumb ordsys.ordimage, anonDicom ordsys.orddicom);
|
トピック・リストに戻る
ここでは、医用画像をデータベース・ファイル・システムから新たに作成した表(medical_image_table)にロードする方法について説明します。 ほとんどの場合、次の例で示すORDDicomインポートではなく、SQL*Loaderを使用してデータをロードします。
PL/SQLプロシージャimage_import()を作成します。このプロシージャは、medical_image_tableに新規行を挿入し、新たに作成したORDDICOMオブジェクトに、指定したファイル名のDICOMデータをインポートします。次に、デフォルト・マッピング・ドキュメントに基づいたメタデータ属性とORDDICOMオブジェクトのUID属性に、DICOM属性を抽出します。 デフォルト・マッピング・ドキュメントordcmmp.xmlは、インストール時にロードされます。 カスタマイズ・マッピング・ドキュメントを作成して、属性を別のXMLドキュメントに抽出することができますが、このチュートリアルの範囲外であるため、ここでは扱いません。
以下の手順を実行します。
| 1. |
SQL*Plusセッションから、次のコマンドを実行します。
@create_import_procedure
create_import_procedure.sqlコードの内容は、次のとおりです。
-- Set Data Model Repository execute ordsys.ord_dicom.setDataModel();
create or replace procedure image_import(dest_id number, filename varchar2) is dcm ordsys.orddicom; begin delete from medical_image_table where id = dest_id; insert into medical_image_table (id, dicom, imageThumb, anonDicom) values (dest_id, ordsys.orddicom(‘file’, ‘IMAGEDIR’, filename, 0), ordsys.ordimage.init(), ordsys.orddicom()) returning dicom into dcm; dcm.import(1);
update medical_image_table set dicom=dcm where id=dest_id;
commit; end; /
show errors;
|
| 2. |
新たに作成したプロシージャを実行し、サンプルのDICOMファイルをインポートします。 SQL*Plusセッションから、次のコマンドを実行します。
execute image_import(1,'179.dcm');
|
トピック・リストに戻る
前項でインポート・メソッドを呼び出した際、パラメータとして1を渡しました。これは、インポート時にsetPropertiesメソッドを呼び出すことを意味します。setPropertiesは、DICOMデータを解析し、DICOMメタデータをORDDicomオブジェクト属性に抽出するようOracle Multimediaに指示するメソッドです。次の例で検索対象とする属性(SOP_INSTANCE_UID、SOP_CLASS_UID、その他)など、頻繁にアクセスされる属性は特定のORDDicomオブジェクト属性に格納されています。また、DICOMバイナリ・データに含まれるすべてのDICOMメタデータは、デフォルトのメタデータ・マッピング・ドキュメントに従うXMLドキュメントに抽出されます。結果のXMLメタデータ・ドキュメントは、ORDDicomメタデータ属性に格納され、索引付けや問合せで使用できます。
トピック・リストに戻る
SOP_INSTANCE_UIDの取得
| 1. |
この問合せでは、ORDDicomオブジェクト属性からService-Object Pair Instance UIDを取得します。 このデータは、setPropertiesメソッドの呼び出し時にDICOMバイナリ・データから抽出されています。SQL*Plusセッションから次のスクリプトを実行します。
@sop_instance_uid
sop_instance_uid.sqlコードの内容は、次のとおりです。
select id, t.dicom.getSOPInstanceUID() as SOP_Instance_UID from medical_image_table t;
|
トピックに戻る
SOP_CLASS_UIDの取得
| 1. |
この問合せでは、ORDDicomオブジェクト属性からService-Object Pair Class UIDを取得します。 このデータは、setPropertiesメソッドの呼び出し時にDICOMバイナリ・データから抽出されています。 SQL*Plusセッションから次のスクリプトを実行します。
@sop_class_uid
sop_class_uid.sqlコードの内容は、次のとおりです。
select id, t.dicom.getSOPClassUID() as SOP_Class_UID from medical_image_table t;
|
トピックに戻る
STUDY_INSTANCE_UIDの取得
| 1. |
この問合せでは、ORDDicomオブジェクト属性からStudy Instance UIDを取得します。このデータは、setPropertiesメソッドの呼び出し時にDICOMバイナリ・データから抽出されています。 SQL*Plusセッションから次のスクリプトを実行します。
@study_instance_uid
study_instance_uid.sqlコードの内容は、次のとおりです。
select id, t.dicom.getStudyInstanceUID() as Study_Instance_UID from medical_image_table t;
|
トピックに戻る
SERIES_INSTANCE_UIDの取得
| 1. |
この問合せでは、ORDDicomオブジェクト属性からSeries Instance UIDを取得します。 このデータは、setPropertiesメソッドの呼び出し時にDICOMバイナリ・データから抽出されています。 SQL*Plusセッションから次のスクリプトを実行します。
@series_instance_uid
series_instance_uid.sqlコードの内容は、次のとおりです。
select id, t.dicom.getSeriesInstanceUID() as Series_Instance_UID from medical_image_table t;
|
トピックに戻る
コンテンツ長(DICOMコンテンツのバイト数)の取得
| 1. |
この問合せでは、ソース属性に格納されているDICOMバイナリ・データの長さを取得します。 SQL*Plusセッションから次のスクリプトを実行します。
@content_length
content_length.sqlコードの内容は、次のとおりです。
select id, t.dicom.getcontentlength() as content_Length from medical_image_table t;
|
トピックに戻る
インポート中にsetPropertiesメソッドが呼び出される際、DICOMイメージに埋め込まれていた多数のDICOM標準属性がXMLドキュメントに抽出されます。これらの属性には、Patient Name、Patient ID、およびModalityが含まれます。以下の手順を実行します。
| 1. |
この問合せでは、抽出されたXMLメタデータ・ドキュメントから情報を抽出する方法を示します。 SQL*Plusセッションから次のスクリプトを実行します。
@patient_info
patient_info.sqlコードの内容は、次のとおりです。
select id, extractValue(t.dicom.metadata, '/DICOM_OBJECT/*[@name="Patient''s Name"]/VALUE', 'xmlns=http://xmlns.oracle.com/ord/dicom/metadata_1_0') as "PATIENT_NAME", extractValue(t.dicom.metadata, '/DICOM_OBJECT/*[@name="Patient ID"]', 'xmlns=http://xmlns.oracle.com/ord/dicom/metadata_1_0') as "PATIENT_ID", extractValue(t.dicom.metadata, '/DICOM_OBJECT/*[@name="Modality"]', 'xmlns=http://xmlns.oracle.com/ord/dicom/metadata_1_0') as "MODALITY" from medical_image_table t;
|
トピック・リストに戻る
ここでは、データベースから起動できるいくつかのイメージ処理操作について説明します。 JPEGサムネイル・イメージをDICOMイメージから作成するには、新しいORDImageオブジェクトをORDDicomオブジェクトから生成して処理します。 実行するには、新規ORDImageオブジェクトのプロパティを指定する必要があります。 たとえば、次の指定では75×100ピクセルのJPEGサムネイル・イメージが生成されます。 ‘fileformat=jfif fixedscale=75 100’.
次の例で定義するgenerate_thumb()は、medical_image_table表のimageThumb列に識別子source_idを移入し、ソース行のORDDicomにprocessCopyを実行してORDImageを生成します。
以下の手順を実行します。
| 1. |
generate_thumbプロシージャを作成するには、SQL*Plusセッションから次のスクリプトを実行します。
@create_thumbnail_procedure
create_thumbnail_procedure.sqlコードの内容は、次のとおりです。
-- Set Data Model Repository execute ordsys.ord_dicom.setDataModel();
create or replace procedure generate_thumb(source_id number, verb varchar2) is dcmSrc ordsys.orddicom; imgDst ordsys.ordimage; begin select dicom, imageThumb into dcmSrc, imgDst from medical_image_table where id = source_id for update; dcmSrc.processCopy(verb, imgDst);
update medical_image_table set imageThumb = imgDst where id = source_id;
commit; end; /
show errors;
|
| 2. |
SQL*Plusセッションから次のスクリプトを実行します。
@create_thumbnail_image
create_thumbnail_image.sqlコードの内容は、次のとおりです。
-- Create a JPEG thumbnail image for our test DICOM execute generate_thumb(1, 'fileformat=jfif fixedscale=75 100');
|
トピック・リストに戻る
ここでは、DICOMオブジェクトを匿名にすることによって患者のプライバシを保護する方法を示します。 DICOMオブジェクトを匿名にするには、新しいDICOMオブジェクトを作成して、新しいDICOMバイナリ・データおよび関連するORDDicomオブジェクト・メタデータに含まれるユーザー特定可能なDICOM属性を削除または上書きします。 XML匿名定義ドキュメントに、削除または置換すべきDICOMオブジェクトと、各属性を匿名にするために必要なアクションが指定されています。 デフォルトの匿名定義ドキュメントordcman.xmlは、インストール時にロードされます。 匿名定義ドキュメントのカスタマイズは、このチュートリアルの範囲外であるため、ここでは扱いません。 ここでは、デフォルトの匿名定義ドキュメントを使用します。
次の例で定義するgenerate_anon()は、medical_image_table表のanonDicom列に識別子source_idを移入し、ソース行のDICOMにmakeAnonymous()を起動してORDDicomを生成します。
以下の手順を実行します。
| 1. |
generate_anonプロシージャを作成するには、SQL*Plusセッションから次のスクリプトを実行します。
@create_anonimage_proc
create_anonimage_proc.sqlコードの内容は、次のとおりです。
-- Set Data Model Repository execute ordsys.ord_dicom.setDataModel();
create or replace procedure generate_anon(source_id number) is dcmSrc ordsys.orddicom; anonDst ordsys.orddicom; dest_sop_inst_uid varchar2(128) := '1.2.3';
begin select dicom, anonDicom into dcmSrc, anonDst from medical_image_table where id = source_id for update; dcmSrc.makeAnonymous(dest_sop_inst_uid, anonDst); update medical_image_table set anonDicom = anonDst where id = source_id; commit; end; / show errors;
generate_anonプロシージャにおいて、dest_sop_instance_uid変数の一時UIDをグローバルに一意のUIDで置き換えてください。 UIDを置き換えない場合もプロシージャは実行されますが、結果の匿名DICOMイメージは破棄しなければならないことに注意してください。
|
| 2. |
テストの対象となるDICOMの匿名コピーを生成します。 SQL*Plusセッションから次のコマンドを実行します。
execute generate_anon(1);
|
| 3. |
次に、結果を確認します。 SQL*Plusセッションから次のスクリプトを実行します。
@select_anonimage
|
トピック・リストに戻る
このトピックのサンプル・コードでは、ユーザーが定義した一連の適合性ルールに対して、DICOMデータの適合性を確認する方法を示します。 適合性ルールは、1つ以上の制約定義ドキュメントに記述されます。これらのXMLドキュメントでは、DICOMメタデータ・スキーマで表現できない属性関係やセマンティック制約が指定されます。 デフォルトの制約定義ドキュメントordcmct.xmlは、インストール時にロードされます。 制約定義ドキュメントのカスタマイズはこのチュートリアルの範囲外であるため、ここでは扱いません。 ここでは、デフォルトの制約定義ドキュメントを使用します。
次の例では、ソース行のDICOMに対してConformanceValid()を起動することにより、識別子source_idを持つmedical_image_table表のDICOM列の適合性を確認します。
以下の手順に従います。
| 1. |
DICOMイメージが制約ルールに適合するかどうかを確認します。 SQL*Plusセッションから次のスクリプトを実行します。
@check_object_conform
check_object_conform.sqlコードの内容は、次のとおりです。
-- Set Data Model Repository execute ordsys.ord_dicom.setDataModel();
select id, t.dicom.isconformanceValid('OracleOrdObject') as conformant from medical_image_table t;
|
| 2. |
DICOMイメージが制約定義に適合しない場合、表にメッセージが挿入されます。この表は、ORDDCM_CONFORMANCE_VLD_MSGSビューに問合せを行うと参照できます。 このビューは、制約の検証中に生成された制約メッセージを表示します。 SQL*Plusセッションから次のスクリプトを実行します。
@review_conform_msgs
review_conform_msgs.sqlコードの内容は、次のとおりです。
describe orddcm_conformance_vld_msgs; select * from orddcm_conformance_vld_msgs;
|
トピック・リストに戻る
ここでは、DICOMデータをデータベースからデータベース・サーバー上のファイル・システムにエクスポートする方法を示します。 Oracle Multimediaのエクスポート・メソッドを使用して、データベースからDICOMデータをエクスポートするには、データベースからデータベース・サーバーのファイル・システムへ書込みが行える必要があります。 ファイル・システムへの書込みを行うには、出力DICOMファイルの書込み先となるディレクトリ・オブジェクトの書込み権限をユーザー(PMユーザー)に付与する必要があります。 以下の手順を実行します。
| 1. |
IMAGEDIRディレクトリのファイルにDICOMデータをエクスポートするプロシージャを作成します。 SQL*Plusセッションから次のスクリプトを実行します。
@create_export_proc
create_export_proc.sqlコードの内容は、次のとおりです。
create or replace procedure dicom_export (source_id number, filename varchar2) as dcmSrc ordsys.orddicom; begin select dicom into dcmSrc from medical_image_table where id = source_id; dcmSrc.export('FILE', 'IMAGEDIR', filename); end; / show errors;
|
| 2. |
次に、このプロシージャを実行します。 SQL*Plusセッションから次のコマンドを実行します。
execute dicom_export(1, 'dicom_orig.dcm');
|
| 3. |
作成されたファイルを確認するには、別の端末ウィンドウを開いて、IMAGEDIRディレクトリから次のコマンドを実行します。
ls -al dicom_orig.dcm
|
トピック・リストに戻る
環境をクリーンアップするには、以下の手順に従います。
| 1. |
SQL*PlusセッションからPMユーザーとして次のスクリプトを実行します。
@cleanup01
cleanup01.sqlコードの内容は、次のとおりです。
drop procedure image_import; drop procedure generate_thumb; drop procedure generate_anon; drop procedure dicom_export; drop table medical_image_table;
|
| 2. |
SYSユーザーとしてSQL*Plusにログインします。
sqlplus sys/<syspassword>@<Sid> as sysdba
|
| 3. |
SQL*Plusセッションから、SYSユーザーとして次のスクリプトを実行します。
@cleanup02
cleanup02.sqlコードの内容は、次のとおりです。
drop directory imagedir;
revoke create any directory from PM;
|
| 4. |
次のコマンドを実行して、SQL*Plusセッションを終了します。
exit
|
| 5. |
SQL*Plusセッションで作業ディレクトリに移動し、imagedirに作成されたエクスポート・ファイルdicom_orig.dcmを削除します。
rm dicom_orig.dcm
プロンプトが表示されたら、削除を確定してください。
|
トピック・リストに戻る
このチュートリアルで学習した内容は、次のとおりです。
 |
インポートおよびエクスポート用のディレクトリ・オブジェクトの作成 |
 |
ORDDicom列を含む表の作成 |
 |
医用画像のインポート |
 |
DICOM属性の選択と表示 |
 |
サムネイルの作成と形式の変更 |
 |
DICOMオブジェクトの匿名コピーの作成 |
 |
DICOMオブジェクトの適合性の確認 |
 |
イメージのエクスポート |
トピック・リストに戻る
このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。
|