Calculatoare și tehnologia informației [608648]

UNIVERSITATEA TEHNICĂ „Gheorghe Asachi” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: Calculatoare și tehnologia informației
SPECIALIZAREA:Tehnologia informației
LUCRARE DE LICENȚĂ
Coordonator științific
Ș.l.dr.ing. Paul-Corneliu Herghelegiu
Absolvent: [anonimizat], 2019

UNIVERSITATEA TEHNICĂ „Gheorghe Asachi” din IAȘI
FACULTATEA DE AUTOMATICĂ ȘI CALCULATOARE
DOMENIUL: Calculatoare și tehnologia informației
SPECIALIZAREA:Tehnologia informației
Analiza și prelucrarea imaginilor
medicale
Coordonator științific
Ș.l.dr.ing. Paul-Corneliu Herghelegiu
Absolvent: [anonimizat], 2019

DECLARAȚIE DE ASUMARE A AUTENTICITĂȚII
LUCRĂRII DE LICENȚĂ
Subsemnatul ____ABĂCIOAIEI IOANA __________________________________,
legitimat cu _CI__ seria __XT__ nr. __ 696186__ ,
CNP____2970222330198_____________
autorul lucrării ___ ANALIZA ȘI PRELUCRAREA IMAGINILOR MEDICALE ______
_______________________________________________________________________
_______________________________________________________________________
elaborată în vederea susținerii examenului de finalizare a studiilor de
_______LICENȚĂ_______organizat de către Facultatea de Automatică și Calculatoare
din cadrul Universității Tehnice „Gheorghe Asachi” din Iași,
sesiunea ___IULIE____ a anului universitar ___ 2019__, luând în considerare conținutul
Art. 34 din Codul de etică universitară al Universității Tehnice „Gheorghe Asachi” din
Iași (Manualul Procedurilor, UTI.POM.02 – Funcționarea Comisiei de etică universitară),
declar pe proprie răspundere, că această lucrare este rezultatul propriei activități
intelectuale, nu conține porțiuni plagiate, iar sursele bibliografice au fost folosite cu
respectarea legislației române (legea 8/1996) și a convențiilor internaționale privind
drepturile de autor.
Data Semnătura

Cuprins
Introducere…………………………………………………………………………………………………………………….. 1
Capitolul 1. Fundamente teoretice și structurale ………………………………………………………………… 3
1.1. Descrierea aplicației la nivel funcțional ………………………………………………………………….. 3
1.2. Resurse hardware/software utilizate ………………………………………………………………………. 4
1.2.1. C++…………………………………………………………………………………………………………….. 5
1.2.2. Qt……………………………………………………………………………………………………………….. 5
1.2.3. OpenCV………………………………………………………………………………………………………. 6
1.2.4. GDCM………………………………………………………………………………………………………… 6
1.2.5. TinyXml………………………………………………………………………………………………………. 7
1.3. Referințe la teme/subiecte similare ………………………………………………………………………… 8
Capitolul 2. Prelucrarea seturilor de date …………………………………………………………………………. 10
2.1. Structura fișierelor DICOM ………………………………………………………………………………… 10
2.2. Respectarea confidențialității datelor aflate sub format DICOM ………………………………. 11
2.3. Reconstituirea imaginilor din seturile de date DICOM …………………………………………… 12
2.3.1. Formatul pixelilor ……………………………………………………………………………………….. 13
2.4. Stocarea și vizualizarea datelor ……………………………………………………………………………. 15
Capitolul 3. Implementare …………………………………………………………………………………………….. 19
3.1. Proiectarea software a aplicației …………………………………………………………………………… 20
3.2. Aplicarea unei funcții de transfer …………………………………………………………………………. 21
3.2.1. Principii aplicate și rezultate obținute ……………………………………………………………. 21
3.2.2. Beneficii……………………………………………………………………………………………………. 24
3.3. Redimensionarea setului de date ………………………………………………………………………….. 24
3.4. Operații grafice la nivelul imaginilor ……………………………………………………………………. 25
3.4.1. Măsurători…………………………………………………………………………………………………. 25
3.4.2. Salvarea operațiilor efectuate ……………………………………………………………………….. 28
3.4.3. Redimensionări …………………………………………………………………………………………… 29
3.4.4. Ștergerea operațiilor preexistente ………………………………………………………………….. 30
Concluzii……………………………………………………………………………………………………………………… 32
Bibliografie………………………………………………………………………………………………………………….. 33
Anexe………………………………………………………………………………………………………………………….. 34
Anexa 1. Cod sursă – extragerea imaginilor stocate sub format DICOM ………………………… 34
Anexa 2. Cod sursă – Setarea culorilor pixelilor imaginii ……………………………………………… 35
Anexa 3. Cod sursă – Salvarea seturilor de date în fișiere .xml ………………………………………. 37
Anexa 4. Cod sursă – Actualizarea seturilor de date prin parsarea xml-urilor existente ……..40
Anexa 5. Diagrama de clase ………………………………………………………………………………………. 42

Analiza și prelucrarea imaginilor medicale
Ioana Abăcioaiei
Rezumat
Lucrarea de față își propune descrierea etapelor corespunzătoare implementării unei
aplicații care să simplifice vizualizarea, analiza și prelucrarea imaginilor medicale. V or fi tratate
cazurile de imagini rezultate prin diferite procedee medicale care sunt apoi stocate sub format
DICOM (Digital Imaging and Communications in Medicine). Fișierele individuale rezultate prin
stocarea datelor sub acest format nu sunt recunoscute de Windows sau alte sisteme de operare ca
fișiere imagine. În acest scop, dezvoltarea unei aplicații care să contribuie la vizualizarea și
prelucrarea acestor formate de stocare este esențială. Utilizatorul unei astfel de aplicații poate
încărca un set de fișiere DICOM cărora le poate vizualiza conținutul și realiza diferite operații pe
setul de date.
Structural, s-a abordat o împărțire a componentelor pe baza a trei capitole, ilustrative
pentru aspectele teoretice și funcționale care au fost abordate. Partea introductivă aduce în
prim-plan aspecte teoretice generale despre aria numită imagistică medicală, rolul pe care îl are
existența unei aplicații pentru prelucrarea fișierelor DICOM, precum și principalele
funcționalități care aduc un plus de utilitate unui asemenea prototip în medicină.
Capitolul de fundamente teoretice și structurale prezintă modulele funcționale pe care le
are aplicația, precum și dependențele hardware și software pe care le necesită pentru a putea
funcționa pe un sistem de calcul. Sunt prezentate aspecte teoretice despre bibliotecile și
framework-urile adiționale utiliza te. Existența unor softuri similare a contribuit la îmbunătățirea
aplicației, fiind alese spre implementate acele funcționalități care au cunoscut cel mai înalt grad
de utilitate până în prezent.
Aspecte importante despre formatul fișierelor DICOM, modalitățile de extragere ale
seturilor de date și stocarea acestora în scopul unor vizualizări ulterioare, sunt prezentate în
cadrul capitolului al doilea.
Capitolul al treilea prezintă principalele operații pe care le poate efectua un utilizator pe
setul de date încărcat, precum și proiectarea structurală a modulelor, ilustrată prin intermediul
diagramei cu cazurile de utilizare și a celei de clase. Sunt prezentate principiile teoretice abordate
în soluționarea procedeului ales, precum și beneficiile pe care le pot oferi în procesele medicale.
Astfel, efectuarea de colorări, măsurători, redimensionări, ștergerea unor operații preexistente,
sau salvarea modificărilor efectuate constituie funcționalitățile oferite utilizatorului prin
intermediul unei interfeței accesibile.
Acestă arhitectură poate reprezenta un prim pas în realizarea unei aplicații complexe, care
să contribuie la eficientizarea procedeelor de vizualizare a imaginilor medicale și de
diagnosticare. Aria de utilizare este vastă, acoperind majoritatea sub-ramurilor medicinei.

Introducere
Introducere
Sistemul medical constituie unul dintre domeniile cu o însemnătate ridicată în procesul
de diagnosticare, soluționare, tratare și menținere a sănătății oamenilor și a animalelor. De-a
lungul timpului, această arie a cunoscut progrese remarcabile prin intermediul descoperirilor
realizate de cercetători și dezvoltatori care au conceput numeroase dispozitive (aparatură
medicală) și aplicații pentru a îmbunătăți procesele medicale.
Imagistica medicală este o arie științifică care se ocupă cu studierea modului în care se
formează, înregistrează, procesează și stochează imagini ale organelor sau țesuturilor.
Prelucrarea unor date medicale presupune un efort suplimentar din cauza modului de stocare a
acestora. În majoritatea cazurilor, datele achiziționate prin diferite metode medicale pun bazele
unei imagini reprezentative ale unor organe, care vor fi folosite în scopul detectării unor posibile
anomalii ale corpului pacientului. Imaginile au cunoscut un grad ridicat de utilizare în ultimii
ani, dar maniera lor de stocare nu este mereu ușor de vizualizat (spre exemplificare, formatul
DICOM). DICOM (Digital Imaging and Communications in Medicine) este un standard creat de
NEMA (National Electrical Manufacturers Association) în scopul reglementării distribuției și
vizualizării imaginilor medicale obținute prin rezonanță magnetică (RMN), tomografie
computerizată (CT) sau ecografie.
Având în vedere faptul că un fișier DICOM nu poate fi vizualizat fără a avea la dispoziție
un soft specializat în acest scop, prelucrarea lor devine un aspect deficitar. Majoritatea fișierelor
de acest tip stochează raze medicale, radiografii, tomografii, sau alte operațiuni medicale din care
rezultă o imagine. Acestea ajung a fi stocate în format digital pe diferite dispozitive (de exemplu:
CD-uri) sau sub format fizic (planșete speciale pe care se imprimă imaginea rezultată), care îi
revin apoi medicului pentru a fi analizate și pacientului pentru păstrare. În cazul formatului fizic,
acesta nu are un termen îndelungat de valabilitate, calitatea imaginii putând fi afectată de
păstrarea necorespunzătoare (temperaturi ridicate sau deteriorarea planșetei prin zgâriere cu alte
suprafețe). Formatul digital nu este accesibil vizualizării, astfel încât atașarea unui program care
să permită vizualizarea datelor stocate de acest fișier este necesară.
Tema aleasă vine în scopul analizei rezultatelor obținute prin intermediul acestei arii
științifice, mai exact oferă posibilitatea prelucrării datelor stocate sub format DICOM. În acest
sens, a fost dezvoltată o aplicație în limbajul de programare C++, utilizând librării și
framework-uri1 adiționale pentru analiza și prelucrarea imaginilor medicale. Prototipul dezvoltat
are în vedere implementarea unor funcționalități deja utilizate de unele aplicații folosite în centre
medicale. Aceasta aduce un plus industriei medicale prin combinarea celor mai importante
operații care se doresc a fi efectuate asupra unui set de date de acest tip. Simpla vizualizare a
informațiilor conținute, cum ar fi imaginea stocată sau date despre pacient, sunt foarte utile în
cazul inexistenței unui format fizic valid. Astfel, având la dispoziție o aplicație de acest tip, atât
medicul, cât și pacientul pot reanaliza imaginile. Pentru a aduce un plus de utilitate, au fost
oferite seturi suplimentare de operații care pot fi efectuate asupra datelor stocate de fișiere, cum
ar fi:
•prelucrarea unui set de fișiere DICOM, clasificarea datelor în dependență de numele
pacienților și a procedeului medical efectuat (zona de interes pe care s-a efectuat
procedeul medical);
•măsurarea distanței dintre două puncte de interes aflate pe suprafața imaginii – utilă în
cadrul unei săli de operație. Se adaugă opțiuni suplimentare de redimensionare sau
1Framework (ro: cadru, platformă) este o colecție de biblioteci, dar mai mult decât atât, ilustrează modul în care
se construiește aplicația software (aspecte structurale și arhitecturale la nivel de cod).
1

Ioana Abăcioaiei
ștergere în cazul unei trasări eronat efectuate;
•aplicarea unei funcții de transfer (colorarea imaginii) – utilă în cazul detectării unor
posibile anomalii. Diferențele de culori pe suprafețe restrânse pot sugera existența unor
posibile malformații sau tumori canceroase.
Acest tip de aplicație poate fi utilizat cu ușurință prin intermediul interfeței cu utilizatorul,
având aplicabilitate aproape în orice arie a medicinei (chirurgie, medicină de familie, medicină
dentară, ortopedie, etc.). Modul de efectuare al operațiilor pe seturile de date este accesibil
oricărui tip de utilizator, dar interpretarea rezultatelor oferite este recomandat a fi realizat doar de
personalul autorizat în acest scop (persoane cu studii medicale acreditate).
Prototipul aplicației nu a fost dezvoltat în scopuri comerciale, ci s-a dorit o versiune nouă
a implementărilor deja existente în domeniul medical, care să aducă un plus de utilitate prin
opțiunile oferite în procesul de prelucrare a datelor. Structura actuală a fost dezvoltată pe baza
unor studii efectuate pe aplicații deja existente prin vizualizarea gradului de utilitate al modulelor
dezvoltate. O posibilă integrare a programului în diferite centre medicale ar fi un avantaj spre a
descoperi ce operații suplimentare sugerează medicii că ar fi necesar a fi implementate, sau
îmbunătățirile care pot fi aduse celor deja existente.
Având în vedere gradul ridicat de utilitate pe care îl oferă aplicația prin prelucrarea datelor
DICOM, precum și îmbunătățirile ulterioare care îi pot fi aduse prin testarea în centrele
medicale, aceasta ar contribui la progresul proceselor de analiză și prelucrare al imaginilor
medicale.
2

Capitolul 1. Fundamente teoretice și structurale
Capitolul 1. Fundamente teoretice și structurale
În etapa preliminară de alegere și de dezvoltare a aplicației au fost stabilite resursele
necesare configurării și implementării acesteia și s-au realizat studii referitoare la conceptele pe
care le aplică imagistica medicală1. În cadrul acestui capitol, vor fi prezentate principalele
întrebuințări ale aplicației în domeniul medical, ariile pe care le poate acoperi, dependențele care
trebuie satisfăcute în scopul utilizării pe orice sistem de calcul, precum și referințe la aplicații
similare care au contribuit la gândirea funcționalităților.
1.1. Descrierea aplicației la nivel funcțional
Aplicația dezvoltată în mediul de programare C++ are drept scop extragerea conținutului
datelor stocate sub format DICOM (aspecte care vor fi detaliate în 2.1) și oferirea spre
vizualizare și prelucrare prin intermediul unei interfețe grafice ușor de utilizat, dezvoltată în Qt.
Interfața aplicației este prezentată în Figura 1.1.
Spre deosebire de alte formate de stocare a imaginilor, cum ar fi fișiere JPEG2 (engl: Joint
Photographic Experts Group) sau TIFF3 (engl: Tag Image File Format), fișierele individuale
DICOM nu sunt recunoscute de Windows sau alte sisteme de operare ca fișiere imagine. Drept
urmare, nu se poate vizualiza conținutul imaginii prin simpla accesare a ei. În acest scop, au fost
1 Imagistica medicală este o arie medicale care se ocupă în scopul studierii modului în care se formează,
înregistrează, transmit, analizează, procesează, percep și se stochează imagini ale organelor sau țesuturilor, prin
diferite tehnici, cu scopul de a le folosi pentru a diagnostica bolile.
2 Formatul JPEG (engl: Joint Photographic Experts Group) este cel mai popular format al imaginilor și poate fi citit
de toate sistemele de calcul. Aceste imagini sunt de dimensiuni mici și ușor portabile. Avantajul formatului JPEG
este că utilizează compresia datelor pentru a reduce dimensiunea imaginii.
3 Formatul TIFF (engl: Tag Image File Format ) este versatil și acceptă întreaga gamă de dimensiuni, rezoluții și
adâncimi de culoare ale imaginilor. Deoarece formatele TIFF sunt salvate fără compresie sau cu o schemă de
comprimare fără pierderi, acestea păstrează calitatea originală a imaginii și sunt adesea de dimensiuni mari.
3
Figura 1.1: Interfața aplicației. Caz de prelucrare a unui set de date

Ioana Abăcioaiei
dezvoltate numeroase aplicații care să asigure afișarea și prelucrarea datelor obținute prin
imagistica medicală. De exemplu, în urma unei ecografii, pacientul primește rezultatul acesteia
sub format digital pe un CD, sau alte formate, datele conținute fiind păstrate sub format DICOM.
În majoritatea cazurilor, CD-ul revine pacientului cu un soft atașat care să îi permită să deschidă
conținutul ecografiei (imaginea propriu-zisă), precum și celelalte date conținute de etichetele
fișierului. Un alt caz îl constituie contextul unei săli de operații. În timpul unui proces
chirurgical, medicul în cauză poate folosi o astfel de aplicație pentru a vedea diferite ecografii,
RMN-uri sau tomografii computerizate. Pe lângă simpla vizualizare a datelor, acesta poate
realiza măsurători precise ale organelor sau țesuturilor, colorări și modificări de dimensiuni pe
diferite zone de interes, astfel încât întregul proces să aibă o acuratețe ridicată pentru
identificarea posibilelor anomalii.
1.2. Resurse hardware/software utilizate
Din punct de vedere hardware, funcționalitatea modulelor aferente nu este dependentă de
alte componente fizice, fiind suficiente cele oferite de structura clasică a unui calculator. Astfel,
neexistând dependențe de acest tip, aplicația (având componentele software necesare) poate fi
utilizată pe orice sistem de calcul.
Din punct de vedere software, există necesitatea existenței/instalării unui mediu de
dezvoltare (Microsoft Visual Studio), a framework-urilor: Qt, OpenCV și a bibliotecii auxiliare
GDCM, biblioteca TinyXml fiind deja integrată în componența aplicației.
Structural, aplicația este dezvoltată în C++, proiectul fiind de tipul „Qt Designer Widget”
în scopul dezvoltării unei interfețe cu utilizatorul, folosindu-ne de modulele oferite de Qt.
Au fost utilizate următoarele categorii de resurse:
➢Resurse hardware:
•laptop Asus X550J:
✗Procesor Intel Core I5 – 4200H, 2,8 GHz;
✗8 GB memorie RAM;
✗placa video de 2 GB Nvidia 950M;
✗HDD de 1 TB;
➢Resurse software:
•Sistem de operare:
✗Microsoft Windows 10;
•Mediu de dezvoltare:
✗Visual Studio 2015;
•Limbaj de programare:
✗C++;
•Framework-uri:
✗ Qt 5.6.3, OpenCV 3.1.0;
•Biblioteci auxiliare:
✗GDCM 2.8;
✗TinyXml.
Microsoft Visual studio este un mediu de dezvoltare integrat (IDE) oferit de Microsoft, în care
putem crea aplicații Windows, site-uri web, aplicații web, aplicații mobile și servicii web.
4

Capitolul 1. Fundamente teoretice și structurale
1.2.1. C++
C++ este un limbaj de programare orientat obiect dezvoltat de Bjarne Stroustrup, fiind o extensie a
limbajului C. Așadar este posibil să scrii programe în compilatorul de C++ dar cu sintaxa de C.
Limbajul C++ este considerat a fi un limbaj de programare intermediar pentru ca încapsulează funcționalități
ale limbajului atât high level1 cât și low level2. Inițial, limbajul a fost numit „C with classes” pentru că avea
toate proprietățile limbajului de programare C la care s-a adăugat conceptul de clase3. În anul 1983, acesta a
fost redenumit în C++.
Acesta este unul dintre cele mai populare limbaje de programare, în principal utilizat pentru aplicații
desktop, drivere, aplicații client-server. Principalul avantaj al limbajului este că are o colecție de clase
predefinite care reprezintă tipuri de date și pot fi instanțiate de mai multe ori, la care se pot adăuga cele
create de programator. Acestea pot avea membrii și metode care să implementeze funcționalități specifice.
C++ combina avantajele oferite de limbajul C (eficiență, flexibilitate și popularitate) cu avantajele oferite de
tehnica POO (Programarea Orientată pe Obiect). Deși adoptă principiile POO, C++ nu impune aplicarea lor
strictă. Principalele concepte care stau la baza POO sunt:
•abstractizarea – se concentrează asupra caracteristicilor esențiale ale unui obiect, în raport cu
perspectiva unui observator;
•încapsularea – ascunde detaliile implementării unui obiect;
•modularizarea – modalitatea prin care un program este divizat în subunități (module) ce pot fi
compilate separat;
•ierarhizarea – reprezintă o ordonare a abstracțiunilor.
▪Moștenirea (ierarhia de clase) – relație între clase în care o clasă preia structura și
comportamentul definit în una sau mai multe clase (semantic implică o relație de tip “este
un/o”, engl. “is a”).
▪Agregarea (ierarhia de obiecte) – relație între două obiecte în care unul dintre obiecte
aparține celuilalt obiect (semantic implică o relație de tip “parte din”, engl. “part of”). [1]
1.2.2. Qt
Qt este o arhitectură de aplicații inter-platformă, dezvoltat de compania norvegiană
Trolltech, care este folosită pe scară largă pentru dezvoltarea de aplicații software cu o interfață
grafică, în linia de comandă sau consolă pentru servere, aplicând standardele din C++.
Qt vine cu un set de instrumente care ușurează viața programatorilor. Unul dintre
instrumente este Qt Creator, care este un IDE (mediu de dezvoltare integrat) format dintr-un
proiectant (engl.: designer) de interfață grafică (GUI) care funcționează împreună cu alte
instrumente Qt, cum ar fi compilatorul și depanatorul.
Designerul GUI aduce două tipuri de editoare diferite, unul pentru aplicații widget,
denumit Qt Designer, și altul pentru Qt Quick Application, numit Qt Quick Designer.
Qt Designer este folosit în mod normal de către dezvoltatori pentru a proiecta interfețe
grafice pentru aplicații desktop, în timp ce Qt Quick Designer este utilizat pentru platforme
mobile și embedded. Având în vedere acest lucru, ambele funcționează foarte bine pe formate
desktop și mobile, singura diferență fiind aspectul și tipurile de limbaje utilizate. [2]
Qt Designer este un instrument (engl.: tool) Qt utilizat pentru crearea design-ului și
grafica unei interfețe pentru utilizator folosind Qt Widgets. Beneficiind de acest tool, se pot crea
ferestre personalizate în orice manieră dorită și pot fi testate folosind diferite stiluri și rezoluții.
1High level – limbaj ușor de utilizat abstract de detaliile calculatorului
2Low level – limbaj strict legat de arhitectura calculatorului
3O clasă este un concept de bază al programării orientate pe obiecte , domeniu în care reprezintă structura care
definește caracteristicile abstracte ale unui obiect.
5

Ioana Abăcioaiei
Există opțiunea de a folosi Qt Quick în locul widget-urilor. Este o metodă mult mai
simplă de scriere a aplicațiilor ce au interfața cu utilizatorul. Furnizează posibilitatea de a
personaliza toată interfața și de a crea tranziții animate utilizează accelerarea grafică din
OpenGL.
Widget-urile sunt blocurile de bază pentru aplicațiile interfeței grafice (GUI) construite
cu Qt. Fiecare componentă GUI (de exemplu, butoane, etichete, editor de text) este
un widget care este plasat pe interfața cu utilizatorul. Fiecare tip de widget este furnizat de o
subclasă a clasei QWidget, care este ea însăși o subclasă pentru QObject .
Widget-urile și form- urile create în Qt designer se integrează cu codul din C++ folosind
semnalele din Qt și mecanismul de slot-uri pentru ca programatorul să poată da diferite
funcționalități elementelor grafice. Toate proprietățile din Qt Designer pot fi modificate dinamic
din cod.
Clasa Qwidget furnizează posibilitatea de randare pe ecran și de a interacționa cu
utilizatorul. Toate elementele de UI pe care Qt le are sunt fie subclase ale clasei Qwidget sau sunt
utilizate împreună cu subclase ale clasei Qwidget. Crearea unui widget personalizat se realizează
prin derivarea clasei Qwidget și reimplementarea metodelor virtuale ce tratează evenimentele.
Qt are și posibilitatea de a crea stiluri personalizate. Crearea unui stil propriu se face prin
utilizarea clasei QStyle. Qt Style Sheets este un mecanism puternic care oferă posibilitatea de a
personaliza aspectul widget-urilor, mai mult decât se poate realiza prin derivarea clasei Qstyle.
[3]
1.2.3. OpenCV
„Open Source Computer Vision Library” (OpenCV) este o bibliotecă1 de funcții open
source scrisă în C ++ pentru procesarea imaginilor și viziunea pe computer. A fost dezvoltată
inițial de Intel, ulterior susținută de Willow Garage și menținută în prezent de Itseez. Este gratuit
atât pentru utilizarea comercială, cât și pentru cea necomercială. Prin urmare, puteți utiliza
biblioteca OpenCV chiar și pentru aplicațiile comerciale. Este o bibliotecă destinată în principal
procesării în timp real. Aceasta conține peste 500 de funcții care acoperă domenii precum
imagistica medicală, calibrarea camerelor fotografice, vedere stereo sau robotică. Scopul
bibliotecii este de a pune la dispoziție potențialilor utilizatori o infrastructură de procesare a
imaginilor ușor de folosit, ce poate fi utilizată în dezvoltarea rapidă a unor aplicații complexe.
Caracterisitic cheie:
•optimizată pentru procesarea imaginilor în timpi reali și vizualizarea acestora;
•interfața primară este dezvoltată în C++, dar există și pentru C, JA V A, Python;
•aplicația openCV poate rula pe Windows, Android, Linux, Mac;
•optimizat pentru procesoare Intel. [4]
1.2.4. GDCM
Ori de câte ori datele medicale, în special datele privind imaginile medicale, sunt
generate într-un mediu clinic, trebuie stocate astfel încât să poată fi recuperate imediat sau după
câțiva ani pentru a determina eficacitatea unui curs de tratament și pentru a permite comparații
ale mai multor imagini pentru același pacient.
Imagistica digitală și comunicațiile în medicină (DICOM) este un standard care
reglementează această capacitate prin specificarea manipulării, stocării, tipăririi și transmiterii de
informații în imagistica medicală.
„Grassroots DICOM” (GDCM) este o implementare a standardului DICOM proiectat
1 O bibliotecă este o colecție de metode precompilate care pot fi folosite în cadrul unui program.
6

Capitolul 1. Fundamente teoretice și structurale
pentru a fi open source, astfel încât cercetătorii să poată accesa direct datele clinice. GDCM
include o definiție a formatului de fișier și un protocol de comunicații în rețea, ambele fiind
extinse pentru a oferi un set complet de instrumente pentru un cercetător sau un mic furnizor de
imagini medicale pentru a interfața cu o bază de date medicală existentă. GDCM este o
implementare open source a standardului DICOM, fiind dezvoltată în C++. Încercă să suporte
toate codificările posibile ale imaginilor DICOM, fiind cea mai utilizată bibliotecă pentru
prelucrarea datelor stocate sub acest format.
1.2.5. TinyXml
TinyXML este un parser simplu, mic, dezvoltat în C++ în scopul prelucrării fișierelor
XML (engl.: Extensible Markup Language) care poate fi ușor integrat în alte programe.
Parser-ul produce o reprezentare a unui document XML ca arbore al cărui noduri
reprezintă elementele, textul, comentariile și alte componente ale documentului. Acest tip de
reprezentare ierarhică este cunoscută sub numele de Document Object Model (DOM), similară
cu cel proiectat de World Wide Web (W3C), deși nu corespunde tuturor specificațiilor.
În conformitate cu spiritul minimalist oferit de TinyXml, TinyXml DOM este mai simplu
decât W3C DOM, dar și mai puțin puternic. Nodurile arborelui corespondente documentului
XML pot fi accesate prin intermediul interfeței TiXmlNode, care permite:
•accesarea părintelui unui nod;
•enumerarea sau eliminarea nodurilor sale copil;
•introducerea de noduri suplimentare.
Fiecare nod este de fapt o instanță a unui tip derivat, de exemplu:
•rădăcina arborelui este o instanță a lui TiXmlDocument;
•nodurile care reprezintă elementele sunt instanțe TiXmlElement;
•nodurile care reprezentă textul sunt instanțe ale lui TiXmlText.
În funcție de operația care se dorește a fi realizată, TinyXml poate crea și edita fișiere XML. Spre
analiză, considerăm varianta de creare a unui „Hello world” ca fișier xml, utilizând parser-ul:
TiXmlDocument doc;
TiXmlDeclaration * declaration = new TiXmlDeclaration( "1.0", "", "" );
TiXmlElement * element = new TiXmlElement( "Hello" );
TiXmlText * text = new TiXmlText( "World" );
element->LinkEndChild( text );
doc.LinkEndChild( declaration );
doc.LinkEndChild( element );
doc.SaveFile( "exemplu.xml" );
Fișierul .xml rezultat:
exemplu.xml
<?xml version="1.0" ?>
<Hello>World</Hello>
7

Ioana Abăcioaiei
1.3. Referințe la teme/subiecte similare
În procesul de construire a structurii aplicației (concepte, design, funcționalități oferite),
s-au avut în vedere prototipurile unor programe deja utilizate în domeniul medical, cum ar fi:
Weasis
Weasis este un vizualizator DICOM care poate rula pe Windows, Mac OSX și Linux. Are
caracteristici și opțiuni pentru radiologii și a fost construită pentru a fi utilizată în spitale
și centre de radiologie.
◦A fost considerată un punct de inspirație pentru opțiunile de încărcare ale tuturor
imaginilor unei serii într-un câmp de vizualizare similar celui din partea stângă a
figurii 1.2.
Box DICOM Viewer
Box permite spitalelor să partajeze în siguranță fișierele de pe orice dispozitiv în timp
real.
Utilizatorii pot:
•vizualiza versiuni color ale imaginilor;
•vizualiza imaginile DICOM de pe web sau de pe orice dispozitiv
mobil;
•distribui rezultatele și partaja imagini în diverse unități, cu pacienți sau
cu medici;
•îmbunătăți timpii de reacție prin activarea diagnosticului la distanță. [5]
•Această aplicație a constituit un punct de inspirație pentru opțiunile de
colorare pe diferite intervale. Se pot observa în figura 1.3 colorări ale coloanei
vertebrale.
8
Figura 1.2: Vizualizator DICOM Weasis (imagine preluată din [11] )

Capitolul 1. Fundamente teoretice și structurale
Vizualizatorul ezDICOM
Acest software este conceput pentru a afișa majoritatea imaginilor medicale: RMN, CT,
radiografie și ultrasunete. Toate versiunile de ezDICOM pot detecta automat formatul unei
imagini medicale și pot fi afișate pe ecran.
Opțiuni disponibile:
•Luminozitate;
•Contrast;
•Formatarea datelor de ieșire;
•Silențios (nu raportează erori);
•Redimensionare imagini. [6]
Luând în calcul toate funcționalitățile aplicațiilor din același domeniu, enumerate mai
sus, a fost creeat un sistem propriu, original, ușor de înțeles și utilizat. Sistemul reprezintă o
completare a principalelor funcționalități ale aplicațiilor prezentate anterior, pentru a oferi un
mediu cât mai intuitiv și flexibil pentru prelucrarea setului de date dorit.
9
Figura 1.3: Box DICOM Viewer (imagine preluată din [5])
Figura 1.4: ezDICOM DICOM viewer (imagine
preluată din [6])

Ioana Abăcioaiei
Capitolul 2. Prelucrarea seturilor de date
În cadrul acestei etape vor fi analizate aspecte referitoare la structura unui fișier DICOM,
operații realizate pentru extragerea datelor ce alcătuiesc imaginile medicale, precum și alte date
importante pentru reconstituirea profilului pacientului. Stocarea informațiilor extrase constituie
un alt aspect important pentru încărcarea ulterioară a acestora prin intermediul interfeței.
2.1. Structura fișierelor DICOM
Standardul DICOM este util pentru integrarea tuturor echipamentelor, accesoriilor,
serverelor de rețea, stațiilor de lucru, imprimantelor, sistemelor de arhivare a imaginilor și a
sistemelor de comunicații (PACS) moderne care pot fi instalate de mai mulți producători.
Datorită ușurinței sale de integrare și a evoluției continue, acest standard de comunicare a atins,
de-a lungul anilor, un nivel aproape universal de acceptare în rândul furnizorilor de echipamente
radiologice. Un fișier de imagine DICOM este rezultatul standardului Digital Imaging and
Communications in Medicine.
În urma procesului de obținere a imaginilor prin diferite procedee medicale și stocate
apoi sub format DICOM, acestea necesită o prelucrare suplimentară pentru a putea fi
reconstituite. Acest standard de stocare a datelor determină fișiere (*.dcm) care diferă de alte
formate de imagine prin faptul că grupează informațiile în seturi de date. Un set de date DICOM
este alcătuit dintr-un antet și imaginea propriu-zisă, toate într-un singur fișier, așa cum este
ilustrat în Figura 2.1.
10
Figura 2.1: Antetul și imaginea
unui fișier DICOM (preluat din
[7])

Capitolul 2. Prelucrarea seturilor de date
Antetul, denumit și header, stochează informații demografice despre pacient, parametrii
de achiziție pentru studiul imagistic, dimensiunile imaginii, dimensiunea vectorului, spațiul de
culoare și o serie de informații suplimentare necesare pentru a putea fi reconstituite corect datele
stocate. Acestea sunt organizate ca o serie constantă și standardizată de etichete. De exemplu,
grupul "0010" conține informații despre pacient:
• numele pacientului, eticheta "0010-0010";
• numărul de identificare al acestuia, eticheta "0010-0020";
• data nașterii, eticheta "0010-0030";
În mod similar, grupul "0018" conține informații privind achiziția, iar "0028" stochează
codificarea imaginii propriu-zise. O astfel de structurare este ilustrată în Figura 2.2. [7]
Figura 2.2: Structura unui fișier DICOM (preluată și modificată din [8])
Etichetele comune care indică identitatea pacientului includ numele pacientului, vârsta,
data nașterii, numărul de identificare al spitalului, grupul etnic, ocupația, numele medicului,
numele instituției, data studiului și identificatorii unici DICOM. Așa cum a fost descris anterior,
astfel de informații ale pacientului și o serie de alte informații despre studiul de imagistică sunt
codificate într-un antet și o imagine. Datele pot sau nu pot fi afișate pe ecran, dar informațiile pot
fi extrase din antet de către oricine are acces la fișierul DICOM și la o aplicație care să poată
decodifica conținutul.
2.2. Respectarea confidențialității datelor aflate sub format DICOM
Respectarea confidențialității pacientului este importantă atunci când imaginile sunt
utilizate în prezentări sau publicații. O metodă simplă și ușoară de a asigura acest lucru este prin
11

Ioana Abăcioaiei
conversia și exportul fișierului DICOM în alte formate de imagine, cum ar fi JPEG sau
TIFF. Informațiile din antet se pierd, iar identitatea pacientului nu poate fi obținută din imaginea
rezultantă. Formatele mai populare utilizate în practica zilnică sunt formatele JPEG, JPEG 2000,
TIFF, GIF și PNG. Spre deosebire de imaginile DICOM, imaginile salvate în aceste formate pot
fi vizualizate pe orice computer personal. Ele pot fi ușor incluse în prezentări și pagini Web. Prin
urmare, aceste fișiere necesită mai puțin spațiu de stocare și mai puține resurse pentru a le
transfera prin rețea sau prin Internet. [7]
2.3. Reconstituirea imaginilor din seturile de date DICOM
Prelucrarea datelor aflate sub format DICOM a fost realizată prin intermediul bibliotecii
GDCM 2.8. Această bibliotecă deține funcții specializate în scopul extragerii și prelucrării
datelor conținute de acest tip de fișiere, oferind metode de decodare și de vizualizare al
conținutului. În tabelul 2.1 sunt exemplificate funcțiile specifice bibliotecii GDCM, utilizate în
scopul extragerii datelor ce alcătuiesc imaginile stocate.
Tabelul 2.1: Etapele extragerii datelor stocate în fișierele DICOM
Instanțierea
obiectelor utilizateMetode specifice utilizate Rol
ImageReader void SetFileName(const
char *filename_native);Setarea fișierului care urmează a fi
deschis spre prelucrare.

virtual bool Read();Citirea conținutului fișierului. Această
citire poate eșua în cazurile;
•fișierul introdus nu este de tip
DICOM;
•fișierul introdus este de tip
DICOM, dar nu conține o
imagine;
Metoda returnează adevărat sau fals, în
funcție de cum au fost satisfăcute
condițiile.
ImageImage& GetImage();Se apelează metoda GetImage() prin
intermediul instanței ImageReader. Va fi
returnat conținutul imaginii stocate de
fișier.
char *unsigned long
GetBufferLength()
const;Returnează dimensiunea imaginii după
decompresie. În cazul în care tipul
imaginii este RGB, această dimensiune
necesită a fi multiplicată de trei ori, după
cum sugerează documentația aferentă
bibliotecii.
12

Capitolul 2. Prelucrarea seturilor de date
bool GetBuffer(char
*buffer) const;Prin intermediul obiectului de tip Image
instanțiat, se extrag datele ce alcătuiesc
conținutul imaginii și se rețin într-o
variabilă de tip char *buffer.
După etapele corespunzătoare extragerii conținutului imaginii deținute din fișier (datele
fiind extrase sub forma unui vector de valori, la fel cum este ilustrat în figura 2.1), urmează etapa
de transpunere a conținutului într-un format specific stocării imaginilor, accesibil spre
vizualizarea concretă a imaginii. În acest caz, s-a ales formatul JPEG (engl: Joint Photographic
Experts Group), deoarece este cel mai popular format al imaginilor și poate fi citit de toate
sistemele de calcul. Aceste imagini sunt de dimensiuni mici și ușor portabile. Avantajul
formatului JPEG este că utilizează compresia datelor pentru a reduce dimensiunea imaginii.
Procesul prin care setul de date este convertit în formatul stabilit, necesită prelucrări
suplimentare ale datelor, în dependență de formatul pixelilor corespondenți.
2.3.1. Formatul pixelilor
„Bit depth” reprezintă numărul de biți necesari pentru stocarea unui pixel în cadrul
alcătuirii unei imagini. Pentru reprezentarea unui număr cât mai mare de culori și a unei precizii
cât mai bune, este necesară și o adâncime mai mare a pixelilor implicați. Numărul maxim de
culori (sau nuanțe de gri) este determinat de utilizarea relației (1).
numărdeculori=2(numărdebiți)(1)
Tabelul 2.2 ilustrează exemple de adâncimi de biți și numărul asociat de culori. Modele
reprezentate pe fundal mai întunecat sunt comune, iar celelalte sunt mai puțin frecvente,
acceptate doar de câteva formate de imagine.
Tabelul 2.2: Categorii de biți care pot alcătui o imagine (preluat și modificat din [9])
Număr de biți Număr de culori
acceptateDescriere Utilizări uzuale
1 2Imagini monocrome Imagini de tipul
pictogramă sau cursor
2 4
3 8
4 16Palete de culori sau
tonuri de gri
5 32
6 64
7 128
8 256Palete de culori sau
tonuri de griDesene, imagini în
tonuri de gri
15 32768
13

Ioana Abăcioaiei
16 65536 Caracteristică
imaginilor cu rezoluție
ridicată
24 16M 16 milioane de culori Fotografii
48 256T 256 tera culori Imagini științifice
Din păcate, cele mai tipice afișări desktop suportă numai 8 biți de date de culoare pe
canal. Aceasta înseamnă că, chiar dacă ați ales să editați în 16 biți, valorile tonale pe care le
vedeți vor fi limitate de computer și de afișare. În acest scop, pentru a nu crea ambiguități, s-a
ales realizarea unei conversii la 8 biți pentru ca imaginile rezultate sa poată fi suportate de orice
sistem de calcul. În cazul celor care original au adâncimea pixelilor de 16 biți și nu sunt RGB,
sunt necesare operații suplimentare pentru a le aduce în intervalul de culori suportat de
adâncimea de 8 biți utilizată pentru stocare și acelor trei canale de culori: roșu, verde și albastru.
În acest sens, a fost creată metoda normal care să convertească valorile pixelilor de la 16 la 8 biți.
void normal(short* buffer16, unsigned char* result, double wind, double min, int
size);
unde
•buffer16 – setul de date cu valorile pixelilor ce alcătuiesc imaginea;
•result – noul set de date format prin reducere;
•wind – numărul total de culori ale imaginii care va fi procesată;
•min – valoarea cea mai mică a unui pixel identificat;
•size – dimensiunea setului de date ale imaginii.
14
Figura 2.3: Exemple de imagini care dețin pixeli aflați la diferite nivele de adâncimi, după cum a fost
sugerat în tabelul (preluată și modificată din [5])

Capitolul 2. Prelucrarea seturilor de date
Au fost utilizate formulele:
Numărul maxim de culori care poate fi conținut de imagine wind=max−min.(2)
nouavaloareaproximatăapixel−ului=buffer16−min
wind∗255=2, unde 255
reprezintă valoarea maximă a unui pixel cu adâncimea de 8 biți.(3)
Spre exemplificare, considerând cazul unei imagini care are adâncimea pixelilor de 16 biți
și conține 60000 de nuanțe de culori din cele 65536 pe care le poate suporta această adâncime a
pixelilor. Valoarea minimă a unui pixel o alegem 100, iar valoarea maximă 60100, aspecte
ilustrate în Figura 2.4.
buffer16 va prelua treptat toate valorile din cadrul acestui interval. Pentru fiecare valoare se va
determina un clasificator unic al acesteia în raport cu valoare minimă identificată, urmând apoi a
fi împărțit la numărul total de culori din imagine. Rezultatul obținut va fi subunitar, înmulțirea
cu 255 oferind o valoare încadrată între 0 și 255, valori ale pixelilor suportate în cazul
adâncimilor de 8 biți.
Setul de date obținut va fi convertit în format RGB prin intermediul clasei QImage, specifică Qt,
care oferă o reprezentare hardware-independentă a imaginii, stocarea acesteia fiind realizată cu
ajutorul clasei QimageWrite. Imaginea obținută astfel va putea fi stocată pe orice sistem de
calcul.
Vizualizați Anexa 1. , cea care conține funcția completă specializată în extragerea conținutului și
în prelucrarea acestuia.
2.4. Stocarea și vizualizarea datelor
În 2.3 au fost evidențiate procedeele prin intermediul cărora s-a realizat extragerea unei
imagini stocate de un fișier DICOM. Pe lângă acest procedeu, au fost prelucrate și alte date
importante stocate în cadrul etichetelor, cum ar fi: numele pacientului, dimensiunea imaginii,
spațierea dintre pixeli, o serie generală prin intermediu căreia se identifică apartenența unui fișier
la un grup de fișiere și o serie unică care ajută la identificarea în mod unic a unui fișier.
Attribute<0x0010, 0x0010> pacientsName;
Attribute<0x0028, 0x0030> pixelSpacing;
15
Figura 2.4: Reprezentarea intervalului de culori conținut de o imagine care are adâncimea pixelilor de 16
biți

Ioana Abăcioaiei
Attribute<0x0028, 0x0010> rows;
Attribute<0x0028, 0x0011> columns;
Attribute<0x0008, 0x0018> sopInstance; //identificator unic pentru fiecare fișier
Attribute<0x0020, 0x000E> seriesInstance; //identificator unic pentru fiecare
//grup de fișiere
Pentru extragerea acestor seturi de date s-a utilizat metoda const DataElement&
GetDataElement( const Tag &t) const din cadrul bibliotecii GDCM care permite extragerea
datelor aflate la o etichetă specifică, în cazul nostru cele definite de câmpul „Attribute”.
După ce au fost extrase simultan datele referitoare la conținutul imaginii, precum și cele
suplimentare menționate mai sus, urmează procesul de stocare sub un format lizibil, pentru a
putea fi oferite mai târziu utilizatorului prin intermediul interfeței.
Simultan, pentru fiecare fișier regăsit în directorul introdus de utilizator, se realizează
următoarele operații:
•În cazul în care există deja un director cu numele pacientului (în setul de resurse
atașat aplicației), se trece la pasul următor, în caz contrar se creează unul;
•Se caută în directorul anterior un nou director cu numărul seriei care identifică
grupul de fișiere din care face parte. În cazul în care nu există, este creat;
•O dată creată secvența de directoare, se poate realiza scrierea imaginii obținute
prin procedeele evidențiate în subcapitolul 2.3.
Se poate observa că această abordare ( Figura 2.5) ilustrează o structurare foarte bună a
datelor deținute de fiecare pacient în parte, iar imaginile își găsesc o încadrare în seria generală
din care fac parte (radiografii, raze care au fost realizate pe aceeași zonă de interes). Pentru
prelucrări suplimentare ulterioare, numele pacientului, spațierea dintre pixeli și dimensiunea
imaginii sunt stocate în fișiere text, într-o nouă structură arborescentă, similară cu cea realizată
pentru păstrarea imaginilor ( Figura 2.6).
16
Figura 2.5: Structurarea arborescentă a imaginilor extrase din setul de date
introdus de utilizator

Capitolul 2. Prelucrarea seturilor de date
O dată parcurs întreg directorul ales de utilizator în scopul extragerii datelor și stocării
acestora, urmează etapa de realizare a unei metode de vizualizare a acestora. Pe parcursul
procesării datelor în etapele anterioare, în paralel, sunt utilizate doua comboBox-uri ( Figura 2.7)
oferite de clasa QcomboBox1, din cadrul framework-ului Qt, pentru a încărca seturile de date care se
doresc a fi selectate. Primul este folosit pentru a încărca numele tuturor pacienților care au fost detectați, iar al
doilea pentru a evidenția grupurile de serii regăsite. Utilizatorul poate selecta pacientul dorit și grupul de serii pe
care dorește să îl analizeze. După efectuarea acestor pași, a fost utilizată clasa QscrollArea (specifică Qt) pentru a
crea o fereastră de vizualizarea pentru imaginile care se încadrează în acel grup de serii încărcat. Selectarea unei
valori din combobox presupune realizarea unei căutări a directorului părinte cu numele pacientului, apoi a
directorului fiu cu numărul seriei și încărcarea în zona de vizualizarea a tuturor imaginilor regăsite.
Procesul de încărcare a setului de imagini este realizat într-o manieră mai elaborată.
Pentru fiecare imagine găsită în director este creat câte un buton la care este atașat drept fundal
imaginei pentru care a fost creat. S-a abordat principiul ca utilizatorul să poată vizualiza
informații despre imaginea dorită (informațiile despre pacient într-un tabel, iar imaginea propriu-
zisă într-o zonă specifică încărcării unei imagini numite QPixmap) prin apăsare butonului
corespondent. Pentru a se putea identifica care instanță a fost apelată de utilizator, au fost
conectate la butoane semnale de tipul QsignalMapper, prin intermediul cărora să se identifice
obiectele care au fost apelate. Această clasă colectează un set de semnale fără parametri și le re-
emite cu parametri întregi, șir sau widget corespunzători obiectului care a trimis semnalul.
1 Un combobox este un widget de selecție care afișează elementul curent și listă de elemente selectabile. Un
combobox poate fi editabil, permițând utilizatorului să modifice fiecare element din listă.
17
Figura 2.6: Exemplu de fișier text care stochează datele suplimentare pentru
prelucrări ulterioare
Figura 2.7: Ilustrarea combobox-urilor utilizate pentru
selectarea datelor care se doresc a fi încărcate

Ioana Abăcioaiei
În acest caz au fost necesare atribuiri de semnale care să returneze numele pacientului,
seria de identificare a fișierului, precum și alte informații.
QPushButton*button = new QpushButton(QString::number(counterButton));
QSignalMapper *signalFolderName;
QSignalMapper *signalFileName;
QSignalMapper *signalPacientName;
signalFolderName = new QSignalMapper;
signalFolderName->setMapping(button, mFolderName);
connect(button, SIGNAL(clicked(bool)), (signalFolderName), SLOT(map()));
connect((signalFolderName), SIGNAL(mapped(QString)), this,
SLOT(onClickPathSeries( QString)));
Clasa acceptă maparea anumitor șiruri sau numere întregi cu diferite obiecte
folosind setMapping(). Semnalele1 obiectelor pot fi apoi conectate la sloturi prin metoda map()
care va emite semnalul mapat cu șirul sau întregul asociat.
Prin intermediul acestei implementări ( Figura 2.8), utilizatorul poate naviga rapid printre
seturile de imagini asociate unei serii. Prin apăsarea pe imaginea dorită, este încărcat conținutul
acesteia într-o fereastră în partea stângă a interfeței, iar prin intermediul tabelelor, vor fi
evidențiate informații despre pacient și structura actuală a imaginii.
1 Semnalele și sloturile sunt utilizate pentru comunicarea între obiecte. Mecanismul semnalelor și sloturilor este o
caracteristică centrală a Qt-ului și probabil partea care diferă cel mai mult de caracteristicile oferite de alte
framework-uri.
18
Figura 2.8: Modul de încărcare a datelor extrase prin intermediu interfeței cu utilizatorul

Capitolul 3. Implementare
Capitolul 3. Implementare
În figura 3.1 sunt numerotate funcționalitățile pe care le oferă aplicația la interacțiunea cu
utilizatorul.
(1)Butonul File permite încărcarea unui set de fișiere aflat sub format DICOM, care se
dorește a fi prelucrat;
(2)Selectarea numelui unui pacient care a fost identificat în setul de date și a unei serii cu
grupul de imagini dorit;
(3)Încărcarea unei imagini în zona de vizualizare din grupul de imagini selectat la numărul
(2);
(4)Aplicarea unei funcții de transfer imaginii (obținerea versiunii color a imaginii);
(5)Opțiuni de desenare și efectuare măsurători pe suprafața imaginii:
◦buton cu pictograma ce ilustrează o linie – activare opțiune de trasare linie și
măsurare distanță dintre două puncte;
◦buton cu pictogramă ce ilustrează un X – activare opțiune de ștergere linie trasată prin
apăsarea click stânga pe suprafața ei;
◦buton cu pictogramă ce ilustrează un creion – activare opțiune redimensionare linie
prin apăsarea pe unul dintre capetele ce o determină;
◦„Set line color”, „Set point color”, „Set text color” – setarea culorii liniei, punctelor
capetelor și a textului în momentul trasării unei măsurători.
(6)Posibilitatea de oscilare între varianta originală și cea color a imaginii;
(7)Vizualizarea unor date extrase din fișiere, corespondente imaginii selectate, cum ar fi:
numele pacientului, dimensiunea imaginii originale, dimensiunea imaginii curente,
coordonatele curente ale mouse-ului pe suprafața imaginii.
19
Figura 3.1: Numerotare operații disponibile în cadrul interfeței

Ioana Abăcioaiei
3.1. Proiectarea software a aplicației
Aplicația poate fi utilizata în mai multe moduri, acestea fiind reprezentate în următoarea
diagramă de cazuri de utilizare (Use Case Diagram):
În diagrama Use Case am întâlnit folosite descrieri ale acțiunilor din perspectiva
actorului: deschide aplicația, selectează o imagine, redimensionează imaginea, etc.
Soluția software a fost structurată pe baza a 4 clase, în dependență de modulele funcționale
abordate:
•DicomViewer
◦implementează clasa QmainWindow (specifică Qt), cea care permite construirea
interfeței cu utilizator a aplicației;
◦conține funcțiile de tip slot, cele apelate ca rezultat al interacțiunii utilizatorului cu
interfața (de exemplu, la apăsarea unui buton, se trimite un semnal care are drept
corespondent executarea funcției de tip slot care îi este atribuită). Semnalele și slot-
urile sunt utilizate pentru interacțiunea dintre obiectele interfeței.
◦exemple de operații:
▪încărcarea setului de date dorit și procesarea acestuia în scopul extragerii
imaginilor și a datelor despre pacient;
▪selectarea setului de date dorit;
▪activare opțiuni de desenare și efectuarea acestora;
▪colorarea imaginii selectate cu nivelul de culori dorit;
▪oscilarea între diferitele versiuni ale imaginii: varianta originală/varianta color
20
Figura 3.2: Diagrama de cazuri de utilizare a aplicației

Capitolul 3. Implementare
determinată.
•DcmInformation
◦conține variabile și metode în scopul extragerii datelor despre pacient: numele
acestuia, seria de identificare a imaginii și cea a grupului din care face parte, precum
și alte informații secundare necesare prelucrării datelor, urmând ca acestea să fie
preluate de clasa DicomViewer în scopul utilizării lor.
•ImageProcessing
◦este specializată în scopul extragerii și a prelucrării imaginilor stocate de fișierele
DICOM;
◦conține metode ce determină procese precum: salvarea/ștergerea seturilor de date
originale și modificate;
◦DicomViewer folosește metodele din ImageProcessing în scopul actualizării scrierii și
actualizării datelor.
•LineOption
◦contribuie la determinarea unor criterii pe baza cărora se efectuează procesele de
desenare din cadrul clasei DicomViewer.
Spre exemplificare, vizualizați Figura 1 din Anexa 5. , cea care conține diagrama de clase
corespondentă aplicației.
3.2. Aplicarea unei funcții de transfer
Imaginile în tonuri de gri (grayscale) dețin o gamă de nuanțe monocrom (gri), variind de
la alb la negru. Nuanțele de gri conțin numai informații despre luminozitate și nu despre culoare,
de aceea luminozitatea maximă este alb, iar cea minimă este negru. Grayscale este, de asemenea,
cunoscut sub numele de acromatic. Cel mai obișnuit format de pixeli este byte-ul, unde această
valoare este stocată ca număr întreg pe 8 biți, oferind o gamă de valori posibile de la 0 la 255.
Zero este considerat negru și 255 este considerat alb. Valorile între ele alcătuiesc diferite nuanțe
de gri.

După cum s-a discutat în primul capitol, în procesul de extragere a imaginilor, acestea
sunt salvate sub format RGB, adică sunt create trei canale de culori (roșu, verde, albastru), caz în
care toate trei vor avea aceeași valoare, cea dată de luminozitatea pixelului corespondent
imaginii grayscale. Au fost procesate și imagini care erau deja sub format RGB, în cazul lor, cele
trei canale pot avea valori diferite (0-255), în funcție de nuanța color pe care trebuie să o
determine.
3.2.1. Principii aplicate și rezultate obținute
Procesul de colorare presupune schimbarea valorilor celor trei canale de culori ce
alcătuiesc pixelii corespondenți. În acest scop a fost creată o imagine de tip gradient care
ilustrează nuanțele intermediare aflate între 6 culori de bază alese (alb, galben, mov, albastru,
verde, negru). Spre exemplificare considerăm gradientul din Figura 3.3, creat utilizând opțiunile
oferite de Microsoft PowerPoint 2010. Acesta conține 256 de pixeli pe orizontală (număr care
corespunde celor 256 de valori pe care le pot lua pixelii cu o adâncime de 8 biți) și 1 pixel pe
verticală, suficient pentru a putea prelua valoarea.
21
Figura 3.3: Imagine de tip gradient de
culori

Ioana Abăcioaiei
Imaginea originală este parcursă pixel cu pixel, unde valorile acestora vor fi înlocuite cu
cele ale pixelilor identificați la pozițiile date de valorile pixelilor din imaginea originală.
Considerăm spre analiză Figura 3.4. Aceasta ilustrează o secțiune dintr-o imagine, precum și
modul în care se alege setarea valorilor pixelilor în scopul obținerii versiunii color a șablonului
dat ca intrare.
Etape efectuate pentru atribuirea noii valori unui singur pixel:
•extragerea valorii pixelului (considerăm notația „pixelVal”);
•căutarea valorii pixel-ului color corespondent poziției dat de pixelVal (considerăm
notația „colorPixelVal”);
•setarea lui pixelVal cu noua valoare obținută de colorPixelVal.
Este de precizat faptul că pentru valoarea lui pixelVal este considerată doar valoarea de pe
canalul de culoare 0 (R), iar setarea noii valori a lui pixelVal presupune actualizarea tuturor celor
3 canale (R, G, B) cu valorile extrase din cele oferite de colorPixelVal.
În cadrul aplicației, utilizatorul beneficiază de opțiuni de selectare a valorilor de minim și
maxim cu care urmează a fi colorată imaginea. Acest lucru constă în faptul că, o dată selectată o
valoare de minim, toți pixelii cu o valoare mai mare ca aceasta vor prelua valoarea minimă, iar la
setarea unei valori maxime, toți pixelii cu valori mai mari vor prelua maximul înregistrat. Se
precizează faptul că asocierea valorilor minimelor și maximelor s-a realizat conform regulilor
precizate (luminozitate maximă asociată nuanței alb (255), luminozitate minimă – negru (0)).
Exemple de colorări realizate la diferite valori ale minimelor și maximelor selectate:
22
Figura 3.4: Setarea valorilor pixelilor în scopul obținerii variantei color a unei imagini

Capitolul 3. Implementare
În scopul realizării acestor operații a fost implementată metoda:
void DicomViewer::SetColorImage( Mat img, Mat &img_color, int flag);
Aceasta este disponibilă în Anexa 2.
În cadrul interfeței s-au utilizat obiecte de tipul Qslider pentru a oferi utilizatorului opțiunea de a
realiza setarea culorilor în timpi reali. Slider-ele create apelează metode de tip slot care realizează operațiile
specificate mai sus. Pentru a se obține o viteză remarcabilă la mișcarea slider-ului și la schimbarea culorilor
imaginii, s-a optat pentru următoarele soluții:
•cât timp utilizatorul ține slider-ul apăsat și îl mișcă spre diferite intensități, se realizează o
redimensionare a imaginii la 150×150 pixeli, apoi se începe parcurgerea acesteia în scopul setării
valorilor pixelilor cu noile valori color . S-a optat pentru această redimensionare pentru a micșora
timpul necesar parcurgerii datelor (original, imaginile au dimensiuni cuprinse intre 250 și 1000
de pixeli). Chiar dacă utilizatorul vede schimbările color realizându-se într-un mediu ușor
încețoșat, etapa următoare va aduce în evidență îmbunătățirea calității;
•după ce utilizatorul nu mai ține slider-ul apăsat, se realizează o colorare finală a imaginii la
dimensiunile ei originale pentru a păstra calitatea pixelilor, adică rezoluția imaginii.
•S-a ales introducerea unui timer pentru a crește viteza de procesare a datelor. În acest scop,
imaginea este parcursă și colorată la interval de 10 milisecunde.
În cazul în care procesul de colorare a mai fost efectuat în trecut asupra imaginii, la selectarea acesteia va fi
încărcată ultima variantă color determinată de utilizator, precum și varianta originală. Acest lucru va fi ilustrat prin
intermediul a două checkbox-uri între care se va putea oscila în funcție de preferințele pe care la are utilizatorul în
acel moment.
23
Figura 3.6: Imagine color
realizată cu valorile: minim:
255, maxim: 0
Figura 3.5: Imagine color
realizată cu valorile: minim:
66, maxim: 0
Figura 3.7: Imagine color
realizată cu valorile: minim:
194, maxim: 24
Figura 3.8: Posibilitatea de oscilare între varianta
originală a imaginii și cea color existentă sau creată în
sesiunea curentă

Ioana Abăcioaiei
3.2.2. Beneficii
Prin colorarea unei anumite zone de interes a unei imagini medicale, pot fi identificate
diferite anomalii, precum: tumori, acumulări de sânge, fracturi ale oaselor, sau perturbații ale
circulației intravenoase. Astfel, personalul autorizat poate detecta problemele cu care se
confruntă pacientul. Aceste zone afectate ies în evidență printr-o colorație diferită față de cea
preponderentă în zona în care se află. Considerăm spre analiză Figura 3.9. [10]
În setul de fișiere DICOM utilizate drept test pentru funcționalitatea aplicației, nu au fost
tratate cazuri cu anomalii severe, dar putem considera spre analiză un caz care ilustrează mici
perturbații ale colonului unui pacient ( Figura 3.10).
Majoritatea testelor au fost realizate pe seturi de date preluate din [11].
3.3. Redimensionarea setului de date
În scopul vizualizării a cât mai multe detalii conținute de imaginea extrasă, a fost
implementată opțiunea de redimensionare a acesteia, utilizând butonul de scroll al mouse-ului.
Acest procedeu constă în faptul că la rotirea în față a butonului, se realizează o mărire a imaginii
cu 20 de pixeli, iar la o rotire înapoi, o micșorare cu aceeași valoare. S-a impus ca dimensiunea
maximă la care poate ajunge o imagine să fie 650×650 pixeli, iar minim 65, fiind restricționate
de dimensiunile la care a fost realizată interfața grafică. Se are în vedere actualizarea dimensiunii
24
Figura 3.9: Tumoră canceroasă aflată la nivelul creierului (preluată din [10])
Figura 3.10: Mici leziuni ale colonului ilustrate prin procedeul de
colorare al razei

Capitolul 3. Implementare
imaginii cu ce aleasă de utilizator pentru orice operație pe care dorește să o efectueze.
S-a utilizat clasa QwheelEvent specifică Qt, care conține parametri care descriu un eveniment
specific scroll-ului mouse-ului.
3.4. Operații grafice la nivelul imaginilor
În cazul unui proces chirurgical sau a oricărei operațiuni precise efectuate asupra
organelor corpului uman, este important a se cunoaște dimensiunile ariei pe care se va realiza. În
acest sens, aplicația oferă posibilitatea trasării (prin intermediul mouse-ului) a unor linii care
calculează distanța în milimetri dintre două puncte de interes selectate de utilizator. În cazul unor
posibile erori de trasare, există posibilitatea ștergerii, sau a redimensionării traiectoriilor
determinate.
3.4.1. Măsurători
Prin apăsarea butonului a cărui pictogramă este o linie se activează opțiunea de trasare a
liniilor pe suprafața imaginii. Utilizatorul începe operațiunea prin apăsarea butonului click stânga
a mouse-ului și menținerea lui apăsată. Linia începe a se trasa pe parcurs ce acesta mișcă
cursorul pe direcția dorită. Procedeul se finalizează o dată cu eliberarea butonului.
Spre exemplificarea procedeului de trasare a traiectoriilor, considerăm datele prezentate în
Tabelul 3.1.
Tabelul 3.1: Evenimente asociate în scopul trasării liniilor
Clase specifice Qt
utilizateMetode apelate la efectuarea
unui evenimentRezultate obținute
QmouseEvent
•conține parametrii
ce descriu
evenimentele care
pot fi determinate
de un mouse;void
DicomViewer::mousePre
ssEvent(QMouseEvent*
event);La apăsarea butonului stâng al
mouse-ului pe suprafața imaginii se
salvează coordonatele pixel-ului. În
paralel, este apelată metoda
paintEvent care începe trasarea unei
linii de la punctul salvat până la
coordonata actuală la care se află
mouse-ul. Această metodă se
apelează în continuu până la
eliberarea butonului.
void
DicomViewer::mouseMov
eEvent(QMouseEvent*
event);Contorizează coordonatele la care se
află mouse-ul în procedeul de
mișcare.
25

Ioana Abăcioaiei
void
DicomViewer::mouseRel
easeEvent(QMouseEvent
*event);Eveniment asociat eliberării
butonului stâng. Salvarea
coordonatelor celui de-al doilea
punct.
QpaintEvent
•conține
evenimente
specifice
procedeului de
desenare.void
DicomViewer::paintEve
nt(QPaintEvent
*event);Responsabilă cu trasarea permanentă/
dinamică a liniei dintre punctul inițial
determinat și cel final.
După efectuarea acestor pași, se obține o linie trasată între cele două puncte de interes.
Măsurarea distanței parcurse dintre cele două coordonate determinate, presupune
aplicarea formulei distanței dintre două puncte, rezultatul urmând a fi înmulțit cu valoarea
spațierii dintre pixelii imaginii (valoare extrasă din fișierul DICOM în procesul intermediar de
prelucrare a datelor). Se va avea în considerare dacă asupra imaginii au avut loc procedee de
redimensionare de către utilizator, în acest sens, se va realiza o scalare astfel încât măsurătoarea
obținută să fie aceeași cu cea care s-ar fi obținut în cazul imaginii originale.
Etape:
1)Determinarea pozițiilor punctelor între care se trasează linia. Acestea corespund
coordonatelor pixelilor pe care s-a dat click în cadrul imaginii. Spre exemplificare,
considerăm Figura 3.11.
2)Aplicarea formulei distanței dintre două puncte, scalarea pe traiectoriile x și y, înmulțirea
cu valoarea spațierii dintre pixeli și transformarea în milimetri.
Considerăm punctele determinate sub forma:
A(xA,yB);B(xB,yB) (4)
•Calculăm distanța dintre puncte pe traiectoriile x și y și le înmulțim cu spațierea dintre
pixeli extrasă:
26
Figura 3.11: Coordonatele punctelor rezultate după
trasarea unei linii

Capitolul 3. Implementare
distanțax=(xB−xA)∗spațierePixelix;distanțay=(yB−yA)∗spațierePixeliy.(5)
•În cazul în care imaginea actuală a suferit redimensionări, se calculează factorul de
scalare cu care s-au efectuat modificările:
factordescalare=dimensiuneimagineactuală
dimensiuneimaginelamomentuldesenării; (6)
•Se împart distanțele determinate în formula (5) la factorul de scalare din formula (6).
distanțaxactualizată=distanțax
factordescalare;distanțayactualizată=distanțay
factordescalare;(7)
•Determinarea distanței în pixeli:
distanță=√distanțaxactualizată∗distanțaxactualizată
+distanțayactualizată∗distanțaxactualizată;(8)
•Transformarea în milimetri. Se consideră valoarea standard de asociere a dimensiunii
unui pixel cu valoare de 0.264583333 milimetri.
distanță=distanță∗0.264583333 (9)
Spre exemplificarea scalării dimensiunilor în funcție de dimensiunea imaginii, considerăm
următoarele cazuri:
27
Figura 3.12: Măsurătoare efectuată la dimensiunea
512 x512 a imaginii
Figura 3.13: Măsurătoare efectuată la dimensiunea
632×632 a imaginii

Ioana Abăcioaiei
La trasarea uni noi linii, cele vechi sunt retrasate (ținând cont de scala la care se află în
acel moment imaginea) prin parsarea unui fișier xml existent, aspecte care vor fi detaliate în sub-
capitolul 3.4.2.
Înainte ca utilizatorul să înceapă efectuarea propriu-zisă a trasării unei linii, acesta își
poate seta culorile pe care dorește să le folosească pentru linie, capetele liniei și dimensiunea
calculată. În acest sens, sunt puse la dispoziție trei combobox-uri care cuprind majoritatea
culorilor utilizate.
3.4.2. Salvarea operațiilor efectuate
O dată cu trasarea unor măsurători, la o reîncărcare ulterioară a aceluiași set de date, se
pierd vechile operații. În acest sens s-a optat pentru salvarea coordonatelor punctelor între care se
efectuează măsurătoarea, dimensiunea imaginii la momentul trasării și aspecte referitoare la
culorile folosite pentru desenare. Astfel încât, la o redeschidere a unor fișiere deja prelucrate, să
apară vechile modificări realizate de utilizator. Este un beneficiu direct adus utilizatorului
aplicației.
În acest scop a fost utilizată biblioteca TinyXml, cea care conține funcții ce facilitează
operații precum crearea de fișiere XML, inserarea elementelor, actualizarea sau ștergerea
acestora. Astfel, după efectuarea procesului de trasare a unei linii, separat sunt urmați alți
pași pentru stocarea informațiilor care permit retrasarea unei linii identice cu cea deja
realizată.
Considerăm spre analiză etapele creării unui fișier XML cu datele necesare,
ilustrate în tabelul 3.2.
28
Figura 3.14: Opțiuni de selectare
culori

Capitolul 3. Implementare
Tabelul 3.2: Etape efectuate în procesul de salvare a informațiilor necesare trasării liniilor
Etapă Structurare obținută
1) Verificarea dacă există în structura de
directoare, fișierul xml cu numărul seriei
imaginii curente pe care s-au realizat operații de
măsurare. Dacă nu există, se trece la pasul 2). În
caz contrar, se trece la pasul 3).
2) Se creează un fișier cu extensia .xml, având
versiunea 1.0, care acceptă utilizarea directă a
aproape oricărui caracter. Se deschide tag-ul
<Lines> pentru introducerea obiectelor de tip
<Line><?xml version="1.0" ?>
<Lines>
</Lines>
3) Se preiau informațiile referitoare la aspectele
care determină linia trasată și se creează un tag
numit <Line>. Acesta v-a conține un set de
elemente, precum:
•coordonatele liniei;
•dimensiunea imaginii la momentul
trasării;
•distanța dintre puncte;
•culorile utilizate.
Pentru fiecare măsurătoare efectuată, este
adăugat câte un nou tag în fișierul corespondent
imaginii pe care se face modificări.<?xml version="1.0" ?>
<Lines>
<!– Settings for MyApp –>
<Line>
<Point1x>113</Point1x>
<Point1y>78</Point1y>
<Point2x>341</Point2x>
<Point2y>421</Point2y>
<H>476</H>
<W>476</W>

<Distance>61.468360</Distance>

<LineColor>aliceblue</LineColor>

<PointColor>aliceblue</PointColor>

<TextColor>aliceblue</TextColor>
</Line>
</Lines>
Fișierele rezultate vor avea ca denumire seria imaginilor pentru care au fost create.
Ele vor fi stocate tot sub forma unei structuri arborescente, la fel cum a fost utilizată și în
cazu extragerii imaginilor. Această abordare facilitează găsirea mai rapidă a informațiilor
de care este nevoie, în funcție de selecțiile utilizatorului. Vizualizați Anexa 3. pentru
vizualizarea codului sursă specializat în salvarea datelor în format XML.
3.4.3. Redimensionări
Prin apăsarea butonului a cărui pictogramă este un creion, este activată
funcționalitatea pentru redimensionarea unei măsurători deja efectuate. Procesul constă în
29

Ioana Abăcioaiei
apăsarea prin intermediul mouse-ului a capătului liniei care se dorește a fi
redimensionată, menținerea butonului click stânga și mișcarea cursorului pe direcția pe
care se dorește a fi efectuat procesul. În acest timp, capătul preluat se mișcă pe direcția
dată de utilizator, iar celălalt capăt rămâne fixat. La eliberarea butonului, obținem o
retrasare a liniei. Trebuie avut în vedere intervalul de culori selectat în momentul
efectuării unei redimensionări, deoarece vor fi preluate seturile de culori selectate la
momentul curent.
•Pași efectuați:
◦activarea opțiunii de redimensionare prin apăsarea butonului corespondent;
◦apăsarea pe capătul liniei care se dorește a fi redimensionată. Se verifică dacă
coordonatele punctului determinat se află printre vecinii unui punct deja
existent în fișierul xml aferent imaginii pe care se efectuează modificări
(distanță de maxim 7 pixeli între ei). Dacă este găsit, este activată opțiunea de
redimensionare, urmând ca la eliberarea butonului, să fie actualizate
coordonatele punctului din fișierul xml cu noile date determinate, incluzând
culorile folosite și dimensiunea imaginii la care se efectuează modificările. În
cazul în acre nu este găsit un punct în fișierul xml față de care să fie distanța de
maxim 7 pixeli, utilizatorul trebuie sa reîncerce operația prin apăsarea
butonului click într-o zonă mai apropiată de capătul muchiei. Retrasarea liniei
urmărește aceleași procedee ca la trasările efectuate în 3.4.1;
◦de fiecare dată, la finalizarea unei operații, este retrasat tot setul de date din
fișierul xml pentru a se evidenția în timpi reali modificările realizate.
3.4.4. Ștergerea operațiilor preexistente
Prin apăsarea butonului a cărui pictogramă este un X, este activată opțiunea de ștergere a
unei măsurători efectuate pe suprafața imaginii. Acestă operațiune presupune dispariția grafică a
liniei din câmpul vizual și a ștergerii oricăror referințe existente la ea în fișierele xml în care a
fost stocată.
•Pași efectuați:
◦activare opțiune de ștergere prin apăsarea butonului;
◦apăsarea de către utilizator, prin intermediul mouse-ului, pe suprafața liniei care se
dorește a fi ștearsă (orice punct determinat care se află la o distanță maximă de 7 pixeli
fată de dreaptă).
◦pentru fiecare linie trasată existentă pe suprafața imaginii se determină ecuația dreptei și
dacă distanța de la punctul la care s-a dat click, până la dreaptă, este mai mică de 10
pixeli. Dacă se găsește un astfel de caz, va fi ștearsă linia care îndeplinește criteriile din
fișierul xml. După ștergerea tag-ului aferent liniei identificate, vor fi retrasate toate liniile
existente pentru a se ilustra modificările în timpi reali. În acest scop, a fost creată metoda
ParseXMLFile, disponibilă în Anexa 4. .
•Formule și criterii aplicate:
30

Capitolul 3. Implementare
▪Ecuația unei drepte AB:y−yA
x−xA=yB−yA
xB−xA, utilizată pentru orice set de
date din fișierul xml;(10)
•Ecuația dreptei, rezultate după calcule suplimentare :
dAB:a∗x+b∗y+c=0, unde a, b ,c sunt coeficienții ecuației;(11)
•Fie M(xM,yM)punctul determinat de utilizator prin apăsarea pe
suprafața liniei;(12)
•Se determină distanța de la punctul M la dreapta AB, utilizând:
distanța=|a∗xM+b∗yM+c|
√a2+b2. (13)
31

Ioana Abăcioaiei
Concluzii
Proiectarea aplicației de analiză și prelucrare a imaginilor medicale are drept scop
îmbunătățirea metodelor aplicate în procesul de diagnosticare și tratare a bolilor cu care se
confruntă atât oamenii, cât și animalele. Fundamentele teoretice expuse au constituit baza de la care s-a
pornit în realizarea acestui proiect, precum și necesitățile pe care le au prelucrările suplimentare ale fișierelor
stocate sub format DICOM.
Studiile prealabile realizate pe modul de stocare a datelor medicale au arătat faptul că necesitatea
existenței unei astfel de aplicații este destul de mare în cadrul imagisticii medicale. În acest sens, au fost
selectate spre a fi implementate operațiile care s-au dovedit ca au fost cele mai utilizate în cadrul aplicațiilor
deja utilizate în centrele medicale. Extragerea datelor, stocarea lor arborescentă pentru prelucrări ulterioare
și maniera de oferire spre vizualizare a acestora, pun bazele unei accesibilități foarte bune pentru utilizator.
S-a remarcat faptul că procedeul de colorare al imaginilor în funcție de anumite intervale ale
culorilor este implementat și utilizat cu succes în majoritatea aplicațiilor existente. Astfel, s-a optat pentru
eficientizarea acestui procedeu, o implementare diferită, care oferă posibilitatea unei colorări dinamice în
funcție de minimele și maximele culorilor identificate în imaginea originală. Utilizatorul poate vedea în
timpi reali modificările culorilor pixelilor în funcție de intervalul de nuanțe selectat. Întreg procesul de
vizualizare se realizează în timp real, fără întârzieri sau blocaje. Acestă operațiune contribuie la identificarea
apariției unor posibile patologii, cum ar fi tumori sau fisuri ale unor oase, apariția unor leziuni sau a altor
anomalii. Acest aspecte fiind ilustrate de diferențele considerabile de culori care apar pe anumite intervale
ale imaginii. Opțiunile de măsurare a zonelor de interes, sau editările unor operații deja existente facilitează
stabilirea unor traiectorii a unor posibile intervenții chirurgicale, detectarea măririi unor organe sau a unor
tumori deja existente. În ansamblu, precizia unor măsurători este importantă pentru a cunoaște dificultățile
pe care le poate avea o intervenție.
Testarea unor diferite cazuri de utilizare a opțiunilor oferite în cadrul interfeței ilustrează validitatea
implementărilor și gradul ridicat de utilizare pe care îl pot avea. Timpii de răspuns la operațiile pe care le
poate efectua utilizatorul sunt normali, fără întârzieri remarcabile. La acest nivel al dezvoltării, toate
opțiunile realizate funcționează corect, putând fi adăugate funcționalități suplimentare. O etapă de testare în
cadrul unui centru medical ar aduce un plus dezvoltării actuale. Ar putea fi identificate posibile erori și
aduse propuneri spre îmbunătățirea modulelor deja existente. Pe lângă acestea, s-ar putea vedea ce alte
module suplimentare s-ar dori a fi adăugate. Îmbunătățiri s-ar putea aduce și din punctul de vedere al
implementării, al scăderii timpilor de răspuns la încărcarea unui director cu un număr mai mare de fișiere
DICOM sau al altor operațiuni.
Scopul principal al aplicației dezvoltate este de a aduce o contribuție la îmbunătățirea ariei de
prelucrare a imaginilor medicale. Chiar dacă există deja aplicații care ajută la prelucrarea setului de date
stocat sub format DICOM, o implementare noua poate aduce noi funcționalități mult mai utile sau le poate
îmbunătăți pe cele deja existente. Astfel, progresul unei arii științifice presupune implementarea a mai
multor prototipuri care să se depășească unul pe celălalt prin funcționalități noi și îmbunătățiri remarcabile.
32

Bibliografie
Bibliografie
[1]Grady Booch, „Object-Oriented Analysis andDesign with Applications (Second Edition) ”, Adisson-
Wesley, 1994.
[2]Lee Zhi Eng, „Hands-On GUI Programmingwith C++ and Qt5 ”, Packt Publishing Ltd, 2018.
[3]The Qt Company, Qt Designer Manual [Online], Disponibil la adresa:
https://doc.qt.io/qt-5/qtdesigner-manual.html, Accesat: .
[4]Shermal Fernando, OpenCV Tutorial C ++ [Online], Disponibil la adresa: https://www.opencv-
srf.com/p/introduction.html, Accesat: 2019.
[5]Box, Box DICOM Viewer [Online], Disponibil la adresa: https://blog.box.com/new-box-for-
healthcare-solution, Accesat: .
[6]Chris Rorden, ezDICOM DICOM viewer [Online], Disponibil la adresa:
https://people.cas.sc.edu/rorden/ezdicom/index.html, Accesat: 2019.
[7]Dandu Ravi Varma, [Online], Disponibil la adresa: http://medind.nic.in/ibn/t12/i1/ibnt12i1p4.htm,
Accesat: 2019.
[8]Sébastien Barré, [Online], Disponibil la adresa: http://barre.nom.fr/medical/samples/, Accesat:
2019.
[9]Tuomas Salste, [Online], Disponibil la adresa:
https://www.aivosto.com/articles/imageformats.html, Accesat: 2019.
[10]Mike Montgomery, [Online], Disponibil la adresa:
https://www.forbes.com/sites/mikemontgomery/2016/12/22/in-cancer-fight-artificial-intelligence-
is-a-smart-move-for-everyone, Accesat: 2019.
[11]Medevel, 20 Free & open source DICOM viewers for Windows [Online], Disponibil la adresa:
https://medevel.com/free-dicom-viewers-for-windows/, Accesat: 2019.
33

Ioana Abăcioaiei
Anexe.
Anexa 1. Cod sursă – extragerea imaginilor stocate sub format DICOM
ImageProcessing.cpp
bool ImageProcessing::ConvertImage_RGB(gdcm:: Image const & gimage, char *buffer,
QImage* &mImageQt)
{
const unsigned int* dimension = gimage.GetDimensions();
unsigned int dimX = dimension[0];
unsigned int dimY = dimension[1];
if (gimage.GetPhotometricInterpretation() ==
gdcm::PhotometricInterpretation ::RGB)
{
if (gimage.GetPixelFormat() != gdcm::PixelFormat::UINT8)
{
return false;
}
unsigned char *ubuffer = (unsigned char*)buffer;
mImageQt = new QImage((unsigned char *)ubuffer, dimX, dimY, 3 * dimX,
QImage::Format_RGB888);
}
else if (gimage.GetPhotometricInterpretation() !=
gdcm::PhotometricInterpretation ::RGB)
{
if (gimage.GetPixelFormat() == gdcm::PixelFormat::UINT8)
{
unsigned char *ubuffer = new unsigned char[dimX*dimY * 3];
unsigned char *pubuffer = ubuffer;
for (unsigned int i = 0; i < dimX*dimY; i++)
{
*pubuffer++ = *buffer;
*pubuffer++ = *buffer;
*pubuffer++ = *buffer++;
}
mImageQt = new QImage(ubuffer, dimX, dimY, QImage::Format_RGB888);
}
else if (gimage.GetPixelFormat() == gdcm::PixelFormat::INT16 ||
gimage.GetPixelFormat() == gdcm::PixelFormat::UINT16)
{
short *buffer16 = (short*)buffer;
unsigned char *ubuffer = new unsigned char[dimX*dimY * 3];
unsigned char *pubuffer = ubuffer;
double max, min, lvl, wind;
max = min = buffer16[0];
for (int i = 1; i < dimX*dimY; i++)
34

Anexe.
{
if (buffer16[i] < min) min = buffer16[i];
if (buffer16[i] > max) max = buffer16[i];
}
lvl = (max – min) / 2;
wind = max – min;
normal(buffer16, pubuffer, wind, min, dimX*dimY);
mImageQt = new QImage(ubuffer, dimX, dimY, QImage::Format_RGB888);
}
else
{
PixelFormat pixelFormat = gimage.GetPixelFormat();
PixelFormat testPixelFormat = gdcm:: PixelFormat::INT16;
std::cout << "Pixel Format is: " << gimage.GetPixelFormat() << std::endl;
return false;
}
}
else
{
return false;
}
return true;
}
void ImageProcessing::normal(short* buffer16, unsigned char* result, double wind,
double min, int size)
{
for (unsigned int i = 0; i < size; i++) {
unsigned char temp = ((*buffer16 – min) / wind) * 255;
*result++ = temp;
*result++ = temp;
*result++ = temp;
buffer16++;
}
}
Anexa 2. Cod sursă – Setarea culorilor pixelilor imaginii
SetColorImage.cpp
void DicomViewer::SetColorImage( Mat img, Mat &img_color, int flag)
{
double minrgb1, minrgb2, minrgb3, maxrgb1, maxrgb2, maxrgb3;
Mat colorPicker_img = imread(mColorPickerImage);
int w, h;
if (flag == 1)
{
h = img.rows;
w = img.cols;
35

Ioana Abăcioaiei
}
else
{
h = 150;
w = 150;
}
cv::cvtColor(colorPicker_img, colorPicker_img, COLOR_BGR2RGB);
cv::resize(img_color, img_color, cv::Size(w, h));
cv::resize(img, img, cv::Size(w, h));
for (int i = 0; i < (int)h; i++)
{
for (int j = 0; j < (int)w; j++)
{
Vec3b& rgb = img.at<Vec3b>(i, j);
Vec3b& rgb_result_image = img_color.at<Vec3b>(i, j);
for (int n = 0; n < 256; n++)
{
Vec3b& rgb_color_picker = colorPicker_img.at< Vec3b>(n, 0);
int pixel_val = rgb [0];
if (pixel_val == n)
{
rgb_result_image = rgb_color_picker;
}
}
}
}
for (int i = 0; i < (int)h; i++)
{
for (int j = 0; j < (int)w; j++)
{
Vec3b& rgb = img.at<Vec3b>(i, j);
Vec3b& rgb_result_image = img_color.at<Vec3b>(i, j);
int pixel_val = rgb [0];
if (pixel_val >= mMinPixelVal)
{
rgb_result_image = colorPicker_img.at< Vec3b>(mMinPixelVal, 0);
}
if (pixel_val <= mMaxPixelVal)
{
rgb_result_image = colorPicker_img.at< Vec3b>(mMaxPixelVal, 0);
}
}
}
cv::resize(img_color, img_color, cv::Size(mW, mH));
mPixMapImage = QPixmap::fromImage(QImage(img_color.data, img_color.cols,
36

Anexe.
img_color.rows, img_color.step, QImage::Format_RGB888));
cv::cvtColor(img_color, img_color, CV_RGB2BGR);
update();
}
Anexa 3. Cod sursă – Salvarea seturilor de date în fișiere .xml
SlotFunctions.cpp
void DicomViewer::mouseReleaseEvent( QMouseEvent *event) {
mMousePressed = false;
TiXmlElement* point1x;
TiXmlElement* point1y;
TiXmlElement* point2x;
TiXmlElement* point2y;
TiXmlElement* distance;
TiXmlElement* hval;
TiXmlElement* wval;
TiXmlElement* lineColor;
TiXmlElement* pointColor;
TiXmlElement* textColor;
int mpoint1x, mpoint1y, mpoint2x, mpoint2y, mh, mw;
QString mlineColor, mpointColor, mtextColor;
double mdistance;
char *mpoint1xc, *mpoint1yc, *mpoint2xc, *mpoint2yc, *h_val, *w_val,
*distance_val, *mline_color, *mpoint_color, *mtext_color;
mpoint1x = mpoint1.x();
mpoint1y = mpoint1.y();
mpoint2x = mpoint2.x();
mpoint2y = mpoint2.y();
mh = mH;
mw = mW;
mdistance = mLineOption.DistanceBetweenTwoPoints(mDcmInfo, mpoint1, mpoint2, mH,
mW);
mpoint1xc = new char[10];
mpoint1yc = new char[10];
mpoint2xc = new char[10];
mpoint2yc = new char[10];
h_val = new char[10];
w_val = new char[10];
distance_val = new char[10];
itoa(mpoint1x, mpoint1xc, 10);
itoa(mpoint1y, mpoint1yc, 10);
37

Ioana Abăcioaiei
itoa(mpoint2x, mpoint2xc, 10);
itoa(mpoint2y, mpoint2yc, 10);
itoa(mh, h_val, 10);
itoa(mw, w_val, 10);
string distanceS = std::to_string(mdistance);
distance_val = strcpy( new char[distanceS.length() + 1], distanceS.c_str());
string line = mLineColorS.toStdString();
mline_color = new char[line.size() + 1];
strcpy(mline_color, line.c_str());
string point = mPointColorS.toStdString();
mpoint_color = new char[point.size() + 1];
strcpy(mpoint_color, point.c_str());
string text = mTextColorS.toStdString();
mtext_color = new char[text.size() + 1];
strcpy(mtext_color, text.c_str());
point1x = new TiXmlElement("Point1x");
point1y = new TiXmlElement("Point1y");
point2x = new TiXmlElement("Point2x");
point2y = new TiXmlElement("Point2y");
hval = new TiXmlElement("H");
wval = new TiXmlElement("W");
distance = new TiXmlElement("Distance");
lineColor = new TiXmlElement("LineColor");
pointColor = new TiXmlElement("PointColor");
textColor = new TiXmlElement("TextColor");
if (mSelectLoadImage == 1)
{
if ((mSelectDrawLine == 2 || (mSelectResizeLine == 1 && mPointFound == 1)))
{
QString path =
QString::fromStdString(mImageProcessing.WriteFileInResources(mPacientFolderName.to
StdString(), mPathSeries.toStdString())) + fileName + ".xml";
TiXmlDocument *doc = new TiXmlDocument(path.toUtf8().data());
if (doc->LoadFile())
{
TiXmlElement *pRoot = doc->RootElement();
TiXmlElement *lines = new TiXmlElement("Lines");
TiXmlElement * msgs = new TiXmlElement("Line");
pRoot->LinkEndChild(msgs);
point1x->LinkEndChild( new TiXmlText(mpoint1xc));
msgs->LinkEndChild(point1x);
38

Anexe.
point1y->LinkEndChild( new TiXmlText(mpoint1yc));
msgs->LinkEndChild(point1y);
point2x->LinkEndChild( new TiXmlText(mpoint2xc));
msgs->LinkEndChild(point2x);
point2y->LinkEndChild( new TiXmlText(mpoint2yc));
msgs->LinkEndChild(point2y);
hval->LinkEndChild( new TiXmlText(h_val));
msgs->LinkEndChild(hval);
wval->LinkEndChild( new TiXmlText(w_val));
msgs->LinkEndChild(wval);
distance->LinkEndChild( new TiXmlText(distance_val));
msgs->LinkEndChild(distance);
lineColor->LinkEndChild( new TiXmlText(mline_color));
msgs->LinkEndChild(lineColor);
pointColor->LinkEndChild( new TiXmlText(mpoint_color));
msgs->LinkEndChild(pointColor);
textColor->LinkEndChild( new TiXmlText(mtext_color));
msgs->LinkEndChild(textColor);
doc->SaveFile(path.toUtf8().data());
}
else
{
TiXmlDeclaration * decl = new TiXmlDeclaration ("1.0", "", "");
doc->LinkEndChild(decl);
TiXmlElement * root = new TiXmlElement("Lines");
doc->LinkEndChild(root);
TiXmlComment * comment = new TiXmlComment();
comment->SetValue( " Settings for MyApp " );
root->LinkEndChild(comment);
TiXmlElement * msgs = new TiXmlElement("Line");
root->LinkEndChild(msgs);
point1x->LinkEndChild( new TiXmlText(mpoint1xc));
msgs->LinkEndChild(point1x);
point1y->LinkEndChild( new TiXmlText(mpoint1yc));
msgs->LinkEndChild(point1y);
39

Ioana Abăcioaiei
point2x->LinkEndChild( new TiXmlText(mpoint2xc));
msgs->LinkEndChild(point2x);
point2y->LinkEndChild( new TiXmlText(mpoint2yc));
msgs->LinkEndChild(point2y);
hval->LinkEndChild( new TiXmlText(h_val));
msgs->LinkEndChild(hval);
wval->LinkEndChild( new TiXmlText(w_val));
msgs->LinkEndChild(wval);
distance->LinkEndChild( new TiXmlText(distance_val));
msgs->LinkEndChild(distance);
lineColor->LinkEndChild( new TiXmlText(mline_color));
msgs->LinkEndChild(lineColor);
pointColor->LinkEndChild( new TiXmlText(mpoint_color));
msgs->LinkEndChild(pointColor);
textColor->LinkEndChild( new TiXmlText(mtext_color));
msgs->LinkEndChild(textColor);
doc->SaveFile(path.toUtf8().data());
}
UpdatePixMap();
}
}
}
Anexa 4. Cod sursă – Actualizarea seturilor de date prin parsarea xml-urilor
existente
void DicomViewer::ParseXMLFile(QString filename)
{
TiXmlDocument doc(filename.toUtf8().data());
sizeLine = 0;
if (doc.LoadFile())
{
TiXmlHandle hDoc(&doc);
TiXmlElement *pRoot, *pParm, *pParm2;
const char *point1x, *point1y, *point2x, *point2y, *wval, *hval, *distance,
40

Anexe.
*linecolor, *pointcolor, *textcolor;
pRoot = doc.FirstChildElement( "Lines");
double sizeM;
//–––––––––––––––––––-
mPainetr.begin(this);
if (550 <= mH && mH <= 650)
{
sizeM = 2;
}
if (450 <= mH && mH < 550)
{
sizeM = 1.5;
}
if (350 <= mH && mH < 450)
{
sizeM = 1;
}
if (250 <= mH && mH < 350)
{
sizeM = 0.7;
}
if (150 <= mH && mH < 250)
{
sizeM = 0.6;
}
if (50 <= mH && mH < 150)
{
sizeM = 0.4;
}
if (pRoot)
{
pParm = pRoot->FirstChildElement( "Line");
while (pParm) {
QLine mLine;
QPainter tempmPainetr(&mPixMapImage);
double distancex, distancey;
point1x = pParm->FirstChildElement( "Point1x")->GetText();
point2x = pParm->FirstChildElement( "Point2x")->GetText();
point1y = pParm->FirstChildElement( "Point1y")->GetText();
point2y = pParm->FirstChildElement( "Point2y")->GetText();
hval = pParm->FirstChildElement( "H")->GetText();
wval = pParm->FirstChildElement( "W")->GetText();
distance = pParm->FirstChildElement( "Distance")->GetText();
41

Ioana Abăcioaiei
linecolor = pParm->FirstChildElement( "LineColor")->GetText();
pointcolor = pParm->FirstChildElement( "PointColor")->GetText();
textcolor = pParm->FirstChildElement( "TextColor")->GetText();
mLine.setP1(QPoint(atof(point1x) – 10, atof(point1y) – 30));
mLine.setP2(QPoint(atof(point2x) – 10, atof(point2y) – 30));
tempmPainetr.begin( this);
tempmPainetr.setPen( QPen(QColor(linecolor), sizeM));
tempmPainetr.scale(( double)(mWInitial / atof(wval)), ( double)
(mHInitial / atof(hval)));
tempmPainetr.drawLine(mLine);
tempmPainetr.setPen( QPen(QColor(pointcolor), sizeM + 1.5));
tempmPainetr.drawPoint( QPoint(atof(point1x) – 10, atof(point1y) –
30));
tempmPainetr.drawPoint( QPoint(atof(point2x) – 10, atof(point2y) –
30));
tempmPainetr.setPen( QPen(QColor(textcolor), sizeM + 2));
tempmPainetr.setFont( QFont("Arial"));
distancex = (QPoint(atof(point1x), atof(point1y)).x() – 10 +
QPoint(atof(point2x), atof(point2y)).x() – 10) / 2;
distancey = (QPoint(atof(point1x), atof(point1y)).y() – 30 +
QPoint(atof(point2x), atof(point2y)).y() – 30) / 2;
tempmPainetr.drawText( QPoint(distancex + 3, distancey + 3),
distance);
tempmPainetr.end();
sizeLine = tempmPainetr.pen().style();
pParm = pParm->NextSiblingElement( "Line");
}
double val = mH / mHInitial;
}
}
mHInitial = mH;
mWInitial = mW;
}
Anexa 5. Diagrama de clase
42

Anexe.
43
Figura 1: Diagrama de clase corespondentă aplicației

Similar Posts