在 Oracle 数据库 11g 中管理 DICOM 格式数据

目的

本教程描述如何使用 Oracle Multimedia 上载、存储、操作和导出 Oracle 数据库中的医学图像数据。

所需时间

大约 30 分钟

主题

本教程包括下列主题:

 概述
 前提条件
 创建导入和导出的目录对象
 创建包含 ORDDicom 列的表
 导入医学图像
 检索对象属性
 检索 DICOM 元数据
 创建缩略图并更改格式
 匿名复制 DICOM 对象
 检查 DICOM 对象的一致性
 导出图像
 清理
 总结

查看屏幕截图

 将鼠标置于此图标上 可以加载和查看本教程的所有屏幕截图。 (警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图来将其隐藏。

概述

Oracle Multimedia DICOM 允许 Oracle 数据库存储、管理和检索 DICOM 格式医学图像以及与其他企业信息集成的其他对象。Oracle Multimedia DICOM 扩展了 Oracle 数据库的可靠性、可用性以及对医学应用程序中的媒体对象的数据管理。

Oracle Multimedia DICOM 支持医学数字成像和通信 (DICOM),即医学图像标准。

本教程提供了简单的 PL/SQL 示例,用于描述如何使用 Oracle Multimedia 上载、存储、操作和导出数据库中的医学图像数据。

Oracle Multimedia 在数据库表的 ORDDicom 类型的列中存储 DICOM 格式数据。下图举例说明了数据库表中的 ORDDicom 对象。

返回主题列表

前提条件

开始本教程之前,您应该:

1.

安装带有 Oracle Multimedia 的 Oracle 数据库版本 11.1。

2.

安装 Oracle 数据库 11g 产品(使用配套 CD)。

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>';
                            

这里, &ltfile_directory> 是本教程所需的所有脚本/文件所在的位置,例如 /home/oracle/dicom。注:如果该目录不存在,则需要创建一个。

返回主题列表

创建包含 ORDDicom 列的表

本教程使用一个包含四个列的简单表:一个整数标识符 (id)、一个 ORDSYS.ORDDicom 对象 (dicom)、一个 ORDSYS.ORDImage 对象 (imageThumb) 和另一个 ORDSYS.ORDDicom 对象 (anonDicom)。注意,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 表中。注意,在大多数情况下,您希望使用 SQL*Loader 而不是本例所示的 ORDDicom 导入方法加载数据。

创建一个 PL/SQL 过程 image_import(),该过程将把一个新行插入 medical_image_table,将文件名中的 DICOM 数据导入新创建的 ORDDICOM 对象,然后将 DICOM 属性提取到元数据属性(基于默认映射文档)和 ORDDICOM 对象的 UID 属性。注意,默认映射文档 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')
                                
                                
;
                              
                            

返回主题列表

检索对象属性

如果您调用了前一主题中的导入方法,则已传递指定您应该在导入时调用 setProperties 方法的参数 1。 setProperties 方法告诉 Oracle Multimedia 解析 DICOM 数据并将 DICOM 元数据提取到 ORDDicom 对象属性。某些频繁访问的属性(例如,您在这里查询的属性 SOP_INSTANCE_UID、 SOP_CLASS_UID 等)将存储在特定的 ORDDicom 对象属性中。此外,DICOM 二进制数据中包含的所有 DICOM 元数据将被提取到支持默认的元数据映射文档的 XML 文档中。所生成的 XML 元数据文档将存储在 ORDDicom 元数据属性中,可用于索引和查询。

 检索 SOP_INSTANCE_UID
 检索 SOP_CLASS_UID
 检索 STUDY_INSTANCE_UID
 检索 SERIES_INSTANCE_UID
 检索内容长度(DICOM 内容的字节数)

返回主题列表

检索 SOP_INSTANCE_UID

1.

该查询将从 ORDDicom 对象属性中检索服务-对象对实例 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 对象属性中检索服务-对象对类 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 对象属性中检索研究实例 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 对象属性中检索序列实例 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;


                          

返回主题

检索 DICOM 元数据

Patient Name、Patient ID 和 Modality 是众多 DICOM 标准属性中的几个,这些标准属性已嵌入 DICOM 图像,并在导入期间调用 setProperties 时被提取到 XML 文档。执行以下步骤:

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;


                          

返回主题列表

创建缩略图并更改格式

该主题将演示一些可以在数据库中调用的图像处理操作。要创建 DICOM 图像的 JPEG 缩略图,从 ORDDicom 对象生成一个新的 ORDImage 对象,然后进行处理。为此,您需要描述新的 ORDImage 对象的所需属性。例如,以下描述将生成大小为 75x100 像素的 JPEG 缩略图:‘ fileformat=jfif fixedscale=75 100’。

以下示例定义的 generate_thumb() 使用标识符 source_id 来填充 medical_image_tableimageThumb 列,并通过在源行的 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 对象,将特定的用户指定的 DICOM 属性删除或者在新的 DICOM 二进制数据以及关联的 ORDDicom 对象元数据中进行改写。XML 匿名定义文档指定应该删除或替换哪些 DICOM 对象,以及要使每个属性匿名应该采取什么操作。默认的匿名定义文档 ordcman.xml 在安装期间加载。描述如何自定义匿名定义文档的内容超出了本教程的讨论范围。对于本教程,将使用默认的匿名定义文档。

以下示例定义的 generate_anon() 使用标识符 source_id 来填充 medical_image_table 的 anonDicom 列,并通过在源行的 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;

您应该使用全局唯一的 UID 替换 generate_anon 中的 dest_sop_instance_uid 变量的临时 UID。注意,如果您没有进行替换,该过程也会运行,但会毁坏生成的匿名 DICOM 图像。

2.

生成测试 DICOM 的匿名副本。从 SQL*Plus 会话中,执行以下命令:

                               
                                 
                                   
execute generate_anon(1);
                                
                              
                            

3.

现在可以查看结果了。从 SQL*Plus 会话中,执行以下脚本:

                               
                                 
                                   
@select_anonimage
                                
                              
                            

返回主题列表

检查 DICOM 对象的一致性

该主题中的示例代码演示了如何根据一组用户指定的一致性规则检查 DICOM 数据的一致性。一致性规则在一个或多个约束定义文档中指定,这些文档是 XML 文档,可以指定 DICOM 元数据模式无法表达的属性关系和语义约束。默认的约束定义文档 ordcmct.xml 在安装期间加载。描述如何自定义约束定义文档的内容超出了本教程的讨论范围。对于本教程,将使用默认的约束定义文档。

以下示例通过在源行的 DICOM 上调用 is 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.

创建一个将 DICOM 数据导出到 IMAGEDIR 目录中的文件的过程。从 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 对象的一致性
 导出图像

返回主题列表

 将鼠标置于该图标上可以隐藏所有的屏幕截图。

Left Curve
热门下载
Right Curve
Left Curve
更多融合中间件下载
Right Curve