Składowanie, przetwarzanie i wyszukiwanie danych multimedialnych w Oracle 11g Marek Wojciechowski Politechnika Poznańska, PLOUG Marek.Wojciechowski@cs.put.poznan.pl
Plan prezentacji Wprowadzenie do Oracle Multimedia Typy danych Oracle Multimedia Oracle Multimedia DICOM Typy danych SQL/MM Still Image Wyszukiwanie obrazów w oparciu o zawartość (Content-based Image Retrieval) Oracle Multimedia Java API Podsumowanie 2
Wprowadzenie do Oracle Multimedia
Czym jest Oracle Multimedia? Oracle Multimedia to cecha (ang. feature) serwera bazy danych Oracle umożliwiająca składowanie, odczyt i przetwarzanie multimediów w sposób zintegrowany z pozostałymi informacjami zawartymi w bazie danych do wersji 10.2 występująca pod nazwą intermedia dostępna w Standard Edition Oracle Multimedia nie jest gotową aplikacją użytkownika, ale stanowi bazę dla tworzenia różnych aplikacji oferuje typową funkcjonalność w zakresie obsługi multimediów funkcjonalność specyficzną dla danego zastosowania pozostawia aplikacji Oracle Multimedia wykorzystuje mechanizmy obiektoworelacyjne funkcjonalność dostępna głównie poprzez typy obiektowe 4
Możliwości Oracle Multimedia Możliwość zapewnienia przetwarzania transakcyjnego i ochrony obiektów medialnych jak dla danych tradycyjnych Obsługa danych z różnych źródeł (BLOB, BFILE, URL) Zapytania o metadane dla obsługiwanych typów multimediów Dla obrazów: zapytania o zawartość w oparciu o własności wizualne transformacje: skalowanie, konwersja formatu, wycinanie 2 interfejsy: specyficzny dla Oracle i zgodny z SQL/MM Still Image Obsługa typowych formatów danych (z możliwością rozszerzeń) Automatyczna ekstrakcja i pielęgnacja metadanych z danych multimedialnych w popularnych formatach 5
Nowe możliwości i zmiany w 11g Rozbudowane wsparcie dla obrazów medycznych DICOM w tym dedykowany typ danych ORDDicom Lepsza skalowalność i wydajność limit na rozmiar BLOB między 8TB a 128TB poprawa wydajności generacji miniatur obrazów wsparcie dla SecureFiles nowej generacji LOB Zdeprecjonowanie typu danych ORDImageSignature do reprezentacji właściwości wizualnych obrazu wykorzystywanych do wyszukiwania w oparciu o zawartość odzwierciedlenie trendu obserwowanego również na gruncie DB2 pozostaje CBIR poprzez typy SQL/MM 6
Architektura Oracle Multimedia Oparta o mechanizmy obiektowo-relacyjne oferuje również tzw. interfejs relacyjny Funkcjonalność wbudowana w serwer bazy danych Analiza (parsing) obiektów multimedialnych i przetwarzanie obrazów w bazie danych realizowane jest w środowisku wirtualnej maszyny Java wbudowanej w serwer Oracle wsparcie dla Java Advanced Imaging (JAI) Funkcjonalność dostępna z poziomu wielu języków najlepiej wspierane PL/SQL i Java (przez Multimedia Java classes) Brak wbudowanych mechanizmów transmisji strumieniowej współpraca z Real Networks Server i Microsoft Streaming Server zawartość na serwerze lub w bazie danych 7
Typy danych Oracle Multimedia ORDAudio dla danych audio ORDDoc - dla heterogenicznych danych multimedialnych ORDImage - dla obrazów dla obrazów medycznych specjalny typ ORDDicom ORDVideo dla danych wideo ORDSource typ pomocniczy reprezentujące dane źródłowe Typy SQL/MM Still Image (alternatywa dla ORDImage) 8
Źródła danych multimedialnych Oracle Multimedia umożliwia składowanie, odczyt i zarządzanie multimediami dostępnymi jako: Obiekty BLOB duże obiekty binarne składowane lokalnie w bazie danych (w Oracle 10g/11g max rozmiar BLOB od 8 do 128TB zależnie od konfiguracji bazy danych) Obiekty BFILE duże binarne obiekty plikowe składowane lokalnie w systemie plików serwera (poza bazą danych) Adresy URL lokalizujące obiekty multimedialne udostępniane na serwerach WWW (ias, Microsoft IIS, Apache,...) Obiekty udostępniane strumieniowo przez specjalizowane serwery Źródło danych jest ukryte w obiektach medialnych typów ORDAudio, ORDDoc, ORDImage, ORDVideo w atrybucie typu ORDSource 9
Uwagi o składowaniu danych Standardowo dostępne jest składowanie w postaci: BLOB, BFILE, URL Obsługa z poziomu Oracle Multimedia danych składowanych na specjalistycznych serwerach wymaga rozszerzenia Multimedia o odpowiednie interfejsy Tylko składowanie jako BLOB umożliwia w pełni transakcyjną kontrolę nad obiektami multimedialnymi Przy składowaniu jako BFILE lub URL, transakcyjnemu przetwarzaniu podlega jedynie wskaźnik do lokalizacji obiektu a nie dane obiektu Składowanie w postaci BFILE lub URL umożliwia łatwą migrację istniejących kolekcji multimediów do Multimedia Dane składowane poza bazą danych mogą być w każdej chwili zaimportowane do bazy 10
Sposoby ładowania danych multimedialnych do bazy danych PL/SQL proceduralne rozszerzenie SQL umożliwia zamknięcie funkcjonalności ładowania danych w formie procedur składowanych umożliwia wywoływanie metod w trakcie procesu ładowania danych binarnych ekstrakcja metadanych generacja miniatur obrazów SQL*Loader narzędzie dedykowane do ładowania danych do bazy danych ze źródeł zewnętrznych sterowanie przebiegiem operacji poprzez pliki konfiguracyjne 11
Rozpoznawane formaty danych Oracle Multimedia umożliwia składowanie danych w dowolnym formacie Dla formatów rozpoznawanych przez Oracle Multimedia możliwa jest ekstrakcja metadanych Oracle Multimedia oferuje możliwość rozszerzenia zbioru rozpoznawanych formatów Rozpoznawane formaty obrazów BMP, CALS, FPIX, GIF, JFIF, PCX, PICT, PNG, RPIX, RAS, TGA, TIFF, WBMP,... Rozpoznawane formaty audio AIFF, AIFF-C, AU, WAV, MPEG Audio, Real Audio Rozpoznawane formaty wideo MOV, AVI, Real Video, MPEG1, MPEG2, MPEG4, 3GP Dla powyższych formatów rozpoznawane są różne metody kompresji 12
Rozpoznawane metadane dla obrazów, danych audio i wideo Informacje o składowaniu (typ źródła, lokalizacja,...) Data ostatniej modyfikacji Format danych i typ MIME Metadane o zawartości w formie XML reżyser, producent, itp. Charakterystyki obrazów: wysokość i szerokość, rozmiar, metoda kompresji Charakterystyki audio: typ kodowania, metoda kompresji, liczba kanałów, częstotliwość próbkowania, rozmiar próbki, czas trwania Charakterystyki wideo: wymiary i rozdzielczość klatki, liczba klatek na sek., liczba klatek, liczba kolorów, metoda kompresji, częstotliwość strumienia bitów, czas trwania 13
Przykłady możliwych zastosowań Oracle Multimedia Internetowe sklepy z muzyką i filmami wideo Internetowe galerie obrazów i fotografii Bazy danych zapisów rozmów telefonicznych, przemówień, prezentacji Biblioteki kursów w postaci filmów wideo Nauczanie na odległość Katalogi i archiwa dokumentów Serwisy informacji finansowych Repozytoria zdjęć medycznych 14
Typy danych Oracle Multimedia
Typy danych Oracle Multimedia Cztery podstawowe typy obiektowe Oracle Multimedia: ORDAudio dla danych audio ORDDoc - dla heterogenicznych danych multimedialnych ORDImage - dla obrazów ORDVideo dla danych wideo Typy ORDAudio, ORDDoc, ORDImage, ORDVideo umożliwiają: składowanie danych multimedialnych ekstrakcję i przetwarzanie metadanych eksport/import danych między bazą danych a systemem plików podstawowe przetwarzanie danych (tylko ORDImage) Pozostałe typy danych Oracle Multimedia: ORDSource reprezentuje lokalizację danych multimedialnych, wykorzystywany w ORDAudio, ORDDoc, ORDImage i ORDVideo ORDDicom typ dedykowany dla obrazów medycznych (od 11g) Typy danych SQL/MM Still Image (alternatywa dla ORDImage) 16
Typ danych ORDAudio Atrybuty: podstawowe: description, source, format, mimetype, comments charakterystyki audio: encoding, numberofchannels, samplingrate, samplesize, compressiontype, audioduration Metody: konstruktory: init(), init(...) metody setter/getter dla atrybutów, np. getmimetype/setmimetype, getencoding/setencoding,... związane ze źródłem danych, np. import/export, setsource, getcontent, getbfile,... związane z ekstrakcją metadanych: setproperties, checkproperties związane z przetwarzaniem danych: processaudiocommand 17
Typ danych ORDDoc Atrybuty: source, format, mimetype, contentlength, comments Metody: konstruktory: init(), init(...) metody setter/getter dla atrybutów, np. getmimetype/setmimetype,... związane ze źródłem danych, np. import/export, setsource, getcontent, getbfile,... związane z ekstrakcją metadanych: setproperties 18
Typ danych ORDImage Atrybuty: podstawowe: source, fileformat, mimetype, contentlength charakterystyki obrazów: height, width, contentformat, compressionformat Metody: konstruktory: init(), init(...) metody setter/getter dla atrybutów, np. getmimetype/setmimetype, getheight, getwidth,... związane ze źródłem danych, np. import/export, setsource, getcontent, getbfile,... związane z ekstrakcją metadanych: setproperties, checkproperties, getmetadata związane z przetwarzaniem i kopiowaniem danych: copy, process, processcopy 19
Metadane w obrazach Oracle Multimedia obsługuje następujące formaty metadanych zagnieżdżonych w obrazie: EXIF (Exchangeable Image File Format) ekstrakcja IPTC-IIM (International Press Telecommunications Council- Information Interchange Model) ekstrakcja XMP (Extensible Metadata Platform) ekstrakcja i zapis Reprezentacja metadanych poza obrazem metadane jako wartość XMLType każdemu standardowi metadanych odpowiada odrębny schemat XML Schema w bazie danych możliwość składowania w odrębnej kolumnie tabeli możliwość indeksowania i przeszukiwania 20
Ekstrakcja metadanych z obrazu Przykład (1/8) Utworzenie tabeli z kolumną przygotowaną do składowania metadanych EXIF CREATE TABLE holiday_photos (id NUMBER PRIMARY KEY, metaexif XMLTYPE, photo ORDSYS.ORDIMAGE) XMLType COLUMN metaexif XMLSCHEMA "http://xmlns.oracle.com/ord/meta/exif" ELEMENT "exifmetadata"; 21
Ekstrakcja metadanych z obrazu Przykład (2/8) Załadowanie obrazka z systemu plików do bazy danych i ekstrakcja podstawowych metadanych do atrybutów DECLARE temp ordsys.ordimage; ctx RAW(64) := NULL; BEGIN INSERT INTO holiday_photos (id, photo) VALUES (42, ordsys.ordimage.init('file','mediafiles','szklarka.jpg')) RETURNING photo INTO temp; temp.import(ctx); -- import do BLOB temp.setproperties(); -- ekstrakcja metadanych do atrybutów UPDATE holiday_photos SET photo=temp WHERE id=42; COMMIT; END; / 22
Ekstrakcja metadanych z obrazu Przykład (3/8) Odczyt metadanych zapamiętanych w atrybutach ORDImage SELECT p.photo.getwidth() WIDTH, p.photo.getheight() HEIGHT FROM holiday_photos p WHERE id = 42; WIDTH HEIGHT ---------- ---------- 3072 2304 23
Ekstrakcja metadanych z obrazu Przykład (4/8) Sprawdzenie dostępnych formatów (przez ekstrakcję ALL) DECLARE image ORDSYS.ORDImage; metad XMLSequenceType; BEGIN SELECT photo INTO image FROM holiday_photos WHERE id=42; namespace: http://xmlns.oracle.com/ord/meta/ordimage namespace: http://xmlns.oracle.com/ord/meta/exif metad := image.getmetadata('all'); -- print the namespace of each metadata document FOR i in 1..metad.count LOOP DBMS_OUTPUT.PUT_LINE('namespace: ' metad(i).getnamespace() ); END LOOP; EXCEPTION WHEN ORDSYS.ORDImageExceptions.NULL_LOCAL_DATA THEN DBMS_OUTPUT.PUT_LINE('source local data is null'); WHEN ORDSYS.ORDImageExceptions.NULL_SOURCE THEN DBMS_OUTPUT.PUT_LINE('source is null'); END; / 24
Ekstrakcja metadanych z obrazu Przykład (5/8) Odczyt metadanych EXIF i umieszczenie ich w kolumnie tabeli DECLARE image ORDSYS.ORDImage; metad XMLSequenceType; exif XMLType; BEGIN SELECT photo INTO image FROM holiday_photos WHERE id = 42; metad := image.getmetadata('exif'); exif := metad(1); UPDATE holiday_photos SET metaexif = exif WHERE id = 42; END; / 25
Ekstrakcja metadanych z obrazu Przykład (6/8) Odczytane metadane EXIF <exifmetadata xmlns="http://xmlns.oracle.com/ord/meta/exif" xsi:schemalocation="http://xmlns.oracle.com/ord/meta/exif http://xmlns.oracle.com/ord/meta/exif" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"> <TiffIfd> <Make tag="271">canon</make> <Model tag="272">canon PowerShot G6</Model> <Orientation tag="274">right top</orientation> <XResolution tag="282">180</xresolution> <YResolution tag="283">180</yresolution> <ResolutionUnit tag="296">inches</resolutionunit> <DateTime tag="306">2008-04-30t16:28:18.000000</datetime> <YCbCrPositioning tag="531">centered</ycbcrpositioning> </TiffIfd>... 26
Ekstrakcja metadanych z obrazu Przykład (7/8) Odczytane metadane EXIF c.d.... <ApertureValue tag="37378">4,96875</aperturevalue> <ExposureBiasValue tag="37380">0</exposurebiasvalue> <MaxApertureValue tag="37381">2,65625</maxaperturevalue> <MeteringMode tag="37383">pattern</meteringmode> <Flash tag="37385"> <Fired>No</Fired> <Return>No strobe return function</return> <Mode>Compulsory suppression</mode> <Function>Yes</Function> <RedEyeReduction>No</RedEyeReduction> </Flash> <FocalLength tag="37386">17,59375</focallength> <FlashpixVersion tag="40960">0100</flashpixversion> <ColorSpace tag="40961">srgb</colorspace>... </exifmetadata> 27
Ekstrakcja metadanych z obrazu Przykład (8/8) Możliwość odczytu podstawowych metadanych w formie XML image.getmetadata('ordimage'); <ordimageattributes xmlns="http://xmlns.oracle.com/ord/meta/ordimage" xmlns:xsi=http://www.w3.org/2001/xmlschema-instance xsi:schemalocation="http://xmlns.oracle.com/ord/meta/ordimage http://xmlns.oracle.com/ord/meta/ordimage"> <height>2304</height> <width>3072</width> <contentlength>1992462</contentlength> <fileformat>jfif</fileformat> <contentformat>24bitrgb</contentformat> <compressionformat>jpeg</compressionformat> <mimetype>image/jpeg</mimetype> </ordimageattributes> 28
Typ danych ORDVideo Atrybuty: podstawowe: description, source, format, mimetype, comments charakterystyki wideo: height, width, frameresolution, framerate, numberofframes, compressiontype, numberofcolors, bitrate, videoduration Metody: konstruktory: init(), init(...) metody setter/getter dla atrybutów, np. getmimetype/setmimetype, getframesize/setframesize,... związane ze źródłem danych, np. import/export, setsource, getcontent, getbfile,... związane z ekstrakcją metadanych: setproperties, checkproperties związane z przetwarzaniem danych: processvideocommand 29
Typ danych ORDSource Wykorzystywany przez typy ORDAudio, ORDDoc, ORDImage, ORDVideo do reprezentacji lokalizacji danych (atrybut source) Atrybuty: localdata typu BLOB srctype file, HTTP lub <nazwa> dla źródeł użytkownika srclocation dla file : katalog (DIRECTORY), HTTP : URL katalogu srcname dla file : nazwa pliku, dla HTTP : nazwa obiektu updatetime local Metody typu ORDSource: metody setter/getter, export/import, open/close,... metody typu ORDSource nie powinny być bezpośrednio wywoływane z poziomu aplikacji aplikacje powinny korzystać z odpowiadających im metod dostępnych w typach ORDAudio, ORDDoc, ORDImage i ORDVideo 30
SecureFiles w Oracle Multimedia 11g Nowa architektura składowania dużych obiektów Interfejs kompatybilny wstecz Najlepsze rozwiązanie dla nieustrukturalizowanej zawartości Oferuje funkcjonalność charakterystyczną dla zaawansowanych systemów plików wysoka wydajność deduplikacja kompresja szyfrowanie zaawansowane mechanizmy utrzymywania logu 31
SecureFiles w Oracle Multimedia 11g Przykład Utworzenie tabeli ze wskazaniem architektury składowania zawartości binarnej CREATE TABLE holiday_photos (id NUMBER PRIMARY KEY, metaexif XMLTYPE, photo ORDSYS.ORDIMAGE) LOB(photo.source.localdata) STORE AS SECUREFILE XMLType COLUMN metaexif XMLSCHEMA "http://xmlns.oracle.com/ord/meta/exif" ELEMENT "exifmetadata"; 32
Adnotacje w formacie XML Typy ORDAudio, ORDDoc i ORDVideo umożliwiają w ramach operacji ekstrakcji metadanych o parametrach wstawienie do atrybutu komentarza adnotacji w XML atrybut comments typu CLOB Aby wygenerować adnotację metodą setproperties należy jako drugi argument przekazać TRUE Adnotacja zawiera: informacje o parametrach fizycznych (pokrywające się z atrybutami typów ORDAudio, ORDDoc, ORDVideo) informacje o zawartości merytorycznej umieszczone w obiekcie medialnym przez aplikację, która go utworzyła 33
Adnotacje Przykład (1/2) Adnotacja wygenerowana dla utworu muzycznego w formacie mp3 (MPEG/Audio):... 34
Adnotacje Przykład (2/2)... 35
Korzystanie z Multimedia Przykłady (1/5) Utworzenie tabeli obiektów do składowania dźwięków CREATE TABLE dzwieki OF ORDSYS.ORDAudio; CREATE DIRECTORY mediafiles AS 'c:\oracle\mediafiles'; GRANT READ ON DIRECTORY mediafiles TO public; Wstawienie do tabeli dźwięku składowanego jako BFILE INSERT INTO dzwieki VALUES (ORDSYS.ORDAudio.init('file', 'MEDIAFILES', 'tada.wav')); 36
Korzystanie z Multimedia Przykłady (2/5) Ekstrakcja metadanych o parametrach dźwięku DECLARE au ORDSYS.ORDAudio; ctx RAW(4000) := NULL; BEGIN SELECT value(d) INTO au FROM dzwieki d WHERE d.getsourcename() = 'tada.wav' FOR UPDATE; au.setproperties(ctx,false); -- bez adnotacji w XML encoding: MS_PCM numberofchannels: 2 samplingrate: 22050 samplesize: 16 DBMS_OUTPUT.put_line('encoding: ' au.getencoding()); DBMS_OUTPUT.put_line('numberOfChannels: ' TO_CHAR(au.getNumberOfChannels())); DBMS_OUTPUT.put_line('samplingRate: ' TO_CHAR(au.getSamplingRate())); DBMS_OUTPUT.put_line('sampleSize: ' TO_CHAR(au.getSampleSize())); UPDATE dzwieki d SET value(d) = au WHERE d.getsourcename() = 'audio3.wav'; END; 37
Korzystanie z Multimedia Przykłady (3/5) Utworzenie tabeli do składowania dźwięków w postaci obiektów kolumnowych CREATE TABLE mp3s (id number, wykonawca varchar2(100), tytul varchar2(100), probka ORDSYS.ORDAudio); Wstawienie piosenki jako BFILE i następnie import do BLOB DECLARE temp ORDSYS.ORDAudio := null; ctx RAW(4000) := NULL; row_id ROWID; BEGIN INSERT INTO mp3s VALUES (1, null, null, ORDSYS.ORDAudio.init('file','MEDIAFILES', 'Cambodia.mp3')) RETURNING ROWID, probka INTO row_id, temp; temp.import(ctx); UPDATE mp3s SET probka = temp WHERE rowid = row_id; END; / 38
Korzystanie z Multimedia Przykłady (4/5) Ekstrakcja metadanych o parametrach dźwięku i adnotacji w XML Wydobycie z adnotacji tytułu i wykonawcy utworu DECLARE temp ORDSYS.ORDAudio := null; ctx RAW(4000) := NULL; opis XMLType := NULL; wyk VARCHAR2(100) := '<nieznany>'; tyt VARCHAR2(100) := '<nieznany>'; row_id ROWID; BEGIN SELECT ROWID, probka INTO row_id, temp FROM mp3s WHERE id = 1 FOR UPDATE; temp.setproperties(ctx,true); -- odczyt metadanych i adnotacji opis := XMLType.createXML(temp.comments); IF opis.existsnode('//audio_artist/text()') = 1 THEN wyk := opis.extract('//audio_artist/text()').getstringval(); END IF; IF opis.existsnode('//media_title/text()') = 1 THEN tyt := opis.extract('//media_title/text()').getstringval(); END IF; UPDATE mp3s SET wykonawca = wyk, tytul = tyt, probka = temp WHERE rowid = row_id; END; / 39
Korzystanie z Multimedia Przykłady (5/5) SELECT id, wykonawca, tytul FROM mp3s; ID WYKONAWCA TYTUL --- --------------------- --------- 1 <![CDATA[Kim Wilde]]> <![CDATA[Cambodia]]> 40
Relacyjny interfejs Oracle Multimedia Umożliwia korzystanie z funkcji Multimedia w starych relacyjnych aplikacjach bez konieczności migracji do modelu obiektowo-relacyjnego: ekstrakcja metadanych przetwarzanie i kopiowanie obrazów operacje importu i eksportu danych Na interfejs relacyjny składają się statyczne metody typów: ORDAudio, ORDDoc, ORDImage i ORDVideo Metody statyczne operują na danych BLOB i BFILE ORDSYS.ORDAudio.getProperties(ctx,data,attrib,format) 41
Możliwości rozszerzeń Multimedia Obsługa innych zewnętrznych źródeł danych poprzez implementację i instalację odpowiedniego pakietu w schemacie ORDPLUGINS Obsługa dodatkowych formatów danych dla typów ORDAudio, ORDDoc i ORDVideo poprzez implementację i instalację odpowiedniego pakietu w schemacie ORDPLUGINS dla obrazów istnieje możliwość jawnego podania metadanych wariantem metody setproperties (!) Przetwarzanie danych audio i wideo tylko dla formatów użytkownika w ramach implementacji pakietu obsługującego dany format 42
Oracle Multimedia DICOM
Digital Imaging and Communications in Medicine (DICOM) Obrazowanie Cyfrowe i Wymiana Obrazów w Medycynie Norma opracowana przez ACR/NEMA (American College of Radiology / National Electrical Manufacturers Association) dla potrzeb ujednolicenia wymiany i interpretacji danych medycznych związanych lub reprezentujących obrazy diagnostyczne w medycynie (wg Wikipedii) Zastosowania w radiologii, kardiologii, neurologii, chirurgii, itd. Cechą DICOM jest powiązanie obrazu z atrybutami go opisującymi (standard zorientowany obiektowo) Oficjalna wersja standardu od 1992 roku to DICOM 3.0 (ciągle uaktualniana) 44
DICOM Podstawowe pojęcia Information object zawartość obrazu medycznego Service class difinicja czynności dokonywanej na zawartości medycznej SOP (service-object pair) class kombinacja Information object i Service class podstawowa jednostka w DICOM opisuje funkcjonalność DICOM posiada identyfikator (UID) przykład: składowanie obrazów tomografii komputerowej SOP instance konkretna instancja SOP klas np. konkretne zdjęcie konkretnego pacjenta 45
DICOM przykładowy obraz Widok w zewnętrznym narzędziu (DicomWorks) 46
Oracle Multimedia DICOM Umożliwia składowanie, wyszukiwanie i przetwarzanie w bazie danych Oracle multimedialnych danych medycznych w standardzie DICOM Potencjalne możliwości: baza dla tworzenia archiwów zdjęć medycznych zarządzanych i chronionych przed niepowołanym dostępem przez SZBD Oracle umożliwienie centralnego składowania obrazów dla zastosowań w telemedycynie baza dla systemów klasy EHR (Electronic Healthcare Record) 47
DICOM w Oracle 10g / 11g Oracle 10gR2 (10.2) pierwsza wersja oferująca obsługę DICOM obrazy DICOM obsługiwane poprzez typ obiektowy ORDImage wsparcie ograniczone do rozpoznawania najważniejszych atrybutów Oracle 11g (11.1) dedykowany typ obiektowy ORDDicom pakiet ORD_DICOM (interfejs relacyjny o funkcjonalności ORDDicom) pełna obsługa metadanych testowanie zgodności ze standardem przetwarzanie obrazów (kopiowanie, konwersja formatu) anonimizacja danych DICOM tworzenie obiektów DICOM poprzez wiązanie zdjęć z metadanymi Java i PL/SQL API 48
Architektura Oracle Multimedia DICOM Oracle Database JVM DICOM Repository DICOM Parser DICOM XML Encoder DICOM Conformance Validator Image Processor (JAI) <XML> 49
ORDDicom - atrybuty metadata - metadane w formacie XML (XMLType) zawierające atrybuty DICOM source - oryginalna zawartość obrazu DICOM składowana jako BLOB lub plik zewnętrzny (typ ORDDataSource) Często wykorzystywane atrybuty DICOM, np. sop_class_uid, sop_instance_uid Atrybuty do wewnętrznego użytku Oracle 50
ORDDicom przykładowe metody setproperties() ekstrakcja metadanych możliwa również przy tworzeniu obiektu lub imporcie zawartości do bazy danych makeanonymous() usunięcie danych personalnych pacjenta np. w celu udostępnienia zdjęć do badań naukowych processcopy() kopiowanie i/lub przetwarzanie obrazu konstruktory tworzące pusty obiekt lub obiekt z zawartością w oparciu o BLOB, BFILE lub ORDImage 51
ORDDicom Przykład (1/11) Utworzenie obiektu directory reprezentującego katalog systemu plików zawierający obrazy CREATE DIRECTORY dicomfiles AS 'c:\oracle\dicom'; Utworzenie tabeli z kolumną typu ORDDicom CREATE TABLE medical_images (id INTEGER PRIMARY KEY, patient_name VARCHAR2(30), dicom ordsys.orddicom, thumbnail ordsys.ordimage); 52
ORDDicom Przykład (2/11) Załadowanie repozytorium modelu danych z bazy danych do struktur w pamięci (konieczne na początku każdej sesji) EXEC ordsys.ord_dicom.setdatamodel() 53
ORDDicom Przykład (3/11) Import obrazu DICOM z pliku do bazy danych DECLARE temp ordsys.orddicom; BEGIN INSERT INTO medical_images (id, dicom, thumbnail) VALUES (179, ordsys.orddicom('file', 'DICOMFILES', '179.dcm', 0), ordsys.ordimage.init()) RETURNING dicom INTO temp; temp.import(1); -- 1: wywolaj setproperties() UPDATE medical_images SET dicom=temp WHERE id=179; COMMIT; END; / 54
ORDDicom Przykład (4/11) Odczyt jednego z podstawowych atrybutów DICOM SELECT id, t.dicom.getsopinstanceuid() AS SOP_Instance_UID FROM medical_images t; SELECT id, t.dicom.sop_instance_uid AS SOP_Instance_UID FROM medical_images t; ID SOP_INSTANCE_UID ---------- ------------------------------------------------------- 179 1.2.392.200036.9116.2.2.2.1762676206.1077529882.102147 Odczyt rozmiaru obrazu SELECT id, t.dicom.getcontentlength() AS Length FROM medical_images t; ID LENGTH ---------- ---------- 179 525974 55
ORDDicom Przykład (5/11) Odczyt metadanych w formacie XML SELECT t.dicom.metadata FROM medical_images t WHERE id=179; <?xml version="1.0"?> <DICOM_OBJECT xmlns="http://xmlns.oracle.com/ord/dicom/metadata_1_0"... >... <CODE_STRING tag="00080008" definer="dicom" name="image Type" offset="352" length="22"> ORIGINAL </CODE_STRING>... <UNIQUE_ID tag="00080018" definer="dicom" name="sop Instance UID" offset="416" length="54">1.2.392.200036.9116.2.2.2.1762676206.1077529882.102147</unique_id>... <PERSON_NAME tag="00100010" definer="dicom" name="patient's Name" offset="710" length="22"> <NAME type="unibyte"><family>cancio 2HR A-02-013</FAMILY> </NAME> <VALUE>CANCIO 2HR A-02-013</VALUE> </PERSON_NAME>... </DICOM_OBJECT> 56
ORDDicom Przykład (6/11) Wyodrębnienie informacji z metadanych w formacie XML 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 FROM medical_images t; ID PATIENT_NAME PATIENT_ID ---------- --------------------- -------------- 179 CANCIO 2HR A-02-013 ISRSCT610b 57
ORDDicom Przykład (7/11) Wyodrębnienie informacji z metadanych w formacie XML i umieszczenie ich w kolumnie tabeli UPDATE medical_images t SET patient_name = extractvalue(t.dicom.metadata, '/DICOM_OBJECT/*[@name="Patient''s Name"]/VALUE', 'xmlns=http://xmlns.oracle.com/ord/dicom/metadata_1_0'); SELECT id, patient_name FROM medical_images; ID PATIENT_NAME ---------- --------------------- 179 CANCIO 2HR A-02-013 58
ORDDicom Przykład (8/11) Utworzenie miniatur obrazów DECLARE dcmsrc ordsys.orddicom; imgdst ordsys.ordimage; BEGIN SELECT dicom, thumbnail INTO dcmsrc, imgdst FROM medical_images WHERE id = 179 FOR UPDATE; dcmsrc.processcopy('fileformat=jfif fixedscale=75 100', imgdst); UPDATE medical_images SET thumbnail = imgdst WHERE id = 179; COMMIT; END; / 59
ORDDicom Przykład (9/11) Anonimizacja DECLARE dcmsrc ordsys.orddicom; anondst ordsys.orddicom; BEGIN INSERT INTO anon_images(id, dicom) VALUES (179, ordsys.orddicom()) RETURNING dicom INTO anondst; SELECT dicom INTO dcmsrc FROM medical_images WHERE id = 179; dcmsrc.makeanonymous('1.2.3', anondst); UPDATE anon_images SET dicom = anondst WHERE id = 179; COMMIT; END; / 60
ORDDicom Przykład (10/11) Anonimizacja - weryfikacja 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 FROM anon_images t; ID PATIENT_NAME PATIENT_ID ---------- --------------------- -------------- 179 anonymous anonymous 61
ORDDicom Przykład (11/11) Eksport do pliku DECLARE dcmsrc ordsys.orddicom; BEGIN SELECT dicom INTO dcmsrc FROM anon_images WHERE id = 179; dcmsrc.export('file', 'DICOMFILES', 'anon.dcm'); END; 62
SQL/MM Still Image w Oracle Multimedia
SQL/MM Still Image w Oracle SQL/MM: SQL Multimedia and Application Packages standard ISO oparty o typy obiektowe SQL99 standard obejmuje wiele części SQL/MM Part 5: Still Image dotyczy obrazów Obecnie brak specyfikacji dla danych audio i wideo Specyfikacja SQL/MM Part 5: Still Image pierwsza edycja: ISO/IEC 13249-5:2001 druga edycja: ISO/IEC 13249-5:2003 Oracle Multimedia 10g/11g a standard SQL/MM implementacja pierwszej edycji standardu część nowych cech przewidzianej w drugiej edycji dostępna w Oracle 10g/11g jako ówczesne rozszerzenia standardu 64
Zakres SQL/MM Still Image Dotyczy składowania, przetwarzania i wyszukiwania obrazów (np. fotografii) Implementacje standardu mogą wspierać wiele różnych formatów: JPEG, GIF, TIFF,... Zakłada się, że obraz jest dwuwymiarową tablicą pikseli (obraz bitmapowy) Przetwarzanie obejmuje m.in. skalowanie i inne transformacje, wycinanie Wsparcie dla zapytań dotyczących zawartości: Średni kolor Histogramy kolorów (udział kolorów w obrazie) Lokalizacja kolorów Miara podobieństwa obrazów Specyfikacja obecnie zaimplementowana jedynie w Oracle10g/11g 65
Typy SQL/MM Still Image SI_StillImage reprezentuje obraz SI_Color reprezentuje kolor SI_AverageColor reprezentuje średni kolor obrazu SI_ColorHistogram reprezentuje histogram kolorów SI_PositionalColor reprezentuje lokalizację kolorów obrazu SI_Texture reprezentuje teksturę obrazu SI_FeatureList reprezentuje listę właściwości wizualnych obrazu 66
Typ SI_StillImage: Atrybuty Standardowe: SI_content (typu BLOB), SI_contentLength, SI_reference (typu DATALINK do reprezentacji zewnętrznych źródeł poprzez URL) SI_format, SI_height, SI_width Rozszerzenia/niezgodności w Oracle: mimetype_ora, contentformat_ora, compressionformat_ora + atrybuty do zapamiętania i automatycznej pielęgnacji właściwości wizualnych (retainfeatures_si, averagecolorspec_ora, colorslist_ora, frequencieslist_ora, colorpositions_ora, textureencoding_ora) zmiana nazw atrybutów standardowych (np. SI_content -> content_si) content_si typu ORDSource Obejmuje BLOB dla składowania w bazie i linki do lokalizacji zewnętrznych Oracle10g/11g zgodny z pierwszą wersją SQL/MM SI, typ DATALINK dostępny od drugiej wersji standardu 67
Typ SI_StillImage: Metody Konstruktory: SI_StillImage(BLOB), SI_StillImage(BLOB,...) Metody do odczytu atrybutów: np. SI_Height, SI_Width, SI_Format,... Związane z przetwarzaniem obrazów: SI_SetContent, SI_ChangeFormat SI_Thumbnail, SI_Scale, SI_Resize, SI_Rotate Związane z pielęgnacją właściwości wizualnych (Oracle10g/11g): SI_InitFeatures Wyznacza i zapamiętuje wartości własności wizualnych Wartości te będą automatycznie pielęgnowane SI_ClearFeatures 68
Metody SI_StillImage - Przykład 69
SQL/MM Still Image: Typy danych reprezentujące własności sygnałowe obrazu 70
Typ danych SI_Color Typ pomocniczy, wykorzystywany przez SI_AverageColor, SI_ColorHistogram i SI_PositionalColor Atrybuty: redvalue, greenvalue, bluevalue (wartości od 0 do 255) Metody: brak specyficznych konstruktorów dostępny jedynie domyślny systemowy (nieweryfikujący poprawności danych!) inicjalizacja koloru: SI_RGBColor (redvalue, greenvalue, bluevalue) 71
Typ danych SI_AverageColor Atrybuty: SI_AverageColorSpec (typu SI_Color) Metody: konstruktory: SI_AverageColor(SI_StillImage), SI_AverageColor(SI_Color) SI_Score(SI_StillImage) wyznaczająca "odległość" obrazu od wzorcowego średniego koloru (wartość od 0.0 do 100.0) Algorytm wyznaczania średniego koloru dla obrazu: obraz jest dzielony na n próbek komponenty koloru R, G i B z poszczególnych próbek są niezależnie od siebie sumowane i dzielone przez liczbę próbek R, G, B SI_ widthsi_ height SI_ widthsi_ height SI_ widthsi_ height R( i, j) G( i, j) B( i, j) i 1 j 1 i 1 j 1 i 1 j 1,, SI _ width* SI _ height SI _ width* SI _ height SI _ width* SI _ height 72
Typ danych SI_ColorHistogram Atrybuty: SI_ColorsList (typu SI_Color ARRAY), SI_FrequenciesList (typu DOUBLE ARRAY) Tablice mają taką samą liczbę elementów (maksymalny rozmiar SI_MaxHistogramLength zależny od implementacji) Wartości częstotliwości ograniczone zakresem od 0 do 100 W Oracle10g/11g zamiast ARRAY - "pomocnicze" typy colorslist i colorfrequencieslist, zdefiniowane jako kolekcje VARRAY Metody: konstruktory: SI_ColorHistogram(SI_StillImage), SI_ColorHistogram(SI_Color, DOUBLE PRECISION), SI_ColorHistogram(ARRAY, ARRAY) SI_Append(SI_Color, DOUBLE PRECISION) dodająca kolor i jego częstość do histogramu SI_Score(SI_StillImage) wyznaczająca "odległość" obrazu od wzorcowego histogramu kolorów (wartość od 0.0 do 100.0) 73
SI_ColorHistogram algorytm generacji histogramu Realizowana poprzez wywołanie konstruktora SI_ColorHistogram(SI_StillImage) Zasada działania algorytmu: przestrzeń kolorów dzielona jest na pewną liczbę zakresów Zależną od implementacji, ograniczoną przez SI_MaxHistogramLength (wartość tego i innych parametrów w Oracle można sprawdzić w perspektywie SI_INFORMTN_SCHEMA.SI_VALUES) każdy obszar przestrzeni kolorów obejmuje pewien zbiór kolorów i jest reprezentowany przez jeden kolor C i dla każdego obszaru kolorów określana jest jego częstotliwość F i w ramach obrazu poprzez iterację po wszystkich pikselach każdy piksel zwiększa wartość F i o 1 dla tego zakresu i do którego należy jego kolor wartości F i są normalizowane, aby zawierały się w zakresie od 0 do 100 74
Typ danych SI_PositionalColor Atrybuty: SI_ColorPositions (typu SI_Color ARRAY) Metody: Maksymalny rozmiar tablicy: SI_NumberSections W Oracle10g/11g zamiast ARRAY - "pomocniczy" typ colorpositions konstruktor: SI_PositionalColor(SI_StillImage) SI_Score(SI_StillImage) wyznaczająca odległość obrazu od wzorcowej lokalizacji kolorów (wartość od 0.0 do 100.0) Algorytm wyznaczania lokalizacji kolorów dla obrazu: obraz jest dzielony na siatkę m x n prostokątów dla każdego z prostokątów wyznaczany jest dominujący kolor 75
Typ danych SI_Texture Atrybuty: SI_TextureEncoding Metody: W Oracle10g typu textureencoding kolekcja VARRAY zawierająca współczynniki opisujące takie cechy tekstury jak: "chropowatość", kontrast, kierunek ułożenia wzoru konstruktor: SI_Texture(SI_StillImage) SI_Score(SI_StillImage) wyznaczająca "odległość" obrazu od wzorcowej tekstury (wartość od 0.0 do 100.0) Sposób opisu tekstury, algorytm wyznaczania współczynników i określania podobieństwa zależne od implementacji 76
Typ danych SI_FeatureList Atrybuty: właściwości i ich wagi: SI_AvgClrFtr (typu SI_AverageColor), SI_AvgClrFtrWght, SI_ClrHstgrFtr (typu SI_ColorHistogram), SI_ClrHstgrFtrWght, SI_PstnlClrFtr (typu SI_PositionalColor), SI_PstnlClrFtrWght, SI_TextureFtr (typu SI_Texture), SI_TextureFtrWght Metody: konstruktor: SI_FeatureList(SI_AverageColor, DOUBLE PRECISION, SI_ColorHistogram, DOUBLE PRECISION, SI_PositionalColor, DOUBLE PRECISION, SI_Texture, DOUBLE PRECISION) metody do ustawiania poszczególnych właściwości i ich wag: SI_SetFeature(SI_AverageColor, DOUBLE PRECISION), SI_SetFeature(SI_ColorHistogram, DOUBLE PRECISION), SI_SetFeature(SI_PositionalColor, DOUBLE PRECISION), SI_SetFeature(SI_Texture, DOUBLE PRECISION), metody do odczytu atrybutów, np. SI_AvgClrFtr, SI_AvgClrFtrWght,... SI_Score(SI_StillImage) wyznaczająca "odległość" obrazu od wzorcowej listy właściwości (wartość od 0.0 do 100.0 średnia ważona odległości dla poszczególnych właściwości) N i 1 F. SI _ Score image W i N i 1 W i i 77
SQL/MM Still Image Funkcje SQL Dla każdego konstruktora i metody typów SQL/MM Still Image istnieje równoważna funkcja lub procedura SQL Charakterystyka funkcji SQL dla Still Image: uruchamiane z prawami wywołującego posiadające publiczne synonimy dostępne dla wszystkich użytkowników bazy danych W Oracle10g/11g utworzone w schemacie ORDSYS (podobnie jak wszystkie typy danych Oracle Multimedia) Przykłady: SI_MkStillImage1(BLOB) dla SI_StillImage.SI_StillImage(BLOB) SI_MkRGBClr dla SI_Color.SI_RGBColor() SI_GetHeight(StillImage) dla SI_StillImage.SI_Height() 78
SQL/MM Still Image w Oracle Przykład (1/4) Utworzenie tabeli do składowania obrazów CREATE TABLE si_wzory (nazwa VARCHAR2(40), obraz ORDSYS.SI_StillImage); Wstawienie obrazu do tabeli za pośrednictwem BFILE DECLARE lobd blob; fils BFILE := BFILENAME('TKANINY','kratka.gif'); BEGIN DBMS_LOB.CREATETEMPORARY(lobd, TRUE); DBMS_LOB.fileopen(fils, DBMS_LOB.file_readonly); DBMS_LOB.LOADFROMFILE(lobd, fils, DBMS_LOB.GETLENGTH(fils)); DBMS_LOB.FILECLOSE(fils); INSERT INTO SI_WZORY (nazwa, obraz) VALUES('kratka', new ORDSYS.SI_StillImage(lobd)); DBMS_LOB.FREETEMPORARY(lobd); COMMIT; END; / 79
SQL/MM Still Image w Oracle Przykład (2/4) Wyznaczenie sygnatury dla obrazu DECLARE tempimage SI_StillImage; BEGIN SELECT obraz INTO tempimage FROM si_wzory WHERE nazwa = 'kratka' FOR UPDATE; tempimage.si_initfeatures; UPDATE si_wzory SET obraz = tempimage where nazwa = 'kratka'; COMMIT; END; / UWAGA: w rzeczywistości należałoby przejść kursorem po wszystkich wierszach tabeli i modyfikować bieżący wiersz w kursorze (WHERE CURRENT OF) 80
SQL/MM Still Image w Oracle Przykład (3/4) Wyszukanie obrazów podobnych do danego pod względem tekstury SELECT w.nazwa FROM si_wzory w WHERE SI_FindTexture( (SELECT v.obraz FROM si_wzory v WHERE v.nazwa = 'kratka')).si_score(w.obraz) < 30; 81
SQL/MM Still Image w Oracle Przykład (4/4) Wyszukanie obrazów podobnych do danego pod względem koloru i tekstury DECLARE tempimage SI_StillImage; tempavgcolor SI_AverageColor; temptexture SI_Texture; myfeaturelist SI_FeatureList; score DOUBLE PRECISION; BEGIN SELECT obraz INTO tempimage FROM si_wzory WHERE nazwa = 'kratka'; tempavgcolor := NEW SI_AverageColor(tempimage); temptexture := NEW SI_Texture(tempimage); myfeaturelist := NEW SI_FeatureList( tempavgcolor, 0.7, NULL, NULL, NULL, NULL, temptexture, 0.3); FOR c IN (SELECT nazwa, obraz FROM si_wzory) LOOP score := myfeaturelist.si_score(c.obraz); IF score < 10 THEN dbms_output.put_line(c.nazwa ' score: ' score); END IF; END LOOP; END; / 82
Content-based Image Retrieval - Uwagi Dobrze gdy szukany obiekt zajmuje cały obraz Jeśli na obrazie jest wiele kształtów, system poradzi sobie lepiej gdy: gdy są w kontrastujących kolorach na obrazie jest niewiele prostych kształtów Komputer nie dorównuje człowiekowi w zakresie porównywania obrazów: problemy ze skalowaniem, obrotami i przesłanianiem obiektów Na potrzeby analizy obrazy są tymczasowo skalowane do jednego rozmiaru fragment wycięty z obrazu może być uznany za niepodobny do całego obrazu 83
Oracle Multimedia Java API
Czym jest Oracle Multimedia Java API? Zbiór klas Java umożliwiających korzystanie z obiektów Oracle Multimedia w programach Java Dla obiektowych typów SQL Oracle Multimedia dostarczone są ich odpowiedniki w postaci klas języka Java (OrdAudio, OrdImage, OrdVideo,...) Ponadto dostępne są klasy wspierające obsługę multimediów w serwletach i JSP klasy Oracle Multimedia Java API zdefiniowane w pakiecie: oracle.ord.im import oracle.ord.im.*; 85
Oracle Multimedia Servlets and JSP Java API Upraszcza pobieranie i ładowanie multimediów do bazy danych z poziomu serwletów i JSP OrdHttpResponseHandler umożliwia pobranie obiektu medialnego z bazy danych i wysłanie go do przeglądarki z poziomu serwletu OrdHttpJspResponseHandler umożliwia pobranie obiektu medialnego z bazy danych i wysłanie go do przeglądarki z poziomu JSP OrdHttpUploadFormData i OrdHttpUploadFile służą do obsługi danych przesłanych do serwletu/jsp metodą POST z formularza HTML (mechanizm file upload ) 86
Klasa OrdHttpResponseHandler (1/2) Przykład zastosowania: PreparedStatement stmt = conn.preparestatement( "select audio from mp3s where id = 1"); OracleResultSet rset = (OracleResultSet)stmt.executeQuery(); if (rset.next()){ OrdAudio media = (OrdAudio)rset.getCustomDatum(1, OrdAudio.getFactory( )); OrdHttpResponseHandler handler = new OrdHttpResponseHandler(request, response); handler.sendaudio(media); } else{ response.setstatus(response.sc_not_found); } rset.close( ); stmt.close( ); 87
Klasa OrdHttpResponseHandler (2/2) Uwagi: Korzystanie z pobranych z bazy danych obiektów Multimedia w Javie wymaga pozostawienia otwartego połączenia z bazą Jeśli w obiekcie ORDAudio, ORDDoc, ORDImage, ORDVideo jest ustawiony atrybut MIME Type, odpowiedni nagłówek zostanie automatycznie wysłany przy wywołaniu metody sendaudio, senddoc, sendimage, sendvideo Jawne ustawienie nagłówka Content-Type umożliwia metoda sendresponse... handler.sendresponse( mimetype, media.getcontentlength( ), media.getcontent( ), media.getupdatetime( )); 88
File upload w serwletach i JSP Pliki przesyłane są z formularzy HTML metodą POST jako zawartość typu multipart/form-data Klasa OrdHttpUploadFormData analizuje i udostępnia dane przesłane formularza Klasa OrdHttpUploadFile reprezentuje przesłany plik, oferując metody dostępu do niego 89
Podsumowanie
Podsumowanie (1/2) Oracle Multimedia jest atrakcyjnym rozwiązaniem dla użytkowników pracujących z dużymi kolekcjami obiektów multimedialnych Oracle Multimedia wspiera różne sposoby składowania danych Oracle Multimedia może zapewnić przetwarzanie transakcyjne obiektów multimedialnych Oracle Multimedia oferuje duże możliwości w zakresie ekstrakcji i przetwarzania metadanych Oracle Multimedia jest cechą serwera dostępną w edycji Standard Edition 91
Podsumowanie (2/2) Oracle Multimedia najwięcej możliwości oferuje dla obrazów wyszukiwanie ze względu na zawartość podstawowe przetwarzanie (konwersje, edycja) obsługa metadanych w 3 popularnych standardach od wersji 10g wybór między składnią specyficzną dla Oracle lub zgodną z SQL/MM Still Image szczególne wsparcie dla obrazów medycznych w standardzie DICOM Zbliżoną funkcjonalność do Oracle w zakresie multimediów oferują DB2 i Informix jedynie Oracle wspiera standard SQL/MM Still Image podobnie jak Oracle, IBM wycofał się z obsługi wyszukiwania w oparciu o zawartość na poziomie serwera bazy danych (funkcjonalność zbyt specyficzna, pozostawiona aplikacjom) Nadal brak szczególnego wsparcia dla standardu MPEG-7 92