II
Trang 3
| TRUONG BH KY mmr
VIEN KHOA HQC VA CONG NGHE VIET NAW
VIEN CO HOC VA TIN HOC UNG DUNG
000
DE TAI:
UNG DUNG CONG NGHE THONG TIN TRONG VIEC XAY DUNG HE THONG LUU TRU VA TRUYEN TAI HiINH ANH PHUC VU CHAN DOAN VA TRA CUU (PACS) TAI BENH VIEN DA KHOA
TINH BINH DUONG
CHUYEN DE 2.11:
THIET KE VA VIET CHUONG TRINH KHAI THAC VA
XU LY ANH DICOM PHUC VU TRONG QUA TRINH HOI CHAN CHO CAC PHONG: MO, HOI TRUONG,
PHONG CHAN DOAN HINH ANH VA CAP CUU
NGƯỜI THỰC HIỆN:
Ngô Anh Tuấn
Nguyễn Hữu Phước
Nguyễn Thanh Tùng
Trần Anh Khoa
Cơ quan chủ trì: Viện Cơ học và Tin học ứng dụng Địa chỉ: 291 Điện Biên Phủ, Quận 3, thành phố Hồ Chí Minh
Chi nhiệm đề tài: Th.S Đào Văn Tuyết
HG MEME TE MGM
ar
Trang 4
ViñBn Cð hữc và Tin hồc Bng đồng Báo cáo đũ tài S5 KH&CN Bình DØfing — Chuyên đã 2.11
THONG TIN CHUNG VE CHUYEN DE
1 Tén chuyén dé: Thiét ké va viét chuong trình khai thác và xử lý ảnh DICOM phục vụ trong quá trình hội chân cho các phòng: Mỏ, Hội trường, Phòng Chân
đoán hình ảnh và cấp cứu
2 Chức năng:
Kết nối giữa các điểm hội chân
Quản lý người dùng tham gia hội chân Truyền voice, video giữa các điểm hội chân
Chia sẻ nội dung hội chân (thông tin bệnh nhân, ảnh DICOM) Đo kích thước tổn thương, tính toán Hounsfield Unit (HU) Xem lại Video ca mô
3 Nội dung công việc:
a Phuong 4 án xây dựng chương trình dựa vào các kết quả khảo sát tại Bệnh viện Bình Dương
Xây dựng ứng dụng trên REDS Xây dựng module kết nối giữa các điểm hội chân
Xây đựng module quản lý người dùng tham gia hội chân Xây dựng module thảo luận giữa các điểm hội chân Tìm kiếm thông tinh bệnh nhân
Xây dựng module chia sẻ nội dung hội chân
Hiện thực chức năng đo kích thước tổn thương, tính toán HU Cài đặt REDS Server
Hiện thực module xem lại Video ca mô
Kiểm tra, chạy thử
Trang 5
ViBin Cl Alc va Tin hiAc Png đồng Báo cáo dil tdi SA KH&CN Bình DBling —- Chuyên đã 2.11
MUC LUC
PHAN I1: THIẾT KE CHƯƠNG TRÌNH 5 2 2.1 12121 1111 tre 1 1.1 Phương án xây dựng chương trÌnh: - - ¿+ xxx ng HH he 1 12 Giới thiệu sơ lược về giao thức RTMMP LH * TH HH ng Hy l
1.2.1 Cdc ché 46 hoat dng ctia RTMP? ccccccsccssessesssessesssssesseesesseasecsesseesteaseesesses 2
1.2.2 Quá trình bắt tay: cc co ch nh HH HH 2H ườu 3
1.2.3 Tiêu đề RTMP: c nhe ưeg 3
1.2.4 Truyền tải nhiều đối tượng AMF trên cùng một kết nối: . 4
1.3 Chuẩn mã hoá dữ liệu: c- St nghe 6
1.3.1 AMF (Action Message FOrTma†): cà HH HH Hy 6
6 .Ố 6
I Ư ` 'ŠS ‹.d 7
PHẢN 2: XÂY DỰNG CÁC MODULE 555: 5 t2 tt 10
2.1 Xây dựng ứng dụng trên máy chủ REIDS óc Shin re 10
2.2 Module kết nỗi giữa các điểm hội chân 52- 25c Sncttctrrerrrrtrerree 10
2.3 Module quản lý người dùng tham gia hội chân ¿-5- 255cc xszsccxcxee 1]
2.3.1 ai na ẽg H1
2.3.2 Tao, tham gia, xóa một buổi hội chân - 5-5 ScSncvererrrtrrrreree 11
2.4 Module thao lun gitta cdc diém hOi ChaI cceccsecscsceeessssesesssesteteeseeveseeteeeees 12
2.4.1 Chat giữa những người sử dụng trong cùng nhóm hội chân: 12
2.4.2 Âm thanh tt tt HH2 a 12
2.5 Module tìm kiếm thông tin bệnh nhân .2.2©22-52ct+2v2Eerxervztrtrrrerrrei 12:
2.6 Module chia sẻ nội dung hội chân - 52 22x22 E212 14 2.6.1 Thông tin bệnh nhân và danh sách ảnh dùng trong cuộc hội chẩn 15
2.6.2 Số thứ tự, tọa độ, kích thước ảnh đang sử dụng - s55 15 2.7 Chức năng đo kích thước tôn thương, tính toán HU - - :55c++c+ssc2 17
2.7.1 Ðo kích thước tổn thương ccccccvtiiieeriirtrrirrriierrrrie 17 2.7.2 _ Tính toán HU ốA 18 2.8 Cài đặt REID5 S€TV€F - HT nT TH TH ng ko 19
2.9 _ Hiện thực module xem lại Video ca mỖ St St text rrererrre 21
Trang 6
Vin Cal hồic và Tin hic Bing dling Bao cdo di tai SA KH&CN Binh Dil@ing — Chuyén di 2.11
PHAN 1: THIET KE CHUONG TRINH
1.1 Phương án xây dựng chương trình:
Chương trình hội chân hoạt động dựa trên mô hình Client- Server, hoạt động dựa trên giao thức RTMP(Real Time Messaging Protocol) cho việc truyền dỡ liệu voIce, video, gọi hàm tìm kiếm, nhận kết quá, chia sẻ nội dung hội chan v và giao thức HTTP cho việc lấy ảnh từ máy chủ a thao tac
Client Side Server Side
Hinh 1: Sơ đồ các module chương trình 1.2 Giới thiệu sơ lược về giao thức RTMP
Mạng Internet vốn được xây dựng để truyền dữ liệu, và các giao thức truyền tải lớp Transport nhu TCP (Transmission Control Protocol) hay UDP (User Datagram Protocol) chi co kha nang truyén dữ liệu từ đầu cuối đến đầu cuối mà không có bắt kì cơ chế nào để đảm bảo gói dữ liệu được truyền đến đích trong một thời gian xác định nghĩa là không đảm bảo vấn đề thời gian thực cho âm thanh, hình ảnh Khi truyền một
gói dữ liệu trên mạng Internet có nhiều nguyên nhân khiến gói đữ liệu đến đích không
Trang 7Villn CA hflc va Tin hic Ping dling Báo cáo đồi tài SA KH&CN Bình DPlầng - Chuyên đÐØ 2.11
nhiên, người ta sử dụng cơ ché “Buffering” (ving dém Playback) ở phía nhận để giảm
jitter khi truyền âm thanh, hình ảnh trên mạng Internet Cơ chế này như sau:
Dữ liệu được đưa vào Dữ liệu được lấy ra với với tốc độ biến đồi tốc độ cố định
Hình 2: Vùng đệm dùng cho việc playback
Bên nhận khi nhận được dữ liệu thì không phát ra ngay mà lựu vào vùng đệm K Khi vùng đệm K đây thì bên nhận bắt đầu phát hình ảnh và âm thanh (lấy dữ liệu ra khỏi vùng đệm K với một tốc độ không đổi) Trong lúc phát âm thanh, hình ảnh thì nó
tiếp tục nhận đữ liệu âm thanh, hình ảnh từ bên gửi bù đắp vào đữ liệu được lấy ra
khỏi vùng đệm K để phát Nếu chỉ có trì hoãn nhỏ xảy ra thì vùng đệm K sẽ không bị
cạn kiệt và đảm bảo triệt tiêu jitter, nếu có trì hoãn lớn hoặc mắt dữ liệu thì tới một lúc
nào đó vùng đệm K sẽ bị cạn kiệt, khi đó bên nhận sẽ dừng phát âm thanh, hình ảnh và
phải tiễn hành thao tác trên lại từ đầu Có một vài điểm đáng lưu ý khi chọn kích thước
của vùng đệm K Nếu chọn K lớn thì có thể giảm đáng ké jitter nhung thoi gian cho
đợi trước khi bắt đầu phát âm thanh, hình ảnh sẽ rất lâu Ngược lai néu chọn K nhỏ thì
thì thời gian chờ đợi trước khi bắt đầu phát âm thanh, hình ảnh sẽ ngắn nhưng trong quá trình phát thường hay dừng để đệm lại dữ liệu
RTIMP là giao thức được tạo ra bởi Macromedia (hiện nay là Adobe) dùng để truyền tải các đối tượng Flash và video trên các kết nối mạng Hiện tại chỉ có 2 máy chủ hỗ trợ giao thức này là Macromedia Media Sever, và server mã nguồn mở Red5
Đây là một giao thức đơn giản, được tối ưu cho các kết nối tốc độ thấp Nó có thể hỗ trợ tối đa 64 luồng dữ liệu trên cùng một kết nối Trong header của một AMF có chứa chỉ số của luồng dữ liệu mà nó thuộc về Một message RTMP có thể chứa nhiều hơn một đối tượng AME
1.2.1 Các chế độ hoạt động của RTMP:
Trang 8
ViBn Cñ hữc và Tin hic ng đồng Báo cóo đồi tài SE KH&CN Bình DElầng ~ Chuyên đã 2.11
_1⁄2.2 Quá trình bắt tay:
Hoạt động cơ bản của RTMP như sau : Tất cả quá trình truyền thông được khởi
động bởi client Client khởi tạo một kết nỗi RTMP bằng cách gửi một byte có giá trị 0x03 — byte này được theo sau bởi một khối dữ liệu 1536 byte Định dạng của khối dữ liệu này cho đến nay vẫn chưa biết nhưng nó dường như không thực sự được sử dụng bởi giao thức ngoại trừ thao tác bắt tay
Server khi nhận được gói đữ liệu sẽ lưu lại khối đữ liệu 1536 byte này, và cũng gởi 1 byte giá trị 0x03 theo sau bởi hai khối 1536 byte Khối thứ hai chính là nội dung đã được gửi lên bởi client trước đó
Client nhận hai khối dữ liệu 1536 byte từ server, so sánh với khối đữ liệu ban đầu
nó gửi lên server, nếu phù hợp thì kết nối được thiết lập, nó cũng gửi trả khối dữ liệu nay vé lai cho server Ox03 + 1536 byte Khởi động kết nối » 1536 byte 1536 byte ¥ Client Server
Hinh 5: Qué trinh bat tay gitta Client va Server trong giao thức RTMP Sau thao tac bat tay Client tiép tuc gửi ba đối tượng AME lên server để khởi động truyền đữ liệu Đối tượng đầu tiên là đối tượng connect nhằm thông báo client đã sẵn sàng cho quá trình truyền thông Đối tượng AME thứ hai chính là đối tượng
NetConnection từ client, lớp Action Script này được sử dụng tạo kết nối tới media
server Đối tượng AMEF thứ ba là đối tượng NetStream từ client dùng để xác định file cần stream từ server
1.2.3 Tiêu đề RTMP:
RTMP có bốn loại tiêu đề đó là tiêu đề 12, 8, 4 hoặc 1 byte Byte đầu tiên của tiêu dé rất quan trong, 2 bit đầu tiên của nó xác định kích thước của tiêu đề
e 0x00: tiéu dé 12 byte e 0x01: tiêu đề 8 byte
0x02: tiêu đề 4 byte
© 0x03: tiêu dé 1 byte
Sáu bít còn lại biểu diễn chỉ số của đối tượng AMEF Một khi đối tượng AME đã được nhận đầy du béi client thi chỉ số này có thể được tái sử dụng
Trang 9ViBñn Œñ hữc và Tin hữlc ñng đồng Báo cáo đồi tài SH KH&CN Bình D?Bng - Chuyên đã 2.11 6 bịt 1 bytes fe — 3 bytes fe 3 bytes pty le 4 bytes 5 Source ID ˆˆ Header Type ( 2 bits } Hình 6: Tiêu đề RTMP 12 byte
Đối với tiêu đề 12 byte thì 3 byte tiếp theo là trường timestamp (little-endian), 3
byte tiếp theo nữa là chiêu dài của đối tượng AME (big- endian), byte ké tiép quy dinh nội dung của đối tượng AME (xem hình 7), 4 byte cuôi cùng xác định source id
Đối với tiêu đề 8 byte thì bỏ đi trudng source id trong tiêu đề 12 byte
Đối với tiêu đề 4 byte thì bỏ di trường length, content type trong tiêu dé 8 byte
Đối với tiêu đề 1 byte thì bỏ đi trường timestamp trong tiêu dé 4 byte nghia là nó
chỉ gồm byte đầu tiên chứa kiểu tiêu đề và chỉ số đối tượng AMF oxOl Chunk Size axde2 Unknown oxo3 Bytes Read ax0+4 Ping 0%D5 Server BW oxo6 Client BW oxa? Unknown
axos audio Data
oxo9 Video Data
DxHa - DxE Unknown „ DxDF Flex Stream Flex Shared o> Ox 10 Object : axi1l Flex Message ñx<12 Notify 8x13 Shared Object ñ%14 Invoke
Hình 7: Một số gid tri trong truéng Content Type 1.2.4 _Truyén tai nhiéu déi trong AMF trên cùng một kết nối:
Trang 10
Viln CP) llc va Tin hic Bing dling
Hình 8: Các khối dữ liệu của một đối tượng AMF có chỉ số là 0x03
Để có thể truyền nhiều đối tượng AMEF trên một kết nối đơn người ta không truyền
Trang 11
Viln Ca hllc va Tin hc ng đồng Báo cdo dil tdi S@l KH&CN Binh Ding — Chuyén d@ 2.11
1.3 Chuẩn mã hoá dữ liệu:
1.3.1 AMF (Action Message Format):
AME là một định dạng dùng chỉ ghép nối tiếp các dữ liệu được dùng dé giao tiép thông qua môi trường mạng AMF giúp mã hoá và định nghĩa các kiểu đữ liệu cần tương tác giữa hai hệ thống Thông qua AME, các hệ thống đầu cuối sẽ hiểu được dữ liệu được chuyền từ hệ thống khác là kiểu dữ liệu gi AMF duoc giới thiệu đầu tiền
2001 trong Flash Player 6 là AMEF0 Sau này được phát triển thêm thành AME 3 trong
Flash Player 9 Tuy nhiên AMF0 vẫn còn được hỗ trợ dé tương thích lùi
1.3.2 AMFO:
Giới thiệu:
Như đã giới thiệu ở trén AMFO là phiên bản đầu tiên của AMF giúp phép nối các đối tượng đữ liệu, chứa thông tin về kiểu của của dữ liệu AME0 cũng hỗ trợ truyền
các kiểu đữ liệu phức tạp bằng cách dùng tham chiếu để tránh dư thừa dữ liệu
Kiểu dữ liệu AME0:
Trong AMEF0, các kiểu đữ liệu được đánh dấu bằng 1 byte Theo sau đó là dữ liệu theo đúng những gì đã được mô tả ở byte đánh dấu phía trước
Các kiêu đữ liệu của AME0 được liệt kê ngay sau đây: Kiểu số 0x00 Kiểu logic 0x01 Kiểu chuỗi 0x02 Kiểu đôi tượng 0x03 Kiểu null 0x05
Kiểu tham chiêu 0x07
Kiéu mang ECMA 0x08 Đánh dấu kết thúc đôi tượng | 0x09
Kiểu mảng dày 0x0A Kiểu ngày tháng 0x0B Kiểu chuỗi đài 0x0C Kiểu XML 0x0F Kiểu lớp 0x10
Hình 10: Kiểu đữ liệu trong AMF0
se Kiểu số được dùng để mã hoá một số ActionScript Dữ liệu theo sau một
marker luôn luôn là 8 byte số dấu chấm động double IEEE-754
Kiểu số = đánh dấu DOUBLE
e© Kiểu logic được dùng để mã hoá kiểu nguyên thuỷ logic của ActionScript Một ˆ_ byte đánh dấu là kiểu logic, theo sau đó là một byte chỉ giá trị của dữ liệu logic
Giá trị này bằng 0 là false, bằng 1 là true
Trang 12
Vilin Cal hflic va Tin hic Ang ding Báo cdo da tai S3 KH&CN Bình DBlng - Chuyên đã 2.11
© Kiểu chuỗi được dùng để mã hoá bất kì một chuỗi nào có độ dài nhỏ hơn 65525 kí tự Nếu chuỗi nào dài hơn độ dài này thì sẽ chuỗi kiểu chuỗi dài
Kiểu chuỗi = đánh dấu UTF-8
e© Kiểu đối tượng được dùng để mã hoá kiểu object của ActionScript Kiểu này
tương đối "phức tạp được ghép nỗi như sau:
Kiểu đối tượng = đánh dấu (UTF-8 giá tr)(UTF-8 gia_Tri) (UTF-8 gia Tri) UTF-8 _ Tống đánh dấu kết thúc
© Kiểu null chỉ được biểu diễn bằng byte đánh dấu kiểu, và không có thông tin
đính kèm theo sau :
Kiểu null = đánh dấu
° Kiểu tham chiếu được dùng để chỉ lại dối tượng đã mã hoá phía trước mà không
cần phải truyền lại, tránh dư thừa dữ liệu Kiểu đữ liệu tham chiếu sử dụng số nguyên 16 bit đề dùng như một chỉ mục và bắt đầu bằng 0
Kiểu tham chiếu = đánh dấu U16
e_ Kiểu mảng ECMA được xem như là một kiểu phức tạp của AMEF0 Kiểu này có thể được sử dụng kèm với kiểu tham chiếu cho đữ liệu của nó Sau byte đánh
dấu là một byte chỉ kích thước của mảng, và tiếp theo sau đó là dữ liệu của
mảng "¬
Kiểu mảng ECMA = đánh dấu U32 U32*(UTF-8 gia tri) UTF-8_réng
đánh dấu kết thúc
e_ Kiểu mảng dày chứa dữ liệu cần truyền đi
Kiểu mảng dày = dánh dấu U32 U32*giá trí
e©_ Kiểu chuỗi dài được sử dụng trong AMF0 để mã hoá một chuỗi chiếm chiều dài nhiều 65535
Kiểu chuỗi dài = đánh dấu UTF-8_ dai
e Kiểu ngày tháng được dùng để mã hoá số lượng ms đã qua để từ ngày | thang 1
năm 1970 giờ UTC
Múi giớ = S16 (số nguyên có dấu 16 bit)
—— Kiểu ngày tháng = đánh dấu DOUBLE Múi giờ
e Kiểu XML cũng được hỗ trợ trong AMF0 khi dùng để ghép nối dữ liệu trong chuỗi XML AME0 coi Kiểu XML giống như những kiẻu chuỗi dài khác
Kiểu XML = đánh dấu UTE-8 dài
e©_ Kiểu lớp là kiểu được dùng để phép nối các dữ liệu trong một lớp lại thành một chuỗi gửi đi Kiểu lớp cũng có thể được sử dụng kèm với kiểu tham chiếu
Tên lớp = UTF-§
Kiểu lớp = đánh dấu Tên lớp (UTE-8 gia _tri) (UTF-8 gia tri) (UTF-8 gia tri) UTF-8 réng danh_ dấu kết thúc
13.3 AME3S: Giới thiệu:
AME3 là một phiên bản mới của AME, nhằm cải tiến những hạn chế của AMFO Cai tién cha AMF3 1a han ché lai việc truyén dư thừa dữ liệu và bổ sung thêm một số kiểu dữ liệu mới
Trang 13
Vilin CB hlic va Tin hic Bing d@ing Báo cáo đồ tài Si KH&CN Bình DØÐBng ~ Chuyên di 2.11
Trong AMEF3, mỗi kiểu đữ liệu cũng được bắt đầu bằng một byte chiều dài, tiếp
theo là dữ liệu tương ứng với dữ liệu được mô tả ở byte đánh dâu Giá trị của byte đánh dâu có ý nghĩa như sau: Kiéu undefined 0x00 Kiéu null 0x01 Kiéu logic false 0x02
Kiéu logic true 0x03
Kiểu số nguyên 0x04 Kiểu sé double 0x05
Kiéu chudi - 0x06
Kiéu van ban XML | 0x07
Kiéu ngay thang 0x08 Kiéu mang 0x09 Kiểu đổi tượng 0x0A Kiêu XML _ 0x0B Kiéu mang byte 0x0C
Hình 11: Kiểu dữ liệu của AMF3
e Kiéu undefined chỉ được biểu diễn bằng byte đánh dấu không có dữ liệu đi kèm
theo sau
Kiểu \ undefined = đánh dấu
e Kiểu null cũng giống như Kiểu undefñned chỉ được biểu diễn bằng byte đánh dẫu và không có dữ liệu đi kèm theo sau
Kiểu null = đánh đấu
e© Kiểu logic false, Kiểu logic true được dùng để thay thế cho Kiểu logic ở AME0, cái giá trị logic được biểu diễn kèm theo byte đánh dấu
Kiểu logic false = đánh dấu logic false
Kiểu logic true = đánh dấu logic true
e_ Kiểu số nguyên được dùng để mã hoá số nguyên không dấu 29 bit theo cú pháp ABNF (Augmented Backus-Naur Form)
Kiểu số nguyên = đánh _ dấu U29
se Kiểu double được dùng để mã hoá một số, Kiểu này cũng được dùng thay cho Kiểu số nguyên nếu số có giá trị lớn hơn 2? Kiểu này bao gồm một số đấu chấm động [EEE-754 theo sau một byte đánh dấu
Kiểu double = đánh dấu DOUBLE
e Kiểu chuỗi được dùng để biểu diễn một chuỗi trong AMEF3 và dùng tương
đương như chuỗi dai trong AMFO
Kiểu chuỗi = đánh dấu UTF-§-vr
e Kiểu văn bản XML được dùng để mã hoá Kiểu XMLDocument trong
ActionScript Chiều đài của một văn bản XML được giới hạn trong 256MB
Trang 14
ViBn Cũ hữc và Tin hữc Png dầng Bdo cdo dil tai SA KH&CN Binh Dialing — Chuyên đãi 2.11
e Kiểu ngày tháng có ý nghĩa giống như trong AMEO0
Kiểu ngày - tháng = đánh _ dau (U29_1|U29_2 DOUBLE)
U29_1 cé bit dau tiên là 0 chỉ kiêu ngày tháng tham chiếu, U29 _2 có bit đâu tiên là 1 tiếp theo sau là một DOUBLE chỉ số lượng ms từ ngày l
tháng 1 năm 1970 tới thời điểm hiện tại tính theo giờ UTC
e Kiểu mảng được sử dụng thay cho kiểu ECMA, máng dày đặc của AME0 _ Kiểu mảng = đánh dấu (U29 1 | U29 2 (Kiểu ECMA_ |
Kiểu máng dày))
e Kiểu đối tượng được dùng để chất lượng đối với các kiểu Object của ActionScript và kiểu lớp của người đùng
Kiểu mảng = đánh dấu (kiểu đối tượng | kiểu lớp)
e©_ Kiểu XML được dùng để mã hoá đối tượng XML của ActionScript có hỗ trợ cú pháp E4X Nội dung của kiểu này được xử lý giống như một UTF-8
| Kiéu_XML = danh_dau (U29_1 | U29_2 UTF-8)
e© Kiéu mang byte 1a mét kiéu mdi dugc hé tro trong AMF3 so voi AMFO Kiéu này cũng tượng tự như kiểu mảng của AME3 nhưng các phần tử của nó là các byte
Kiểu mảng byte= đánh đấu (U29 1|U29_2 n*(U8))
Trang 15
Vifin Cũ hữc và Tin hic Ang dling Báo cáo đã tài S0 KH&CN Bình DBlAng — Chuyên đồ 2.11
PHẢN2: XÂY DỰNG CÁC MODULE
2.1 Xây dựng ứng dụng trên máy chi REDS |
Ứng dụng trên máy chủ RED5 được viết bằng ngôn ngữ Java, cần xây dựng một lớp
Application và các hàm cần thiết để phục vụ cho các điểm hội chan Nhóm các hàm quản ly người dùng:
public int userLogin(String username, String password); public void userLogout (String username) ;
public synchronized int createConsultation(String name); public String[] getConsultationList(); -
public String[] getUserListInConsultation(String consultName) ; public synchronized int deleteConsultation(String consultName) ; public boolean joinConsultation(String username, String consultName) ; , , public boolean leaveConsultation(String username, String consultName) ; public void appDisconnect (IConnection conn) ;
Nhóm các hàm tìm kiếm thông tin bệnh nhân:
private String getPatientAge (String birthdate);
public String[][] searchPAC5(String patientName, String patientID,String startDay,String stopDay,String modality);
public String[][] getSeriesOfStudy(String studyID,String studyPK); public String[] getSeriesInformation(String seriesPK);
public boolean saveSeriesInformation(String seriesPK, String desc, String diag, String note);
Nhóm các hàm phục vụ chia sẻ nội dung:
public String[][] getImage ThumbnailPathList (String seriesPK); public synchronized boolean enableShare (String consultName) ; public synchronized boolean exitShare(String consultName) ; public synchronized String capturePen(String consultName, String username) ;
public synchronized boolean releasePen (String consultName) ;
public synchronized String lockImageViewer (String consultName, String
username) ; /
public synchronized boolean unlockImageViewer (String consultName) ; public double getHounfieldUnit (int x, int y, String studyUID, String seriesUID, String objectUID);
2.2 Module kết nối giữa các điểm hội chấn
Các điểm hội chân kết nôi với nhau thông qua REDS server sử dụng giao thức _RTMP
Xây dựng một ứng dụng rConsult trén may chi REDS
Trang 16
ViBn Ci hic va Tin hile Bing ding Báo cáo đồ tài S1 KH&CN Bình D0ling — Chuyên đã 2.11
2.3 Module quản lý người dùng tham gia hội chẵn 2.3.1 Đăng nhập
Khi người sử dụng nhập username & password và yêu cầu đăng nhập thì chương trình Client sẽ gọi hàm userLogin (username,password) trên máy chủ RED5 với
tham số là username và password vừa mới nhập vào Thực chất của việc gọi hàm này
là Client gửi một thông điệp yêu cầu máy chủ RED5 thực thi hàm userLogin với hai
tham số do Client gửi kèm theo Máy chủ REDS sau khi nhan yéu cau cua Client sẽ
tiến hành thực thi hàm userLogin với tham số do Client gửi lên Hàm này sẽ đọc CSDL của hệ thống, kiểm tra username & password do Client gửi lên có hợp lệ không,
sau đó sẽ gửi kết quả về cho Client Goi ham userLogin (username, password) > ko gua “Thực th travetir | him MáY chủ ¬ tra ket quả về chỉ tiep - M§eLogi | (hent REDS
Hinh 12: Goi ham userLogin () trên máy chủ
Hiện tại hệ thống chưa hỗ trợ SSL (Secure Socket Layer) khi đăng nhập Hạn chế này sẽ được khắc phục trong thời gian sắp đến
2.3.2 Tạo, tham gia, xóa một buỗi hội chấn
Đề tạo mới một buổi hội chan thi Client sé goi ham createConsultation (name) trén RED5 với cơ chế tương tự như lúc đăng nhập RED5 sau khi thực thi hàm này sẽ tao ra một buôi hội chân với tên là name và chờ các user tham gia buổi hội chân này
Để tham gia vào một buôi hội chân thì Client sẽ gọi hàm
joinConsultation (username, consultName) trên RED5 với tham số thứ nhất là tên |
đăng nhập, tham sô thứ hai là tên buổi hội chân muốn tham Bia REDS khi thực thi
ham joinConsultation sé dua username vao budi hội chân có tên là consu1tName Tại một thời điểm thì một user chỉ có thể tham g1a một buổi hội chân
Tương tự để xóa một buổi hội chan thì Client gọi hàm
Trang 17
ViAn Œ3 hữlc và Tin hữlc PIng đồng Báo cáo đồ tài S0 KH&CN Binh Ding — Chuyên đã 2.11
2.4 Module thảo luận giữa các điểm hội chẳn
2.4.1 5 Chat giữa những người sử dụng trong cùng nhóm hội chân:
Dùng để trao đôi ý kiến giữa | tất cả người sử dụng Cơ chế hoạt động của chức năng này là broadcast message đến tất cả người sử dụng dựa trên cơ chế SharedObject của RED5 server & Flash I May tram May tram IV” broadcast|“message”
May tram May tram
Hình 13: Sơ a6 broadcast message
2.4.2 Am thanh
Tại mỗi Client có sử dụng chức năng âm thanh, âm thanh sẽ được nén bởi chuẩn nén HE-AAC sau đó truyền lên RED5, RED5 sẽ chuyên tiếp đữ liệu âm thanh đến những người sử dụng trong nhóm hội chân có sử dụng chức năng âm thanh
Đề chức năng âm thanh hoạt động có hiệu quả thì ngoài yêu câu đường truyền có độ trễ › thấp thì còn cần trang bị hệ thống âm thanh (microphone, loa) có chất lượng tốt tại mỗi Client
2.5 Module tìm kiếm 1 thong tin bénh nhan
Hỗ trợ tìm kiếm thông tin bệnh nhân được lưu trên hệ thống PACS Có thê tìm kiếm theo tên bệnh nhân, mã số bệnh nhân, hoặc theo ngày
Quá trình hoạt động như sau: Khi client cần tìm kiếm thông tin bệnh nhân trên hệ
Trang 18
Vilin C8 hic va Tin hic ing dilng Báo cáo đồ tài SA KH&CN Bình D8Iing — Chuyên đã 2.11
Goi ham searcaPacs ——— - „ Truy vân :
CN 6 Trả kết quả |
Máy trạm REDS CSDL
Hình 14: Sơ đồ hoạt động của quá trình tìm kiếm thông tin bệnh nhân
Tạo câu truy vấn CSDL:
String query="select PATIENT.PAT NAME, PATIENT.PAT ID,
PATIENT.PAT BIRTHDATE, PATIENT.PAT_SEX, STUDY.STUDY_DATETIME,
STUDY STUDY | _DESC, STUDY.MODS_TN - STUDY, STUDY STUDY _ID, PATIENT.PK as PATIENT PK, STUDY.PK as STUDY_ PK from PATIENT, STUDY where
PATIENT PK=STUDY PATIENT _FK"; se(tpatientvane.equatrqnorecase ™) query+="_and lower (PATIENT.PAT NAME) like lower('%$"+tpatientName+"%')" i (tpatientID-equaleignoreCase("™) } query+=" and lower(PATIENT.PAT ID) like lower ('%$"+patientID+"%"')" 1£ 15 day -equa1s1gnoreCasẻ (**)]
{ queryt="" and STUDY STUDY_DATETIME>=to date ("+s day+"", 'dd-mm-yyyy")"
1£(1e_ day -equa1sTgnoreCase (""))
query+=" and STUDY.STUDY_DATETIME<=to_date('"+te_day+ " 23:59:59", 'dd-mm-
yyyy hh24:mi:ss')"; / le (tmodality.equaleignoreCase ("") )
query†=" and lower (STUDY.MODS_IN_STUDY)=lowex ('"+ modality+t"')"; 3
//sap xep theo ten va ngay chup
query+=" order by PATIENT.PAT NAME, STUDY.STUDY_ DATETTIME” ;
Lấy kết quả truy vấn
Connection conn=DriverManager.getConnection(this.dbUrl, sqlUser, sqlPwd);
Statement stmt=conn createStatement (ResultSet TYPE_SCROLL_ INSENSITIVE, ResultSet CONCUR_READ ) ONLY) ;
ResultSet rs=stmt executeQuery (query) ;
res[count] [0]=rs.getString ("PAT NAME");
res[count] (S5J=rs.getString ("STUDY DESC") ; res[count] [6]=rs.getString("MODS_IN_STUDY");
res[count] (7]=rs.getString("STUDY_ID");
res[count] [8]=rs.getString ("PATIENT PK");
res(count] {9]=rs.getString ("STUDY _PK");
Trang 19
Vitin Cl hPic va Tin hic Bing dling
Để tìm kiếm thông tin chỉ tiết về ca bệnh và lần chụp ảnh, Client con sử dụng thêm các hàm khác của RED5 như getSeriesOfStudy(), getSeriesInformation()
Nguoi su dung:admin - Budi hdi chan: tt Tién ich Tử Thiết lập /Tham gia Thảo luận Xem thông tìn bệnh nhân Tìm kiếm Xem ảnh Tên bệnh nhân: 1D bệnh nhân: Ngày bắt đầu (dd/mm/yyyv}: Ngày kết thúc (dd/m
Kết quá (Bấm F2 để làm mới):13 bệnh nhân
Tên hệnh nhân 1D bệnh nhân Tuổi Giới tính Ngày thực hiện (yyyy-mr Mô tả Kiết 1D Ca bệnh
ĐETIH HHAT 1 , $40610-093506 43 Nam 2010-06-22 26:55:39.9 CAN SIEU AM US_ 000100
BEHH HHAN 1 $£0610-09350¢€ 43 Nam 2010-06-11 24:40:30.0 CAN SIEU AM VS 800100
EEtin NHAN 1 $40610-093506 43 Ham 2010-06-11 14:45:14.0 Can STEU AM US 000190 EEHiH HHAR 5087 ¡ SA0610-033507 : 2010-06-11 15:11:40.0 PIG 507 TRE4C 101 US 000101 BENH MHAN 507 2 SAN610-093507 1 2010-06-21 15:35:12.9 PIC S07 TREAO 101 US 00019: , BEHH HHàN 509 $40610-093569 15 Nam 2OLO-O6-21 19:16:57.0 BEWH NHAN S09 fA CIEL US 609195 BINH MHAN 508 11 SA40610-093508 L tiam 2810-06-1L 16:02:21,0 PIC 508 TREATIC 162 US 000:9z BINH MHAN 508 t+ SAN620-093508 2: Ham 2020-06-21 26:09:57.0 PIC 5028 TREATIC 103 us 080193 BINH WHAM S08 1¢ SA0610-093508 1 fam 2010-06-11 16:10:19.9 PIC 508 TREATIG 103 UŠS 006193 HUU THO : SA0610-093510: 790 Nam 2010-06-11 19:21:08.0 HUU THO LAM SANG us 0601907 TRAM Quoc ToA4r 540610-093505 60 Nam 2010-06-10 25:38:30.0 ACD US 000699 TRAN Quoc TOAF SAO610-093505 60 Nam | 2010-06-10 18:50:25.0 ABCD us 900099 TRAN QUOC TOA $49610-093505 60 ham 2019-06-10 18:53:40.0 ABCD US- 000099
- Hình 15: Kết quả tìm kiếm thông tin bệnh nhân 2.6 Module chỉa sẻ nội dung hội chân
Trước tiên các file ảnh DICOM của bệnh nhân cần phải được chuyển đổi thành định dang JPEG trước khi chia sẻ giữa các điểm hội chẩn = (DicomImageReader) spi.createReaderInstance(); ImageIO.createImageInputStream(new File (dicomName) ); DicomImageReader reader ImageInputStream iis reader.setInput (iis, false); DicomImageReadParam param
(DicomImageReadParam) reader getDefaultReadParam (); BufferedImage bi=reader.read(0, param);
OutputStream out=new BufferedOutputStream (new FileOutputStream(jpegName) ); JPEGImageEncoder enc JPEGCodec.createJPEGEncoder (out);
enc.encode (bi); out.close();
iis.close();
Các nội dung cần chia sẻ: - _ Thông tin bệnh nhân
- _ Danh sách các ảnh dùng trong cuộc hội chan - Số thứ tự, tọa độ, kích thước của anh dang str dung
- _ Ứj trí đánh dấu vùng cẩn quan sát
Trang 20
ViEIn C8 hữlc và Tin hữlc ng dũing Báo cáo đã tài SB KH&CN Bình DBng — Chuyên đã 2.11
2.6.1 Thông tin bệnh nhân và danh sách ảnh dùng trong cuộc hội chan
Khi một điểm hội chân khởi động chế độ chia sẻ nội dung, thông tin bệnh nhân và danh sách ảnh cần dùng sẽ được gửi đến tất cả các điểm còn lại, đồng thời bật một cờ
cho biệt chê độ chia sẻ nội dung đã được khởi động nc.call ("enableShare", new Responder (enableShareResult),this.joined_Consult_Name) ; public function enableShareResult (res: Boolean) :void { if (res) { //khoi dong che do shareView isShareView=true; vax rotate_count:int=imgDisplay.rotateCount; imgDisplay.rotate(-1l*rotate_count) ; make sent List(); cRect:ContentRectangle=imgDisplay.contentRect; //var tPoint_x:Number=cRect.xtcRect.width/2; var tPoint_y:Number=cRect.ytcRect.height/2; tPoint_x:Number=cRect.x-imgDisplay.viewRect.width/2; tPoint_y:Number=cRect.y-imgDisplay.viewRect height/2;
soChatRoom send ("enableShareMode", tb Username.text, sent_seriesList,t
humbnailImageList, imageList, this thumbnailList.selectedIndex, this.imgDispla y.bitmapScaleFactor, tPoint_x,tPoint_y,colorPicker.selectedColor);
} else
{ <
Alert.show("Chế độ 'Chia sẻ nội dung' đã được khởi động trước đó \nĐể khởi động lại xin hủy chế độ 'Chia sẻ nội dung' trước.", "Thông bao"); } } 2.6.2 Số thứ tự, tọa độ, kích thước ảnh đang sử dụng Số thứ tự private function next_image click():void { cur_pos:int=this.thumbnailList.selectedIndex; - max pos: int=this thumbnai 1Tmagelist length~l; if (++cur_pos>max_pos) { cur_pos=0; } this.sync_to_image _pos(cur_pos); } °
/⁄/ đồng bộ hình ảnh giữa caéc client - private function sync_to_image_pos(pos:int):void
{
if (this.isShareView)
{
-'this soChatRoom send ("share switch to image pos",pO8) ;
this.alone switch_to_image_pos (po8) ;
Trang 21
Vilin Cl hic va Tin hic Bing dang Báo cáo đồi tài S5 KH&CN Bình DØBng — Chuyên đã 2.11 | Tọa độ
ImageViewer (_ client) broadcastChannel send ("applyBroadcastMessageMouseUp", _ edgeViolationDirectionx, animatePropertyX.toValue, edgeViolationDirectiony, _animatePropertyY.toValue, ImageViewer (_client) viewRect width, ImageViewer (_
client) viewRect.height, ImageViewer (client) broadcastName) ;
_- delx:Number=_reciever.x-ImageViewer(_client) width/2;
aa dely:Number=_ reciever y-ImageViewer (_client) -height/2;
ImageViewer (client) broadcastChannel.send ("applyBroadcastMessagePanTimer",
delx,dely, ImageViewer (_client) broadcastName) ; Kích thước public function sync_image_zoom(cmd:String) :void { 4£ (cmd=="in" | | cad=="out") { if (this.isShareView) { _zoomCmd=cmd; - - nc.call ("lockImageViewer", new
Responder (lockZoomResult) , this.joined_Consult_Name, this.tb_Username.text); } else { alone zoom (cmd) ; } é z z £ ` À - r Vị trí đánh dâu vùng cần quan sát Đông bộ tọa độ chuột
private function on draw click():void { if (bn_draw.selected) { _first=true; pen graphics.lineStyle(2,colorPicker.selectedColor,100); drawCanvas.addEventListener (MouseEvent MOUSE_DOWN, handleMouse) ; } else { _first=false;
while (drawCanvas.hasEventListener (MouseEvent MOUSE_DOWN) )
drawCanvas removeEventListener (MouseEvent MOUSE_DOWN, handleMouse) ; while (drawCanvas.hasEventListener (MouseEvent MOUSE_UP) )
drawCanvas removeEventListener (MouseEvent MOUSE_UP,handleMouse) ;
Trang 22Villn Œ3 hữc và Tin hữlc Ang dang Báo cáo đũi tài SP KH&CN Bình Döling - Chuyên đã 2.11 Pen.graphics 1ineSty1e (2,colorPicker selectedColor, 100) ; } private function handleTimer (time: TimerEvent) : void { „ m :Number=drawCanvas.mouseX; m_y:Number=drawCanvas.mouseY; deltax:Number=m_x-drawCanvas.width/2; - deltay:Number=m_y-drawCanvas.height/2; if (m_x<drawCanvas.width&&m_y<drawCanvas.height&&m_x>0&&m_y>0) { if(_ first) { + _first=false; sync _draw_move (deltax,deltay) ; } else { syne _draw_lineTo(deltax,deltay) ; } } }
@ tai đorìbiaedebugtinderhtrnl‹ Windows Đi “1: ea 1 09 B83 | eo: Programming Censultati eb Z CHẾ
Xử aa "gd, DAPragramming\Contultationibine =| op) a | PM Seay'e Be |, Me, BéPregramming: -Consultationibir = eee 7T â
+ Êavenite "8 OXPregramming Consul ` mẹ > Pagee Safety™ Toohse #ầv ` | ,, Favedte ⁄#‡DAProgramminglCom "Pov LL Y *m Y Page Safeyv Teeh v
Người vũ dụngroâmin - uất hội chic Ding hgichén Dang rust - [ÍMgtsideamestasnin.SvĐhiehfre 7 ” Dung hgichin - Đăng uất
Thiết lập/Tham gia Tháo lận : Thiết lập/Tham gia — Tháo luận n ‘
Tim liểm — Xentảnh Ì Tamkiếm — Xem ánh anh mục ảnh DCGH TT É | Bạnh mục ảnh pnicoM TT” + LE VAN HỤC/SP : ie Be ven UC Se 4p Anh ty dan X Thêng tin NN Thá^g H^ nt tate tro 7-10 0 2008-07-19 0 2C0 Ệ
Dane & Internet | Protected Mode: Off Hình 16: Đánh dấu vị trí cần quan sát
2.7 Chức năng đo kích thước tốn thương, tính toán HU 2.7.1 Đo kích thước tốn thương
Trang 23Vin Cũ hiầc và Tin hữc ng đông Báo cáo đũ tài S KH&CN Bình DØlBng - Chuyên đã 2.11 dely:Number=measureCanvas.mouseY-_measureFirstPoint.y; ue metric:Number=Math sqrt (delx*delxtdely*dely) ; if (metric==0) return; distance:Number=metric/96*25.4; fa distance_real:Number=distance/imgDisplay.bitmapScaleFactor; distance=Number (distance.toFixed(2)); distance_ real=Number (distance_real.toFixed(2));
ib | Measure text= "D(man hinh)= "“+distance+ " mm, D(ảnh)= "+distance_real+" mm" ; D(mản hinh}= 48.43 mm, D(ảnh}Z 48.43 mm | ` | + Hình 17: Kết quả đo khoảng cách 2.7.2 Tinh toan HU HU là một giá trị quan trọng trong việc chân đoán HU giúp xác định tính chất của vị trí khảo sát: * Nước : 0 Hu * Xuong : 1000 Hu «Ổ Khơng khí : -1000 Hu °« Châtxám : 35-40 Hu ° Chất trắng : 20 Hu * Xuathuyét : 40-90 Hu * V6i hoa : >120 Hu HU được tính theo công thức sau: HU=Pixel Instensity x Rescale Slope + Rescale Intercept
Trong đó Rescale Slope và Rescale Intercept được xác định dựa vào header của file
DICOM, Pixel Intensity chính là Gray Level tại chinh Pixel do
DicomInputStream dis = new DicomInputStream (new File(filePath) ); DicomObject dicomObj dis.readDicomObject ();
DicomElement deSlope = dicomObj.get (Tag.RescaleSlope);
DicomElement deIntercept = dicomObj.get (Tag.RescaleIntercept) ;
Trang 24
Viãn Œ hc và Tin hậc Ping dũng Báo cáo đũ tài SH KH&CN Bình D8Bing - Chuyên đã 2.11
slope = deSlope.getDouble (true) ;
intércept = deIntercept.getDouble (true) ;
int[] intensity = _image.getPixel(x, y, new int{1])
double hu = intensity[0] * _rescaleSlope + _ rescaleIntercept; (J HUL330,418) = 786 HU Hình 18: Két qua tinh HU
2.8 Cai dit REDS Server Gidi nén tap tin red5-0.8.0.tar.gz #cd /usr/local #mkdir red5 #cp /root/ red5-0.8.0.tar.gz /usr/local/redŠ #cd red5 #tar xvfz red5-0:8.0.tar.gz Tao user red5 #useradd red5
#chown red5:red5 Jusr/local/red5 -R
Copy ứng dụng rConsult vào thư mục chứa tng dung cua REDS #cp -r rConsult /usr/local/red5/webapps #chown red5:red5 /usr/local/red5 -R Kiểmtra _ #cd /usr/1local/red5 #./red5.sh Nếu không có lôi xảy ra trên màn Tình sé co 2 thông bdo nhu sau Starting Red5
Red5 root: /usr/local/reds
Configuation root: /usr/local/red5/conf Root: /usr/local/red5
Deploy type: bootstrap
Logback selector: org.red5 logging LoggingContextSelector Setting default logging context: default
Trang 25
ViAn G3 hữc và Tin hñc Bng dũng Báo cáo đã tài SðI KH&CN Bình DØồng ~ Chuyên đã 2.11
xt@b6e39f: display name [org.springframework.context.support.FileSystemXmlApplic ationContext@b6e39f]; startup date [Tue Jun 22 15:50:00 ICT 2010]; root of conte xt hierarchy [INFO] [Launcher:/rConsult] org.springframework.beans.factory.support.DefaultLis tableBeanFactory - Pre-instantiating singletons in org.springframework.beans.fac tory.support.DefaultListableBeanFactory@5e9db7: defining beans (placeholderConfi g,web.context,web.scope,web.handler]; parent: org.springframework.beans.factory support DefaultListableBeanFactory@159054d {INFO} [(Launcher:/installer] | org.springframework.beans.factory.support.DefaultLi stableBeanFactory - Pre-instantiating singletons in org.springframework.beans.fa ctory.support.DefaultListableBeanFactory@ad483: defining beans {placeholderConfi g,web.context,web.scope,web handler, installer.service]; parent: org.springframew ork.beans.factory.support DefaultListableBeanFactory@159054d [INFO] [Launcher:/installer] org.red5.server.service.Installer - Installer servi , ce created Tao service tvi /etc/init.d/red5 #chmod u+x /etc/init.d/red5 ‡#cat /etc/init.d/red5 #!/bin/bash red5 Startup script of REDS # # # # chkconfig: 345 95 15 # processname: red5 # description: Startup/Shutdown RED5 service RED5_USER=red5 REDS HOME=/usr/local/red5 STARTUP_SCRIPT=$RED5_ HOME/red5.sh SHUTDOWN _SCRIPT=$RED5_HOME/red5-shutdown.sh case "$1" in start)
echo "*** Starting REDS *** "
su ~ $RED5 USER -c "cd $RED5 HOME; $STARTUP SCRIPT >/dev/null &"
stop)
echo "*** Stopping REDS *** "
Trang 26Vi8n Œ8 hữc và Tin hữc PIing đãng Báo cáo đũ tài SBũ KH&CN Bình DBBing ~ Chuyên đã 2.11 *) echo $"Usage: $0 {start|stop|restart}" exit 1 , esac , exit 0
2.9 Hiện thực module xem lại Video ca mỗ
Lấy danh sách video ca mỗ: Client gọi hàm getRecordvideo () trên Flash Media Server đề lây về danh sách các ca mô được lưu lại private function oHandler (evt:NetStatusEvent) :void ( : if (evt.info.code=="NetConnection.Connect.Success") this.ncr2.call ("getRecordVideo", new
Responder (getRecordListResult, getRecordListError) ) ; } " private function getRecordListResult (r:Array) : void { _ar:Array=new Array(); for( -.- 1:int=0;i<r.length;i++)
_ar.push ({videoName: r [i] vname, videoDate:r[i].vdate}) ;
this.dg_ saveVideo.dataProvider= ar;
this.ncr2.close();
Phát một file Video
ner = new NetConnection();
ner.addEventListener (NetStatusEvent NET_STATUS, onVideoStatusHandler) ;
ncr.addEventListener (AsyncErrorEvent.ASYNC ERROR, asyncErr);
ner.connect (_mediaURL) ;
this.ns Video_saved = new NetStream(ncr);
this.ns_ Video _saved.play(videoPlayURL) ;
Ngudi su dung:admin - Buổi hội chẩn:
t‡ ££,
Thiết lập/Tham gia Thảo luận Xem thông tin bệnh nhân Tiện ích Xem lại Video ca mổ
Trang 27Viän Cñ hữc và Tin hBlc Png đồng , Báo cáo đồi tài S KH&CN Bình DØðlồng — Chuyên đồ 2.11 [1] [2] BỊ [4]
TAI LIEU THAM KHAO
“Medical Imaging Informatics” — Alex A.T.Bui, Ricky K.Taira — Springer, 2010 ISBN: 987-1-4419-0384-6
“Digital Imaging and Communications in Medicine (DICOM)” - National Electrical Manufacturers Association, 2009
“Xây dựng cliem Flash ứng dụng trong hội chẩn tir xa” - Tran Anh Khoa - Báo
cáo luận văn tốt nghiệp, 2008
“Tìm hiểu ly thuyét, ung dung hé thong PACS va Chuong trinh 3D slicer trong y
khoa” - Trần Quốc Tuấn — Báo cáo luận văn tốt nghiệp, 2007 WEBSITES: [1] [2] BỊ: [4] [5] [6]
Trang cht DICOM: hittp://medical.nema.org/ Các tài liệu liên quan đến ảnh DICOM: ftp://medical.nema.org/medical/dicom/2009/
Các bài báo về DICOM: ftp://medical.nema.org/medical/dicom/CP/
Trang chủ DCM4CHEE: http://www.dcmáche.org/
Trang web của IBM:
https://www.research ibm.com/haifa/projects/software/wado/ Ngôn ngữ ActionScript