Detectarea Regiunilor Falsificate In Imagini
Detectarea regiunilor falsificate în imagini
Lucrare de dizertație
CUPRINS
PREFAȚĂ ACRONIME
INTRODUCERE
Căutarea exhaustivă
Autocorelația
Block-matching
Block-matching – variantă robustă 11.5. Block-matching – variantă robustă 2
Block-matching – variantă robustă 3
Bicoerența
ALGORITM DE TIP BLOCK-MATCHING
Parametrii algoritmului
Experiment – nF, nD
Experiment – nN
Experiment – suprafață copiată
Rezultate obținute – imagini în tonuri de gri
Falsuri cu suprafață dreptunghiulară
Falsuri cu suprafață elipsoidală
Rezultate obținute – imagini color
ALGORITM BAZAT PE BICOERENȚĂ
Bicoerența asociată unui semnal 1-D
Experiment 1
Experiment 2
3.1.3. Experiment 3
3.1.4. Experiment 4
Bicoerența asociată unui semnal 2-D
Experiment 1
Experiment 2
Experiment 3
CONCLUZII
ANEXA A. Cod algoritm de tip block-matching
ANEXA B. Cod algoritm bazat pe bicoerență
BIBLIOGRAFIE
PREFAȚĂ
De-a lungul timpului oamenii s-au folosit de diferite medii de transmisie pentru a întreține sau influența acele obiceiuri pe care le considerau importante. Astfel, putem aminti aborigenii din Australia de Nord, care prin intermediul picturilor abstracte, a cântecelor ritmice si poveștilor, au putut dezvolta un soi de manual pentru supraviețuire într-un ținut deosebit de ostil. Un exemplu demn de a fi menționat din istoria Europei este mozaicul descoperit în Pompei, păstrat datorită cenușei depuse în urma exploziei din 79 d.C., ce îl întruchipează pe Alexandru Macedon încrezător și viteaz, apogeul culturii elene, în timp ce Darius, regele Persiei, este cuprins de frică la vederea armatei grecești (figura 1). Cu toate acestea, nu se poate spune care a fost adevărata stare de spirit a celor doi conducători. Viziunea care, totuși, a rămas în istorie este aceea care s-a dorit a fi păstrată și folosită ulterior de cei care au dorit asocierea propriei imagini cu cea de cuceritor a lui Alexandru cel Mare. Se poate spune că astfel s-a obținut falsificarea voită a unor evenimente. Un caz foarte cunoscut de falsificare a imaginilor provine de pe vremea Uniunii Sovietice. O serie de imagini cu Lenin și Stalin, care cuprindeau și alte personaje ce, ulterior, nu au mai fost agreate de regimurile politice – cum ar fi, spre exemplu Leon Troțky – au fost prelucrate iar personajele „negative” au dispărut din imagini (figura 2).
Figura 1. Mozaic pompeian întruchipând bătălia de la Gaugamela
Figura 2. Stânga: Lenin și Troțki în mulțime. Dreapta: Imaginea falsificată, fără Troțki
Deși tehnologia s-a schimbat considerabil și a permis virtualizarea completă a unei scene, influențabilitatea oamenilor a rămas aceeași în fața unei imagini. Singurul lucru care s-a schimbat este accesul aproape universal la resurse performante de achiziție a imaginilor și de editare a lor, ceea ce a dus în mod inevitabil la proliferarea imaginilor false, indiferent de intenția cu care au fost realizate. De aceea, mai ales în mediul juridic, a apărut nevoia de a putea discrimina falsurile de imaginile autentice care sunt copii fidele ale imaginilor originale. Acest proces se bazează pe o analiză oarbă – în lipsa originalului – și presupune evidențierea urmelor lăsate de diverse editări. Această lucrare are ca obiect de studiu metode ce permit detecția, dacă nu a zonelor duplicate sau editate, atunci a imaginilor ce conțin zone suspectate de a fi trecut prin astfel de procese.
ACRONIME
DCT = transformata cosinus discretă (Discrete Cosine Transform);
JPEG = joint photographic experts eroup, standard de compresie a imaginilor;
L*a*b*= referire la standardul pentru spațiul de culoare CIE 1976 (L*, a*, b*);
PCA = Analiza pe Componente Principale;
RGB = Modelul cromatic roșu-verde-albastru (Red-Green-Blue);
YCbCr = familie de spații de culoare.
1. INTRODUCERE
Trucarea prin duplicare poate fi definită ca procesul prin care o parte dintr-o imagine este copiată si lipită într-o altă parte a aceleiași imagini. Această operație este caracterizată de intenția de a ascunde sau de a introduce una sau mai multe entități – obiecte sau persoane – prezente în acel context.
Această definiție este foarte importantă pentru a putea face diferența dintre un fals ce conține o regiune duplicată și o imagine care a fost prelucrată, ca parte integrantă a procesului de detecție a regiunilor duplicate.
„Având o imagine f(x,y) există câteva condiții pe care imaginea falsificată f '(x , y) le va respecta. Există două mulțimi D1 , D2 , ce aparțin lui D – vezi figura 1.1 – și d = (dx,dy), vectorul de deplasare dintre cele două mulțimi. S-a observat că în imaginile naturale în care nu sunt prezente suprafețe mari de textură fină, este neobișnuit să se regăsească două regiuni asemănătoare care să reprezinte mai mult de 0.85% din suprafața totală a imaginii. În acest caz, dacă ∣D1∣=∣D2∣>∣D∣∗0.85 și ∣d∣>L atunci avem două cazuri:
f ' ( x , y)= f ( x−dx , y−dy) dacă (x , y)∈D2 ;
f '(x , y)= f (x , y) dacă (x , y)∉D2 ,
unde D1 , regiunea sursă sursa iar D2 , regiunea destinație, D2=D1+d .
Figura 1.1. Două regiuni D1 , D2 ,asemănătoare și vectorul de deplasare d⃗ [1 p.1]
Procesul de falsificare a unei imagini, indiferent de scopul său, adeseori implică operațiuni de post-procesare care îngreunează considerabil procesul de recunoaștere a regiunilor duplicate. Imaginea falsificată f '(x , y) devine f ' '(x , y)=Θ( f '(x , y)) ,unde Θ reprezintă operatorul de post-procesare, cum ar fi compresia cu pierderi de tip JPEG sau adăugarea de zgomot.” [1 p.1]
Orice trucare ce implică duplicarea regiunilor în cadrul unei imagini va introduce o corelare puternică între regiunea originală și cea copiată. Această corelație poate fi ulterior folosită ca punct de plecare pentru detecția regiunilor. Deoarece falsul va fi cel mai probabil salvat într-un format cu pierderi, cum ar fi JPEG sau trecut prin diverse procedee de prelucrare de imagini, regiunile copiate se vor asemăna doar într-o anumită măsură. Pe baza acestor presupuneri se pot formula cerințele algoritmului de detecție a falsificărilor de tip duplicare de regiuni:
Detecția trebuie să permită aproximarea potrivirii a unor regiuni de mici dimensiuni. Un algoritm puternic de detecție va identifica regiuni foarte mici în raport cu dimensiunea imaginii originale;
Rezultatele să conțină cât mai puține detecții fals-pozitive ;
Segmentul duplicat reprezintă o parte a unui întreg, deci nu poate fi vorba de o colecție de zone duplicate de foarte mici dimensiuni sau de pixeli solitari.
Primul obiectiv al acestei lucrări este implementarea unui algoritm de tip block-matching și testarea sa în vederea utilizării sale în contextul expertizei criminalistice din domeniul digital. Al doilea obiect este utilizarea bicoerenței în detecția semnalelor și a imaginilor falsificate.
1.1. Căutarea exhaustivă
În această metodă imaginea originală și versiunea sa deplasată sunt suprapuse pentru a identifica acele segmente care sunt foarte asemănătoare (vezi figura 1.2).” Fie un pixel xi , j din imaginea în tonuri de gri de mărime M×N aflat în poziția (i,j). Sunt examinate diferențele din ecuația (1.1) .
Pentru fiecare deplasare (k,l), diferențele Δxi , j=∣xi , j−xi+k mod(M ) , j+l mod( N)∣ sunt calculate și comparate cu un prag t. Alegerea pragului este problematică deoarece o mare parte din pixelii ce formează o imagine naturală vor produce diferențe sub acest prag. Diferența Δxi , j este trecută prin operația morfologică de deschidere. Imaginea este inițial erodată și apoi dilatată cu un un radical de dimensiune egală cu regiunea cea mai mică copiată (în experimente au fost folosite vecinătăți de 10×10 pixeli). Operația de deschidere are rolul de a îndepărta punctele izolate.
Figura 1.2. Imaginea de test „Lena” alături de fals. [2 pag.5]
∣xi , j−xi+k mod(M ), j+l mod(N)∣,k=0,1,… ,M −1,l=0,1,… , N−1 , pentru toți i,j (1.1)
Deși metoda este ușor de implementat, căutarea exhaustivă nu este eficientă, mai ales din punct de vedere al efortului de calcul. Complexitatea este nepractică chiar și pentru imagini de dimensiune medie. În timpul detecției, toate deplasările posibile (k,l) cu 1⩽k ,l⩽M /2 trebuie inspectate. Pentru fiecare deplasare, perechea de pixeli trebuie comparată, comparată cu un prag și apoi imaginea întreagă trebuie erodată și dilatată. Comparația și prelucrarea imaginii necesită un ordin de M×N operații pentru o deplasare. Puterea totală de calcul este proporțională cu
(M×N )2 . Pentru o imagine care este de două ori mai mare este nevoie de 16 ori mai multe resurse de calcul” [2 pag.6]. Acesta este motivul pentru care căutarea exhaustivă nu este o opțiune viabilă decât pentru imagini mici și foarte mici.
1.2. Autocorelația
„Autocorelația unei imagini x de mărime M×N este definită prin formula (1.2) .
M N r k ,l=∑i=1 ∑j=1 xi , j xi+k , j+i (1.2) k=0,.. ,M −1 l=0,.. ,N −1.
Ideea din spatele aceste metode este că între regiunea originală și cea copiată a imaginii va exista un grad de asemănare foarte ridicat, care se va traduce printr-un maxim atunci când se calculează autocorelația. Din cauză că imaginile naturale conțin majoritatea puterii în frecvențele inferioare, dacă autocorelația r este calculată direct pe imagine, r ar avea foarte multe vârfuri în dreptul colțurilor imaginii și în vecinătăților acestora. Este de preferat să fie calculată autocorelația pe o variantă a imaginii trecută printr-un filtru Trece-Sus. În mod empiric s-a determinat că este de preferat un filtru de tip Marr.
Pentru aplicarea metodei autocorelației au fost urmați pașii:
Aplicarea filtrului trece-sus imaginii analizate;
Calcularea autocorelației r a imaginii filtrate;
Îndepărtarea unei jumătăți a autocorelației, datorită simetriei acesteia;
Setarea r=0 pentru vecinătatea a două colțuri din autocorelație;
Găsirea maximului din r, identificarea vectorului de deplasare și examinarea deplasării folosind căutarea exhaustivă (care acum est eficientă deoarece nu trebuie realizată căutarea pentru un număr mare de vectori de deplasare);
Dacă regiunea detectată este mai mare decât B – pragul pentru detecție – algoritmul a ajuns la sfârșit. Dacă nu, se reia de la pasul 5 cu următorul maxim din r.” [2 pag.6]
1.3. Block-matching
Acest algoritm identifică acele blocuri din imagine care se potrivesc perfect – nu se ia în considerare și post-procesarea falsificării. Eficientizarea algoritmului o presupune excluderea blocurilor nemodificate.
„Înainte de a continua analiza, dacă imaginea conține informație de culoare, imaginea este convertită în tonuri de gri după formula standard (1.3).
I =0.299R+0.587G+0.114B (1.3)
Dimensiunea blocurilor de analiză este introdusă de către expert. Să presupunem că un bloc este de mărime B×B pixeli. Blocul este mișcat cu un pixel de-a lungul imaginii, din colțul său stâng spre dreapta și de la colțul de sus spre colțul de jos. Pentru fiecare poziție a blocului de dimensiune B×B valorile pixelilor sunt extrase de pe coloane și introduse într-un rând al matricii bidimensionale A cu B2 coloane și (M-B+1)(N-B+1) rânduri. Fiecare rând corespunde unei poziții a blocului ce alunecă în imagine.
Două rânduri identice din matricea A corespund celor douâ blocuri B×B identice. Pentru a localiza rândurile identice, rândurile din A sunt ordonate lexicografic. Acest lucru se poate face în M ×n×log2(MN ) pași. Rândurile care se potrivesc sunt ușor de găsit parcurgând cele M×N rânduri ale matricii ordonate A, căutând două rânduri consecutive identice (figura 1.3).
Figura 1.3. Stânga: imaginea falsificată și cea originală Dreapta: rezultatul algoritmului blockmatching, pentru B=4 [2]
Regiunile duplicate detectate formează un model neregulat alcătuit din câteva bucăți neconectate, deci se poate presupune că realizatorul falsului a folosit instrumente pentru retușare. În cazul în care imaginea ar fi fost salvată în formatul JPEG, o mare parte din blocurile identice ar fi dispărut deoarece gradul lor de asemănare ar fi scăzut considerabil.” [că în imagine.
Două rânduri identice din matricea A corespund celor douâ blocuri B×B identice. Pentru a localiza rândurile identice, rândurile din A sunt ordonate lexicografic. Acest lucru se poate face în M ×n×log2(MN ) pași. Rândurile care se potrivesc sunt ușor de găsit parcurgând cele M×N rânduri ale matricii ordonate A, căutând două rânduri consecutive identice (figura 1.3).
Figura 1.3. Stânga: imaginea falsificată și cea originală Dreapta: rezultatul algoritmului blockmatching, pentru B=4 [2]
Regiunile duplicate detectate formează un model neregulat alcătuit din câteva bucăți neconectate, deci se poate presupune că realizatorul falsului a folosit instrumente pentru retușare. În cazul în care imaginea ar fi fost salvată în formatul JPEG, o mare parte din blocurile identice ar fi dispărut deoarece gradul lor de asemănare ar fi scăzut considerabil.” [2]
1.4 Block-matching – variantă robustă 1
O variantă îmbunătățită a algoritmului de tip block-matching reprezintă renunțarea la ordonarea și compararea seturilor de pixeli din blocuri, în favoarea unei reprezentări alcătuite din coeficienți DCT cuantizați. ”Pașii de cuantizare sunt calculați pe baza unui parametru Q, introdus de către expert. Acest parametru este echivalentul factorului de calitate într-o compresie de tip JPEG. Atunci când Q are o valoare mare, blocurile de pixeli trebuie să se asemene într-o măsură mare.
Imaginea este partiționată din colțul superior din stânga spre colțul inferior din dreapta cu un cadru de B×B pixeli. Pentru fiecare cadru este calculată transformata DCT iar coeficienții DCT sunt cuantizați și păstrați pe un rând al matricii A. Matricea va avea (M-B+1)(N-B+1) rânduri și B×B coloane, exact ca în algoritmul original block-matching.
Rândurile din A sunt ordonate lexicografic. Deoarece acum sunt folosite valorile cuantizate ale coeficienților DCT pentru fiecare cadru și nu pixelii, algoritmul poate găsi foarte multe cadre care se potrivesc – deci multe fals-pozitive. Algoritmul trebuie de asemenea să țină cont și de pozițiile mutuale ale perechii de cadre și emite o anume pereche doar dacă se identifică mai multe perechi cu aceeași poziție mutuală – același vector de deplasare. Dacă sunt alese două rânduri consecutive ale matricii sortate A, atunci algoritmul păstrează pozițiile blocurilor asemănătoare într-o listă separată . Coordonatele blocului sunt considerate a fi coordonatele pixelului colțului din stânga sus. Se introduce un numărător C, de vectori de deplasare.
Fie (i1, i2) și ( j1 , j2) pozițiile a două cadre asemănătoare. În ecuația (1.4) este definit vectorul de deplasare s dintre cele două cadre.
s=(s1 , s2)=(i1− j1 ,i2− j2) (1.4)
Deoarece vectorul -s și s corespund aceleiași deplasări, vectorii de deplasare s sunt la nevoie normalizați prin înmulțirea cu -1 în așa fel încât s1≥0 . Pentru fiecare pereche de cadre numărătorul C este incrementat (1.5).
C(s1 ,s2)=C(s1 , s2)+1. (1.5)
Sunt calculați vectorii și numărătorul C este incrementat pentru fiecare potrivire de rânduri consecutive ale matricii A. La sfârșitul procesului de împerechere, numărătorul C indică frecvențele cu care apar vectori de deplasare normalizați. După procesul de împerechere, algoritmul găsește toți vectorii normalizați s(1), s(2) ,… ,s(K) a căror apariție depășește un prag T (1.6).
C(s(r))>T pentrutoțir=1,.. , K. (1.6)
Pentru toți vectorii de deplasare normalizați, acele cadre asemănătoare care au contribuit pentru un anumit vector sunt colorate cu aceeași culoare pentru ca astfel să poată fi identificate ca regiuni care ar fi putut fi duplicate și translatate.
Valoarea pragului T este legată de dimensiunea celui mai mic segment care poate fi identificat de către algoritm. Valorile mari pot determina algoritmul să rateze unele cadre care nu se aseamănă destul de mult (apariția fals-negativelor), în timp ce valorile mici pot determina apariția multor fals-pozitive. Parametrul Q este cel care controleează sensitivitatea algoritmului în ceea ce privește asemănarea dintre blocuri, în timp ce dimensiunea blocurilor B și pragul T controlează dimensiunea minimă a blocurilor ce pot fi detectate.
Pentru a evita apariția fals-pozitivelor, dimensiunea blocurilor s-a ales de 16×16 pixeli – cadre mai mari implică și o variabilitate mai mare a coeficienților DCT. Aceasta înseamnă că trebuie utilizată o matrice de cuantizare de 16×16 pixeli și nu matricea de cuantizare JPEG. S-a dovedit empiric că toți coeficienții AC ale DCT din cadrele de dimensiune 16×16 sunt în medie de 2.5 ori mai mari decât cele din cadrele de 8×8 și că coeficienții DC sunt de două ori mai mari. Este determinată matricea de cuantizare (pentru factorul Q) ce este folosită pentru cuantizarea DCT a coeficienților în fiecare din cadrele de 16×16 pixeli (1.7).
2.5q 2.5q … 2.5q
Q16=Q '8 2.5q18 I,undeQ '8=(2.5q810021 2.5q821222 … 2.5q2818) , (1.7)
2.5q81 I 2.5q88 I… … … …
2.5q 2.5q … 2.5q88
unde qij este matricea de cuantizare JPEG cu calitatea factorului Q iar I este pentru matricea de dimensiune 8×8 pixeli.
În figura 1.4 sunt prezentate rezultatele algoritmului, în partea stângă fiind evidențiate zonele suspicioase, colorate cu galben, iar în partea dreaptă, pe un fundal negru, cadrele asociate vectorilor de shiftare. De observat cadrele fals-pozitive din zona cerului. Este de așteptat ca suprafețele uniforme și netede să producă fals-pozitive. Rezultatele acestei metode trebuie ulterior analizate de un expert.
Cu toate că o inspecție vizuală nu duce la observarea unor artefacte, algoritmul a detectat 3 segmente de mari dimensiuni în partea cu iarba care au fost copiate și alipite, cel mai probabil, pentru a ascunde un obiect. După o inspecție vizuală realizată după rezultatul algoritmului s-a putut confirma acuratețea ridicată a algoritmului. Atunci când a fost analizată imaginea cu jeep-ul din figura 1.3, algoritmul a putut oferi o detaliere mai precisă a zonelor copiate (vezi figura 1.5). [2 p. 7-10]
Figura1.4. Evidențierea regiunilor duplicate folosind varianta robustă a algoritmului
block-matching [2 p.10]
Figura 1.5. Rezultatul algoritmului robust pentru imaginea din figura 1.3
1.5 Block-matching – variantă robustă 2
O alternativă la algoritmul din capitolul 1.4 este cel dezvoltat în [3], în care abordarea ce conferă un anumit grad de robustețe este folosirea analizei pe componente principale, urmată de o recuantizare a blocurilor de analiză preluate din imagine.
„Având la dispoziție o imagine cu N pixeli, se dorește evidențierea regiunilor duplicate din interiorul ei, dacă acestea există. Întocmai ca în capitolul 1.4 se urmărește partiționarea imaginii într-un set de blocuri de dimensiune redusă, care sunt stocate într-o matrice. După sortarea sa lexicografică se formează perechi din blocurile adiacente. Operația cea mai complexă a algoritmului este sortarea lexicografică, de O(NlogN), din moment ce numărul de blocuri de analiză este proporțional cu N. Deși reprezintă o abordare mai bună decât exhaustivă, metoda păstrează în continuare un dezavantaj enorm, sensibilitatea algoritmului la eventuala prelucrare a zonelor copiate – cum ar fi adăugarea de zgomot aditiv, sau compresia cu pierderi.
Având la dispoziție o imagine cu N×N pixeli și un bloc alunecător de dimensiune b×b , presupunem că în cadrul imaginii este prezentă o regiune duplicată. Această regiune
trebuie să aibe suprafața mai mare decât suprafața unui singur bloc din imagine. Blocul alunecător este folosit pentru a stoca porțiunile de imagine într-o structură ce permite păstrarea lor în formă vectorială – x⃗i ,i=1,.., N b , unde N b , numărul total de blocuri (1.8).
N b=(N−b+1)2 (1.8)
Se consideră o reprezentare alternativă a acestor blocuri de imagine folosind analiza pe componente principale [4]. Presupunând că aceste blocuri sunt de medie zero, se calculează matricea de covarianță C (1.9).
N b
C=∑ x⃗i∗x⃗iT (1.9)
i=i
Vectorii proprii e⃗j , și valorile proprii λ j , satisfac condiția din ecuația (1.10) ce definesc componentele principale, unde j =1, … , b iar λ1⩾λ2⩾…⩾λb .
C∗e⃗j=λ j∗e⃗j (1.10)
Vectorii proprii e⃗j formează un nou spațiu liniar pentru fiecare bloc x⃗i (1.11).
b∗b
⃗xi=∑ a j∗e⃗j , (1.11)
j=1
unde a j=⃗xiT∗e⃗j , iar a⃗i=(a1…ab∗b) este noul spațiu de reprezentare a fiecărui bloc.
Dimensiunea acestei reprezentări poate fi redusă prin trunchierea sumei din ecuația (1.11) a primilor N t termeni. Proiecția pe acești N t termeni a vectorilor proprii ai bazei de reprezentare PCA oferă cea mai bună aproximare N t – dimensională în sens mediu pătratic (dacă distribuția x⃗i∗s este o Gaussiană multidimensională [3 p.3]. Această bază de reprezentare oferă un spațiu convenabil pentru identificarea blocurilor asemănătoare chiar și în prezența zgomotului alb, din moment ce trunchierea bazei va îndepărta variațiile de intensitate scăzută.
Pentru a face algoritmul și mai rezistent în fața variațiilor cauzate de zgomot, fiecare bloc de imagine, acum definit în noua bază, este cuantizat [a⃗i /Q] , valoarea întreagă Q reprezintă numărul de bini folosit. Pentru a simplifica algoritmul s-a optat ca acest număr să rămână constant, deși s-ar putea folosi un număr mai mare de biți pentru coordonate cu varianță mai mare și un număr redus de bini pentru coordonate cu varianță scăzută. Se construiește o matrice de dimensiune
N b×b2 , ale cărei rânduri conțin coeficienții cuantizați. Fie matricea S rezultatul sortării lexicografice pe coloane a matricii recuantizate. Fie s⃗i , rândul i al matricii sortate și fie perechea (xi , y j) , coordonatele pixelului colțului din stânga sus corespunzător fiecărui bloc s⃗i . Se extrag toate perechile de rânduri s⃗i și s⃗j ale căror distanță ∣i− j∣ din matricea sortată S este mai mică decât un anumit prag. Offsetul acestor perechi este dat de ecuația (1.12) .
{
(x j−xi , yi−y j) pentru xi−x j<0
(xi−x j , yi−y j) pentru xi−x j>0} (1.12)
(0,∣yi−y j∣) pentru xi=x j
Din lista ce conține toate aceste offset-uri, regiunile duplicate sunt detectate o dată cu offsetul care are o rată de apariție mare. O regiune duplicată de dimensiuni mari va fi compusă din multe blocuri, unde fiecare pereche de blocuri va avea același offset. Pentru a evita apariția de fals pozitive datorate zonelor de intensitate uniformă, offset-urile cu amplitudine sub un anumit prag nu vor fi folosite. Rezultatele obținute vor fi vizualizate folosind o mască a imaginii, evidențiind zonele suspectate a fi duplicate. Complexitateea algoritmului este determinată de sortarea lexicografică,
O(N t NlogN) , unde N t este dimensiunea noii baze de reprezentare obținută în urma analizei PCA, iar N este numărul total de pixeli din imagine.
Algoritmul poate fi aplicat și pe imaginile color, existând două abordări. Prima dintre ele ar fi prelucrarea fiecărui strat RGB pentru a obține 3 măști de duplicare. A doua dintre ele poate fi aplicarea analizei PCA pe blocuri de imagine de dimensiune 3b2 – reprezentând concatenarea informației de pe fiecare componentă de culoare – algoritmul continuând cum a fost descris mai sus.” [3]
În figurile 1.6 și 1.7 sunt prezentate atât imagini originale cât și falsurile lor. Falsificarea lor este conformă definiției (1.1), unde imaginile de test au fost salvate cu diverși coeficienți de calitate JPEG între 50 și 100. „În fiecare mască de imagine regiunile duplicate sunt prezentate sub formă de tonuri de gri de valori diferite. În toate exemplele menționate, parametrii de execuție au fost:
b = 64 pixeli (latura blocurilor);
e = 0.01 (fracțiunea ignorată de-a lungul axei principale a matricei de covarianță);
Q = 256 (factorul de cuantizare);
N n = 100 (distanța în lista ordonată);
N f = 128 (pragul de frecvență offset);
N d = 16 (pragul de amplitudine offset).
Trunchierea bazei PCA reduce dimensiuna de la 64 la 32. Timpul mediu de prelucrare a unei imagini color de 512×512 pixeli rulată pe un procesor de 3 GHz este de aproximativ 10 secunde. Masca finală a fost erodată pentru a elimina găurile din regiunile duplicate, apoi dilatată pentru a elimina porțiunile izolate corespunzătoare unor regiuni fals-pozitive.” [3 p.4]
Figura 1.6. Sus: imagine originală și imagine falsificată prin duplicarea unei regiuni
Jos: rezultate obținute pentru falsul salvat în format JPEG cu coeficienți de calitate diferiți [3 p.5]
Figura 1.7. Sus: imaginea originală și imaginea falsificată prin duplicarea unei regiuni Jos: rezultate obținute pentru falsul salvat în format JPEG cu coeficienți de calitate diferiți [3 p.6]
1.6 Block-matching – variantă robustă 3
Algoritmul dezvoltat în [1] urmează aceeași împărțire a imaginii în blocuri de analiză ce se suprapun. „Fiecărui bloc de analiză Bi , îi sunt atribuite 7 caracteristici c j j=1,.. ,7 . Primele trăsături, c1 , c2 , c3 , reprezintă media componentelor de culoare aferente blocului de analiză. Componenta de luminanță Y, determinată cu ecuația (1.3), este împărțită în 2 părți egale în 4 direcții (vezi figura 1.8) și determinate folosind ecuața (1.13).
Figura 1.8. Împărțirea pe zone a componentei de luminanță Y [1 p.2]
ci=∑(parte1)/∑( parte1+ parte2) i=4,5,6,7 (1.13)
În cazul în care blocurile conțin zgomot distribuit uniform și de medie 0, se observă faptul că zgomotul nu modifică decât în mică măsură modulul acestor trăsături. În cazul în care blocurile sunt afectate de compresia JPEG sau a fost aplicat un efect de tip blur, operațiile din ecuația (1.13) vor reține majoritatea frecvențelor joase, ceea ce ne permite a spune că aceste trăsături sunt robuste la asemenea operații post-procesare.
Fiecărui bloc de analiză, Bi , îi este asociat un vector v(i) (vezi ecuația 1.14) salvat în matricea A.
v(i)=(c1(i),c2(i),c3(i),c4(i),c5(i),c6(i),c7(i)) (1.14)
Căutarea perechilor de blocuri asemănătoare se face prin sortarea lexicografică a matricii A. Pentru fiecare pereche Bi și B j , este determinată asemănarea lor folosind caracteristicile păstrate în v(i) și v(j) din matricea A.
Perechile de blocuri sunt scoase din matricea A care a fost în prealabil sortată lexicografic. Din aceste perechi sunt scoase diferențe bazate pe caracteristicile lor (1.15).
Diff (k)=∣ck (i)−ck ( j)∣ (1.15)
Diferențele sunt apoi supuse unui filtru P alcătuit din două părți, t1 și t2 (vezi ecuația
1.16). Pe lângă aceste teste este impus și un prag L în ceea ce privește frecvența offset-ului d '=(dx ' ,dy ') , unde dx '=xi−x j , dy '=yi−y j , iar (xi , yi) și (x j , y j) , reprezintă coordonatele colțului din stânga sus ale blocurilor Bi și B j .
{
Diff (1)+Diff (2)+Diff (3)<t1 } (1.16) Diff (k)<P(k)
Diff (4)+Diff (5)+Diff (6)+Diff (7)<t2
O dată terminată această filtrare inițială urmează o a doua separare a offset-urilor care nu corespund regiunii duplicate (vezi fig. 1.9). Se realizează o histogramă H (d ')=H (dx ' ,dy ') , ce înregistrează rata de apariție a fiecărui vector de deplasare pentru a determina valoarea cea mai frecventă d = arg (max(H (d '))) .
Figura 1.9. Păstrarea acelor perechi de blocuri care au același offset spațial [1 p.3]
Sunt înlăturate toate perechile de blocuri cu vectorul de deplasare d '=(dx ' ,dy ') , ce nu satisfac condițiile din (1.17)
∣dx '−dx∣>2
∣dy '−dy∣>2 (1.17)
Perechile care au rămas sunt folosite pentru a construi o imagine binară în care regiunile ocupate de blocurile aferente să fie de culoare albă în timp ce fundalul este negru. Operații morfologice sunt realizate pentru a înlătura insulele izolate și de a umple golurile din componentele legate.
După ce au fost obținute două regiuni de dimensiuni mari în imagine algoritmul trebuie să determine dacă operația de falsificare a presupus într-adevăr copierea unor regiuni. Aceasta este realizată prin utilizarea unor reguli. Dacă R1 și R2 sunt 2 regiuni obținute după modelul anterior, în cazul în care min(∣R1∣,∣R2∣)>αM∗N∗0.85% și ∣∣R1∣−∣R2∣∣/max(∣R1∣,∣R2∣)<Tr , unde α și T r sunt praguri presetate. Se extrag marginile R1 și R2 , se notează ca regiuni duplicate printr-o etichetă ce este inițializată cu valoarea 1 – însemnând fals detectat. Dacă imaginea este autentică, atunci eticheta este 0. În urma procesului de recunoaștere a regiunilor duplicate, este foarte probabil ca regiunile detectate să ocupe o suprafață mai mică decât D1 , D2 . De aceea este folosit parametrul α∈(0.45 ,1] . Deoarece regiunile R1 , R2 s-ar putea să nu fie de aceeași dimensiune este folosit parametrul Tr=12.5% . Rezultatele s-au dovedit a fi bune atât pentru imagini cu zgomot alb cât și pentru imagini cu artefacte de compresie JPEG.
Rezultatele obținute pentru imagini cu factor de compresie JPEG mai mic de 50 sau cu raportul semnal-zgomot mai mic de 24 db, au fost notabil mai bune decât rezultatele obținute folosind algoritmul descris în capitolul 1.5. De asemenea, algoritmul s-a dovedit a fi destul de robust chiar și pentru combinații de operații.” [1]
1.7 Bicoerența
„Despicarea este procesul de compunere a unei imagini (sau scene) prin copierea unor regiuni din imagini – diferite sau nu – și utilizarea lor pentru a realiza o imagine nouă” [7 p.11]. Deși lucrarea de față se adresează detecției duplicării regiunilor în cadrul aceleiași imagini, metoda statistică prezentată în acest capitol are un caracter general, deci poate fi folosită și în acest scop.
„Bicoerența este reprezentarea normalizată a bispectrului – utilizat pentru detecția neliniarităților. Procesele care nu urmăresc o evoluție Gaussiană sau liniară pot fi studiate folosind statistici de ordin superior, în special bispectrul și bicoerența.” [5 p.29]
Metoda Bicoerenței este caracterizată de doi termeni: amplitudine și fază. Modelul este util în evidențierea unor trăsături (aproape) generale descoperite la imaginile despicate, anume concentrarea puternică a fazei în jurul valorilor de ±90o și 0o .
„Vom denumi variabila spațială x și variabila frecvență ω. Un semnal al spațiului 1-D este reprezentat prin litere mici, cum ar fi a(x), iar transformata sa Fourier este reprezentată cu litere mari, cum ar fi A(ω). Semnalul bipolar va primi litera d iar semnalul despicat litera s. Bicoerența semnalului a(x), cu trasformata Fourier A(ω), va fi B(ω1 ,ω2) .” [6 p.14]
1.7.1 Definiție: Bicoerența
Bicoerența unui semnal 1-D f(x) este definită ca momentul spectral de ordinul 3, normalizat de limita sa superioară Cauchy –Schwartz (1.9):
BF E[F(ω1)F (ω2)F∗(ω1+ω2)] , (1.9)
unde ∣BF (ω1,ω2)∣∈[0,1] și E(.) este valoarea estimată a unei variabile aleatoare. [6p.1]
„În practică, pentru un semnal 1-D f(x), bicoerența este adeseori calculată folosind ecuația (1.10).
N1 ∑Ni ( ∗ ω1+ω2))
Fi(ω1)F i(ω2)Fi (
BF ω ,ω (1.10)
Un semnal este descompus în N segmente suprapuse, unde un segment este notat prin
Fi ω , cu i=1,…,N. Acest proces de extragere a segmentelor dintr-un semnal 1-D este ilustrat în figura 1.8.
Figura 1.8. Descompunerea unei imagini pentru a calcula bicoerența [7 p.15]
Fâșii 1-D sunt extrase dintr-o imagine. O fâșie 1-D este împărțită în 3 segmente ce se suprapun, pentru estimarea bicoerenței.
Spre deosebire de spectrul puterii, bicoerența este o funcție complexă ce interpretează informația fazei dintr-un semnal. Bicoerența are o proprietate unică, aceea că amplitudinea ei va atinge valoarea maximală 1 și faza sa va deveni 0 la o pereche de frecvențe cuplate cuadratic . Cuplarea cuadratică a fazelor are loc atunci când există armonici la frecvențele (ω1 ,φ1) , (ω2 ,φ2) și (ω1+ω2 ,φ1+φ2) .
Este propus un model pentru detectarea imaginilor despicate în raport cu entropia răspunsului la amplitudine și fază. Despicarea este asemănată cu adăugarea unui semnal bipolar la semnalul sursă, astfel făcând legătura cu proprietatea de filtru trece-jos a lentilelor aparatulului de fotografiat. Teoria susține că imaginile despicate vor induce o concentrație a fazei bicoerenței în jurul valorii de ±90o , în locul valorii de 0o .
Atunci când un fragment dintr-o imagine este alipit în cadrul unei alte imagini, fără acțiuni de post-procesare, este foarte probabil să se fi produs tranziții bruște ale intensității imaginii la nivelul suprafeței alipite. O astfel de tranziție de granițe nu este proprie unei imagini naturale, din moment ce camerele foto au un efect de anti-aliasing. Modelul este explicat grafic în figura 1.9.
Figura 1.9. a) Modelul pentru un semnal autentic și unul despicat. b) artefactul semnal rămas după diferența dintre un semnal autentic și unul despicat [7 p.17]
1.7.2 Definiție : Semnal bipolar
Un semnal bipolar d(x) constă din doua funții delta Dirac, cu polarități diferite. Acestea au transformata Fourier D(ω) (1.11):
d (x)=k (δ(x−x0)−δ(x−x0−Δ))←→ D(ω)=k(e− jx0ω−e−j(x0+Δ)ω) , (1.11)
unde δ() reprezintă funcția Dirac, iar Δ, delta, separația dintre cele două funcții Dirac. x0 reprezintă locația semnalului bipolar, iar k ∈ℜ este amplitudinea semnalului bipolar. Polaritatea unui semnal bipolar este determinată de semnul lui k.
1.7.3 Definiție: Modelul semnalului despicat
Modelul despicării unui semnal poate fi modelat folosind un semnal s(x) (1.12).
s(x)=a(x)+d (x)←→S (ω)=A(ω)+D(ω) , (1.12)
unde a(x) este semnalul autentic.
În practică bicoerența este calculată prin medierea bicoerențelor obținute din segmentele finite și suprapuse extrase din semnalul 1-D original, așa cum a fost menționat anterior. În analiză se presupune că poate exista cel mult un semnal bipolar pentru un segment-suprapunere și că semnalele bipolare găsite în segmentele suprapuse ale unui semnal sunt la fel, deci au aceeași polaritate k și aceeași separație. x0 este anulat după calcularea (1.10). Din moment ce presupunem că nu poate exista decât un semnal bipolar pentru un segment-suprapunere, apariția unui semnal bipolar într-un segment-suprapunere poate fi modelat folosind modelul probabilității Bernoully, cu probabilitatea apariției unui semnal bipolar într-un segment-suprapunere fiind pd . [7 p.19]
1.7.4 Proprietate: Faza bicoerenței unui semnal bipolar
Fie BD(ω1 ,ω2) bicoerența unui semnal bipolar. Faza bicoerenței semnalului bipolar devine φ(BD (ω1 ,ω2))=±90o , unde semnul de plus sau minus al lui φ(BD (ω1 ,ω2)) depinde de semnul
lui BD(ω1 ,ω2) .
Faza semnalului bipolar este determinată de numărătorul bicoerenței (1.13).
E[D(ω1)D(ω2)D∗(ω1+ω2)]
, (1.13)
unde pd este probabilitatea apariției unui semnal bipolar într-o suprapunere a semnalului segment folosit în estimarea bicoerenței.
Astfel, faza bicoerenței va deveni ±90o (1.14).
, (1.14)
unde semnul de plus sau minus al fazei ϕ(BD(ω1 ,ω2)) este determinat de termenul sgn(8jpd k 3 sin( Δω1)sin( Δω2)sin( Δ(ω1+ω2))) , unde sgn(.) este operatorul signum (vezi
fig. 1.10)
1.7.5 Proprietate: Simetria histogramei fazei bicoerenței
Pentru un semnal cu valori reale f(x), histograma fazei este simetrică.
1.7.6 Proprietate: Amplitudinea bicoerenței semnalului bipolar
Amplitudinea bicoerenței semnalului bipolar atinge valorea maximală de 1 pentru fiecare
(ω1 ,ω2) . Rezultă că media bicoerenței amplitudinii este de asemenea maxim 1 pentru toate perechile (ω1 ,ω2) .
1.7.7 Propoziție: Efectul bipolar asupra fazei bicoerenței semnalului despicat
Un semnal bipolar induce o concentrare a fazei bicoerenței semnalului despicat în
±90o .Intensitatea acestui efect depinde de mărimea lui k în raport cu energia semnalului autentic, și pd , probabilitatea apariției unui semnal bipolar în semnalul segmentului suprapus folosit pentru estimarea bicoerenței.
Figura 1.10. Stânga: O reprezentare 3-D a numărătorului bicoerenței unui semnal bipolar pentru
(k=1, Δ=1) Dreapta: exemplu de histogramă a fazelor concentrată în jurul valorilor ±90o [7 p.21]
1.7.8 Propoziție: Efectul bipolar asupra amplitudinii bicoerenței semnalului despicat
Un semnal bipolar adaptiv induce o creștere a amplitudinii bicoerenței semnalului despicat. Intensitatea efectului depinde de mărimea lui k în raport cu energia semnalului autentic și pd , probabilitatea apariției unui semnal bipolar într-un segment-suprapus – un semnal – folosit la estimarea bicoerenței.
1.7.9 Bicoerența imaginilor
Se calculează histograma fazei, entropia fazei și raspunsul amplitudinii pentru bicoerența blocurilor de imagine (de mărime 128×128 pixeli, cu imagini despicate manual folosind Adobe Photoshop – alipind în interiorul imaginilor originale obiecte care au fost decupate de-a lungul conturului). Luând un bloc de 128×128 pixeli, se calculează individual bicoerența pe fâșiile orizontale, cât și pe cele verticale, fiecare reprezentând un semnal 1-D cu 128 de eșantioane. Pentru fiecare fâșie este estimată bicoerența din cele trei segmente suprapuse de 64 de eșantioane, unde suprapunerea este de 32 eșantioane. La calcularea transformatei Fourier discrete, segmentele sunt multiplicate cu o fereastră Hanning și aduse la lungimea de 128 eșantioane concatenând semnalul cu zerouri – pentru a obține o rezoluție mai bună pentru frecvență.
Bicoerența histogramelor de fază p(ϕi) i=1,…,24 pentru fiecare fâșie este obținută prin folosirea a 24 intervale de valori, fiecare cuprinzând 150 , fazele având între −1800 și 1800 . Histograma fazei este apoi normalizată pentru ca suma sa să fie egală cu 1. Histograma de ansamblu pentru faza bicoerenței unui bloc de imagine este obținută prin medierea histogramelor de fază ale fâșiilor 1-D.
Răspunsul amplitudinii și entropia fazei bicoerenței sunt estimate cu ecuația (1.16).
n n 100
r m r p=∑ p(ϕk )log(p(ϕk )) , (1.16) n i=1 j=1 k=1
unde r m reprezintă amplitudinea mediată pentru toate perechile (ω1 ,ω2) , iar r p , entropia negativă a fazei bicoerenței. Un r p mai mare înseamnă o concentrare mai mare a fazei bicoerenței, deci o distribuție mult mai neuniformă.
Răspunsul de ansamblu al amplitudinii bicoerenței și entropia de ansamblu a fazei ale unei imagini bloc sunt obținute cu ecuația (1.17)
Rm R p
unde Rm și r him reprezintă răspunsul amplitudinii bicoerenței pe fâșiile verticale, respectiv orizontale, indexate cu i, în timp ce r vip și r hip sunt cele pentru fază. Rm și R p reprezintă răspunsul de ansamblu al amplitudinii bicoerenței, respectiv al fazei.
În urma calculării rezultatelor pentru toate imaginile din baza de date au fost realizate grafice care prezintă distribuția valorilor corespunzătoare răspunsului în amplitudine și entropiei fazei. Așa cum reiese din figura 1.11, imaginile falsificate au generat caracteristici cu valori mai mari decât imaginile originale.
Figura 1.11. Distribuția (a) răspunsului amplitudinii. (b) entropia fazei pentru bicoerența calculată folosind colecția de blocuri imagine test [7 p.27]
Din păcate rezultatele obținute utilizând un clasificator simplu – SVM – au fost doar de 63.3%, ceea ce reprezintă rezultate cu 13.3% mai bune decât simpla ghicire. Rezultatele slabe pot fi explicate prin observația dată în [7 p.12], unde se precizează că imaginile cu scene naturale au în conținut, prin definiție, o mare cantitate de energie în statistici de ordin superior, inclusiv bicoerența. Aceasta se explică prin prezența muchiilor. Din cauza influenței puternice a prezenței muchiilor asupra energiei, rezultă cu bicoerența nu este un criteriu suficient pentru o clasificare eficientă.” [7 p.15-29]
2. ALGORITM DE TIP BLOCK-MATCHING
– REZULTATE EXPERIMENTALE
Principiile algoritmului au fost expuse în capitolul 1.5, în capitolul de față urmând să fie expuse rezultatele obținute în urma implementării sale și comentariile aferente. Figura 2.1. prezintă pașii algoritmului în format flowchart.
Intenția cu care s-a pornit implementarea algoritmului a fost reproducerea condițiilor în care s-au putut obține rezultatele citate. Imaginile folosite au fost alese având în vedere puterea de procesare pe care am avut-o la dispoziție de-a lungul proiectului – un procesor Intel i7-4702MQ dual-core de 2.20 Ghz și memorie RAM de 8 GB. Am obținut de la [8] o bază de date cu imagini de tip textură folosite pentru a verifica eficiența algoritmilor de detecție a falsurilor. Toate imaginile au dimensiunea de 128×128 pixeli. Din această bază de date am ales 54 de imagini cu conținut variat, dar și de saturație diferită. Am alcătuit o bază de date proprie compusă din falsuri ce conțin regiuni de formă dreptunghiulară, dar și de formă elipsoidală. Pentru cazul imaginilor color am obținut baza de date publicată de [9], din care am selectat atât cazuri în care au fost acoperite entități, dar și în care au fost introduse copii de entități. De menționat faptul că toate imaginile erau de dimensiuni foarte mari, ceea ce m-a forțat să decupez o zonă ce conținea copia și regiunea sursă. Chiar și în acest caz imaginile s-au dovedit mult prea mari pentru a putea fi analizate, deci am fost silit să le redimensionez utilizând programul Adobe Photoshop. Sunt conștient de faptul că această redimensionare a redus șansele de detecție. De aceea am decis să realizez eu însumi acele falsuri – atunci când era necesar – pentru a încerca să măresc șansele de detecție ale algoritmului. Nu în ultimul rând, am obținut 2 imagini folosite în cadrul [3] și am putut compara rezultatele obținute cu cele din lucrare.
Implementarea a fost realizată în mediul de programare MATLAB.
Figura 2.1. Pașii algoritmului prezentați sub forma unui flowchart
2.1. Parametrii algoritmului
Unii parametri folosiți de algoritm s-au dovedit a fi foarte importanți pentru rezultatul final. De departe cei mai importanți sunt cele două praguri impuse listei ce conține perechile de blocuri, rata de apariție nF, și amplitudinea offset-ului, nD. Acești doi parametri sunt influențați în mod direct de distanța în lista sortată – nN – în momentul în care sunt realizate perechile de blocuri. Salvând în 2 vectori valorile corespunzătoare ratei de apariție și amplitudinea offset-urilor calculate, am încercat optimizarea nF și nD atribuindu-le jumătate din valoarea maximă (2.1). Această metodă s-a dovedit a fi utilă, dar nu în toate cazurile.
nF=round (max (out (: ,3))/2);
nD=round (max(final_magn(:,9))/2); , (2.1)
unde out este vectorul în care sunt păstrate ratele de apariție ale offset-urilor calculate anterior, iar pe coloana a 9-a a vectorului final_magn sunt păstrate amplitudinile offset-urilor.
Algoritmul se foloseste de doi parametri pentru a înlătura influența zgomotului asupra detecției, anume e, procentul de varianță ignorată de-a lungul axelor principale –în cadrul analizei pe componente principale – și qFactor, factorul de cuantizare – în cadrul recuantizării blocurilor de analiză. De-a lungul experimentelor am păstrat e=0.3 și qFactor=256 . Deși în [3 p.4] e=0.01 , eu am preferat să folosesc e=0.3 deoarece se obține un nT mult mai mic și o rulare
mai rapidă, fără a influența rezultatul final.
2.1.1. Experiment – nF, nD
Având la dispoziție imaginea din fig. 2.2(a) a fost realizat falsul 2.2.(b). Parametrii experimentului sunt:
blockSize = 32×32 pixeli (dimensiunea blocului de analiză);
step= 2 (pasul blocului alunecător);
N = 128×128 pixeli (dimensiunea imaginii);
N b = 2041 (număr total de blocuri – dedus);
nT = 13 (numărul de vectori proprii ai matricii de covarianță folosiți);
qFactor = 256 (factorul de cuantizare) ;
nN = 1 (distanța în lista sortată);
nF = 25; (calculat folosind ecuația (2.1));
nD = 60; (calculat folosind ecuația (2.1)).
Rata de apariție a offset-urilor a fost calculată și reprezentată printr-o histogramă în figura 2.3. Am ales această modalitate de vizualizare a conținutului listei deoarece a fost mai convenabil decât căutarea într-un tabel. De observat faptul că majoritatea perechilor de blocuri generează un offset ce apare de foarte puține ori. În acest caz maximul este reprezentat de un offset (96,0) ce apare de 49 ori, motiv pentru care o prăguire a acestor valori cu un nF=25 ar filtra majoritatea perechilor de blocuri.
Figura 2.2. a) imaginea originală, b) imaginea falsificată, c) rezultatul detecției
Figura 2.3. Histograma offset-urilor obținute pentru perechile de blocuri derivate din lista sortată lexicografic
Amplitudinea offset-urilor a fost calculată și reprezentată în fig. 2.3, unde se observă imediat un vârf puternic în dreptul valorii de 96. De fapt aceasta este amplitudinea calculată pentru offsetul (96,0). În figura 2.3 este prezentată histograma amplitudinilor în cazul în care offset-urile nu au fost inițial prăguite după frecvență. A se remarca faptul că poate fi aplicat eficient un prag folosind condițiile enunțate în ecuația (2.1).
Figura 2.3. Histograma amplitudinii offset-urilor obținute. A se observa vârful din jurul valorii 96
2.1.2. Experiment – nN
Folosind parametrii experimentului din 2.1.1 am variat parametrul nN pentru a observa cum influențează procesul de detecție.
Se consideră că este fixat ca obiectiv automatizarea algoritmului și utilizarea condiției din ecuația (1.3). În acest caz se observă faptul că avem de-a face cu mult mai multe perechi de blocuri, deci de mai multe offset-uri. Acest aspect se reflectă în parametrul nF calculat, ce crește în modul.
Atâta timp cât pragul nF nu depășește valoarea de 49 rezultatele algoritmului sunt bune, acest aspect reflecându-se și printr-o valoare mare a parametrului nD. Atunci când lui nF îi este atribuită o valoare mai mare de 49, algoritmul nu mai păstrează perechile corecte în lista finală din moment ce acestea au un offset asociat cu o frecvență mai mică decât pragul nF. Este evident faptul că există o problemă cu offseturile rămase în urma filtrării atunci când sunt consultate valorile din coloana amplitudinilor, de modul foarte mic.
Deoarece au fost obținute rezultate notabile atunci când nN =1 , am preferat să mențin această valoare de-a lungul tuturor celorlalte experimente.
Tabel 2.1. Varierea parametrului nN. A se observa cum sunt influențați parametrii nF și nD
2.1.3. Experiment – suprafață copiată
Pentru a studia puterea de detecție a acestui algoritm în ceea ce privește suprafața copiată, a fost realizat un scenariu în care au fost copiate și alipite suprafețe din ce în ce mai mici., până când algoritmul nu a mai putut recunoaște cele două regiuni.
Parametrii inițiali sunt:
dimensiune bloc de analiză = (8×8), (4×4), (3×3) pixeli;
pasul blocului alunecător = 1;
imaginea de test = figura 2.2 (a).
Rezultatele experimentelor sunt prezentate în tabelul 2.2 și în figura 2.4. Performanțele algoritmului sunt impresionante având în vedere că este vorba de suprafețe copiate ce reprezintă mai puțin de 0.25% din suprafața totală.
Tabelul 2.2 Rezultatele experimentale pentru determinarea suprafeței minime detectabile
Figura 2.4 Rezultate test-suprafață. Stânga : fals. Dreapta: rezultat detecție
a) suprafața copiată = 16×64 b) suprafața copiată = 16×32 c) suprafața copiată = 16×21
d) suprafața copiată = 16×16
2.2 Rezultate obținute – imagini în tonuri de gri
Pentru a obține rezultatele din fig. 2.4 și 2.5, au fost folosiți următorii parametri (diferiți față de experimentul 2.1.1.):
dimensiune bloc de analiză = 8×8;
pasul blocului alunecător = 1;
nF și nD variază în funcție de imaginea rulată.
2.2.1. Falsuri cu suprafață dreptunghiulară
Algoritmul a fost rulat pe cele 54 de imagini falsificate prin copierea și alipirea unei regiuni dreptunghiulare. În toate cazurile benzile duplicate au fost detectate, algoritmul dovedindu-și eficiența chiar și în cazul imaginilor cu textură netedă (vezi figurile 2.4, 2.5 și 2.6) . Deși suprafața detectată nu este 100% exactă, ea poate fi utilă în acele cazuri în care nu se poate face o identificare vizuală a originii regiunii duplicate (vezi figurile 2.5 (b) și 2.6 (b)).
Deși algoritmul detectează cu succes două zone asemănătoare, nu se poate spune care este regunea sursă și care este regiunea destinație.
Figura 2.4. Imagine-textură falsificată (nr. 3) prin copierea și alipirea unei benzi dreptunghiulare: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
Figura 2.5 Imagine-textură falsificată (nr. 8) prin copierea și alipirea unei benzi dreptunghiulare: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
Figura 2.6 Imagine-textură falsificată (nr. 37) prin copierea și alipirea unei benzi dreptunghiulare: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
2.2.2. Falsuri cu suprafață elipsoidală
Algoritmul a fost rulat pe cele 54 de imagini falsificate prin copierea și alipirea unei regiuni elipsoidale. În toate cazurile au fost detectate regiunile duplicate (vezi figurile 2.7, 2.8 și 2.9). Dintre aceste imagini multe au avut nevoie de o ajustare a pragului nF deoarece condiția din ecuația (2.1.) nu a setat un prag potrivit.
Figura 2.7. Imagine-textură falsificată (nr. 2) prin copierea și alipirea unei regiuni elipsoidale: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
Figura 2.8. Imagine-textură falsificată (nr. 5) prin copierea și alipirea unei regiuni elipsoidale: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
Figura 2.8. Imagine-textură falsificată (nr. 20) prin copierea și alipirea unei regiuni elipsoidale: a) imagine falsificată b) rezultat algoritm detecție c) regiune-sursă (?)
d) regiune-destinație (?)
2.3. Rezultate obținute pentru imagini color
Spre deosebire de imaginile în tonuri de gri, imaginile color beneficiază de informația de culoare, care poate fi la rândul ei folosită pentru a corela informația obținută din componenta de luminanță. Autorii din [3] au propus extinderea algoritmului la imagini color prin realizarea unei analize separate pe fiecare canal RGB sau prin concatenarea celor 3 canale RGB corespunzătoare fiecărui bloc de analiză și realizarea unui super-vector. Dezavantajul acestor abordări este faptul că informația cuprinsă în spațiul RGB este puternic corelată. Un avantaj considerabil ar fi utilizarea unor spații de culoare neliniare, cum ar fi L*a*b* sau YCbCr.
Algoritmul implementat a fost aplicat, pe rând, pe componenta de luminanță, apoi pe componentele cromatice. La final, măștile obținute sunt comparate pentru a încerca identificarea unei zone suspicioase.
Prima imagine analizată este cea din figura 1.6 iar rezultatele obținute sunt prezentate în figura 2.9. Rezultatele pentru o altă imagine sunt prezentate în figura 2.10. Deși regiunile detectate nu acoperă în totalitate zonele duplicate – vezi figurile 2.10 (d) și 2.9 (b), (c) – ele servesc la evidențierea unor posibile falsuri.
Figura 2.9. Rezultatele obținute pentru a) luminanță
componenta cromatică „a” c) componenta cromatică „b”
Figura 2.10. a) imaginea originală alături de fals; Rezultate obținute pentru: b) luminanță;
componenta cromatică „a” d) componenta cromatică „b”
Algoritmul rulat pe imaginile color nu a funcționat întotdeauna, necesitând o ajustare a parametrilor. Pentru rezultatele din figura 2.9, spre exemplu, unde imaginea testată era de 256×256 pixeli, detecția a fost automată, cu parametrii: • dimensiunea blocurilor de analiză = 16×16;
pasul blocului alunecător = 3.
Pentru cazul din figura 2.10, unde imaginea testată era de 258x226pixeli, detecția a fost de asemenea automată, cu parametrii:
dimensiunea blocurilor de analiză = 24×24;
pasul blocului alunecător = 3.
Am folosit un pas alunecător de 3 pixeli deoarece la rularea cu un pas de 1 pixel calculatorul s-a blocat. Pentru o testare autentică se vor folosi imaginile falsificate fără să fie redimensionate. Aceasta este o propunere pentru o lucrare viitoare, în care să se verifice și influența zgomotului asupra algoritmului.
3. ALGORITMUL BAZAT PE BICOERENȚĂ
REZULTATE EXPERIMENTALE
Algoritmul bazat pe bicoerență a fost implementat folosind o variantă dezvoltată de [10]. Pentru a înțelege mai bine parametrii bicoerenței, au fost urmărite lucrările [6, 7, 11, 12] și reproduse rezultatele obținute în [11].
3.1. Bicoerența asociată unui semnal 1-D
Au fost folosite două tipuri de semnale neliniare definite în ecuația (3.1).
y1=x+α∗x.2 și y2=x+α∗√x , (3.1)
unde x reprezintă un semnal periodic.
Pentru fiecare semnal au fost calculate trei caracteristici:
Amplitudinea medie a bicoerenței (de acum înainte denumită simplu „amplitudine medie”), definită în ecuația (3.2);
n n
Amplitudinemedie , (3.2)
n i=1 j=1
unde n2 reprezintă numărul de perechi (ωi ,ωj) iar ∣B(ωi ,ω j )∣ reprezintă amplitudinea bicoerenței.
Deviația standard a amplitudinii, definită în ecuația (3.3);
n n
Devstd Amplitudinemedie)2) (3.3)
n i=1 j=1
Entropia histogramei fazelor (de acum încolo denumită simplu „entropia fazei”), definită în ecuația (3.4);
Entropie fază , (3.4)
k=1
unde p(ϕk ) reprezintă partea unghiulară a bicoerenței, i= j=1..n iar k=1..nrInt , numărul de intervale folosite în cadrul histogramei fazelor bicoerenței. În cazul acesta nrInt=100 .
3.1.1. Experiment 1: Influența factorului de neliniaritate alfa asupra bicoerenței globale
Scopul acestui experiment este de a observa influența factorului de neliniaritate alfa asupra caracteristicilor derivate din bicoerența globală (determinată folosind întregul semnal) și de a determina dacă se poate folosi sau nu pentru a detecta neliniaritatea într-un semnal 1-D.
Parametrii de generare a semnalului sunt prezentați în figura 3.1. Variabilele folosite în cadrul programului sunt denumite în felul următor:
A1, A2 = amplitudine ;
w1,w2 = frecvență unghiulară ;
fi1, fi2 = fază inițială ;
Fs = frecvență de eșantionare
t = timp ;
x = semnalul rezultat ;
Figura 3.1. Parametrii experimentului în care se variază alfa
S-a observat faptul că o creștere a factorului alfa a determinat o creștere a tuturor mărimilor descrise anterior (figurile 3.2-3.4). Valorile caracteristicilor pentru alfa egal cu 0 pot fi aproximate ca fiind egale cu 0, în timp ce pentru valori foarte mici ale lui alfa, caracteristicile au valori considerabil mai mari – cu 1, 2 sau chiar 3 ordine de mărime. Astfel, pe de o parte, teoria este confirmată iar pe de altă parte presupune posibilitatea impunerii unui prag pentru a stabili dacă un semnal este sau nu neliniar. De asemenea, cele trei trăsături pot fi corelate pentru a putea oferi un verdict mai sigur. Numai în cazul în care toate cele trei au valori mari se poate spune că acea porțiune de semnal este suspectă.
Figura 3.2. Compararea rezultatelor obținute pentru cele două tipuri de semnale,
(a) y1 iar (b) y2
Figura 3.3. Comparație a graficelor pentru fiecare semnal a) y1 b) y2 , cu alfa variabil
Se ridică, totuși, întrebarea ce se întâmplă dacă sunt variați parametrii ce stau la baza bicoerenței, cum ar fi dimensiunea ferestrei locale nsamp sau dimensiunea ferestrei nfft.
Atribuirea ferestrei nsamp de dimensiuni mai mari de 32 eșantioane au determinat o creștere majoră a caracteristicilor rezultate atunci când alfa era egal cu zero sau cu valori foarte apropiate de zero. Dacă nsamp folosește 128 eșantioane, atunci caracteristicile din aceste cazuri vor fi chiar mai mari decât atunci când alfa are valori apropiate de 1 dar în care se folosesc ferestre de dimensiuni inferioare (vezi figura 3.4).
Figura 3.4. Folosind semnalul y1 a fost variată dimensiunea ferestrei nsamp
Dacă alfa este zero sau foarte aproape de zero, atunci ne dorim ca acele caracteristici obținute (vezi figurile 3.3 și 3.4) să fie la rândul lor cât mai apropiate de zero. Din moment ce dimensiunea ferestrei determină o creștere a acestor valori pentru alfa egal cu zero, putem spune fără rezerve că cel mai bine ar fi folosite ferestrele cu 32 sau 64 eșantioane. Acest lucru ne permite să realizăm o delimitare mai ușoară în ceea ce privește neliniaritatea semnalului studiat.
Atribuirea ferestrei nfft de dimensiuni mai mari de 128 eșantioane nu a dus la schimbarea relației dintre creșterea factorului alfa și cea a caracteristicilor derivate din bicoerență. Singurele modificari au fost legate de modulul valorilor obținute, în acest caz mai mari.
3.1.2. Experiment 2: Influența dimensiunii ferestrei nsamp asupra bicoerenței globale dacă alfa rămâne constant
Scopul acestui experiment este acela de a observa influența dimensiunii ferestrei nsamp asupra caracteristicilor bazate pe bicoerența globală a unui semnal cu alfa constant. Dimensiunea nsamp a luat pe rând valorile – 16, 32, 64, 128, 256, 512 și în unele cazuri 1024 eșantioane. A fost folosită o fereastră nfft de 512 eșantioane, iar atunci când a fost nevoie, de 1024 eșantioane (vezi figura 3.5.).
Am putut observa un fapt care cel mai probabil este legat de rezonanță, acela că pentru alfa egal cu 0.1, atunci în graficul celor 3 trăsături funcție de nsamp apare un maxim local în dreptul ferestrei asociate frecvenței de eșantionare, după care apare un minim local. În unele cazuri s-a păstrat și pentru valori superioare ale lui alfa (vezi tabelul 3.1 pentru o descriere a amplitudinii medii obținute în urma exprimentului). Astfel, pentru Fs=16 kHz (vezi figura 3 – primul grafic de sus) putem observa un maxim local pentru nsamp = 16. Același lucru se observă pentru Fs egal cu – 32 kHz, 64 kHz și 128 kHz – în dreptul nsamp egal cu – 32, 64 și 128 eșantioane. Termenul de „creștere monotonă” din tabelul 3.1 se referă la absența maximului local descris anterior.
Tabel 3.1. Amplitudine medie – descrierea graficelor pentru diferite frecvențe de eșantionare
Analizând datele obținute în urma diferitelor cazuri am optat pentru utilizarea unei ferestre nsamp de 32 de eșantioane, considerând că, indiferent de frecvența de eșantionare, astfel sunt cel mai bine diferențiate semnalele liniare de cele neliniare. Valorile caracteristicilor bazate pe bicoerența globală în cazul semnalelor liniare sunt mult mai mici decât atunci când avem de-a face cu semnale neliniare.
Figura 3.5. Media amplitudinii – evidențierea legăturii între punctul de maxim local și frecvența de eșantionare. Valorile celorlalte caracteristici sunt corelate
3.1.3. Experiment 3: Influența dimensiunii ferestrei nfft asupra bicoerenței globale dacă alfa rămâne constant
Scopul acestui experiment este acela de a observa cum influențează dimensiunea ferestrei nfft caracteristicile bazate pe bicoerența globală a unui semnal cu alfa constant.
Au fost folosite 3 cazuri, în care alfa a luat valorile – 0, 0.1 și 0.5. Dimensiunea ferestrei nfft a luat valorile – 16, 32, 64, 128, 256 și 512 eșantioane. A fost folosită o fereastră nsamp de 32 eșantioane.
S-a observat că variația dimensiunii ferestrei nfft utilizată pentru calcularea bicoerenței doar crește în modul valorile caracteristicilor (vezi figura 3.6). Așa cum reiese din figura 3.6, unde sunt cazurile cu alfa egal cu 0.1 și 0.5 – roșu și galben – putem observa că valorile celor trei caracteristici ale bicoerenței cresc o dată cu dimensiunea ferestrei nfft.
Dimensiunea ferestrei nfft utilizată de acum înainte în calcule va fi de 128 eșantioane.
Figura 3.6. Influența dimensiunii ferestrei nfft asupra bicoerenței
a) amplitudinea medie b) deviația standard a amplitudinii c) entropia fazei
3.1.4. Experiment 4: Variația Bicoerenței globale a unui semnal în funcție de dimensiunea unei porțiuni de semnal copiată în interiorul semnalului
Scopul experimentului este de a observa în ce măsură se schimbă valorile caracteristicilor bazate pe bicoerență a unui semnal atunci când acesta conține o porțiune copiată a aceluiași semnal. Intervalul copiat este plasat în așa fel încât să se evite sincronizarea de faze, deoarece avem de-a face cu un semnal pur periodic.
Dimensiunea porțiunii copiate a luat pe rând valorile – 0, 32, 64, 128 eșantioane (vezi figura 3.7 pentru o reprezentare a porțiunii de semnal copiate). Deoarece bicoerența detectează discontinuități, ne așteptăm ca bicoerența să producă caracteristici mai mari în modul pentru cazul din figura 3.7 (a) decât față de cazurile din punctele (b) și (c). Pentru fiecare caz au fost determinate caracteristicile bazate pe bicoerență și comparate, în funcție de dimensiunea ferestrei nsamp (vezi figura 3.8).
Figura 3.7. Introducerea în cadrul semnalului a unui interval de mărime
a) 0 eșantioane b) 32 eșantioane c) 64 eșantioane d) 128 eșantioane
Analizând caracteristicile de amplitudine a bicoerenței obținute pentru cele 4 cazuri putem observa că graficul corespunzător porțiunii copiate de lungime egală cu zero – figura 3.8, graficul albastru – ia numai valori egale cu 0 indiferent de dimensiunea ferestrei nsamp folosite. Față de celelalte grafice – roșu, galben și verde – corespunzătoare porțiunii de semnal copiate – 32, 64 și 128 eșantioane – se observă faptul că pe măsură ce dimensiunea ferestrei nsamp crește, amplitudinea scade. Acest lucru se explică prin faptul că acea neliniaritate locală ajunge să aibe o pondere din ce în ce mai mică, în cele din urmă graficele tinzând să atingă valoarea finală aferentă semnalului fără nicio neliniaritate introdusă.
Deviația standard a amplitudinii ajută și ea la deducerea prezenței neliniarității, în special când sunt folosite ferestre nsamp de dimensiuni mici. Se observă faptul că porțiuni copiate de dimensiuni mai mari determină o deviație standard mai mare deoarece trăsăturile de amplitudine sunt mai mari în modul. Pe măsură ce dimensiunea ferestrei nsamp crește, deviația tinde la 0 (să atingă graficul albastru) deoarece urmele neliniarității sunt din ce în ce mai nesemnificative la nivel global. Altfel spus, ponderea lor nu mai influențează calcularea acestei măsuri, întocmai ca în cazul amplitudinii medii.
În ceea ce privește entropia fazei, în schimb, se observă că cele 3 grafice ce descriu semnalele cu neliniaritate ating un plafon, spre care tinde ulterior graficul albastru – porțiune neliniară egal cu 0. Se observă o delimitare bună între cele 3 grafice cu conținut neliniar și graficul semnalului original. Din moment ce între cele două tipuri de cazuri – cu conținut neliniar și fără conținut neliniar – observăm diferențe mari în ceea ce privește valorile obținute, putem spune că poate fi impus un prag care să permită discrimiarea lor.
Aceste observații confirmă încă o dată concluzia din capitolul 3.1.1, aceea că se pot impune praguri pentru caracteristicile bicoerenței în așa fel încât să poată fi utilizate în discriminarea semnalelor neliniare, indiferent de natura neliniarității lor. De asemenea, mai rezultă și că se pot corela cele trei caracteristici bazate pe amplitudine, histograma fazelor și deviația standard a amplitudinii, pentru a decide sau nu dacă un semnal sau o porțiune de semnal prezintă urme de neliniaritate.
Figura 3.8. Caracteristicile bazate pe bicoerență a semnalelor cu porțiuni copiate, funcție de mărimea nsamp
3.2. Bicoerența asociată unui semnal 2-D
Pe baza definițiilor din capitolul 1.7 în care sunt descrise caracteristicile bazate pe bicoerență a unui semnal 1-D, aceleași caracteristici pot fi extinse în cadrul imaginilor după cum urmează:
dacă imaginea este de dimensiuni mari, atunci ea va fi descompusă în blocuri de 128×128 pixeli;
pentru fiecare linie și coloană a acestor blocuri se va calcula bicoerența, folosind un nsamp de 32 eșantioane și o suprapunere de 50%;
se determină caracteristicile bicoerenței conform ecuațiilor (3.5);
(3.5)
se realizează media caracteristicilor pentru linii, respectiv coloane; • se calculează caracteristicile finale conform ecuațiilor (3.6).
, (3.6)
unde rvim , r vistd , r vip reprezintă caracteristicile Bicoerenței corespunzătoare fiecărei coloane, iar r him , r histd , r hip reprezintă caracteristicile Bicoerenței corespunzătoare fiecărei linii.
3.2.1. Experiment 1: Variația Bicoerenței globale a unei imagini în funcție de dimensiunea unei porțiuni copiate în interiorul acesteia
Scopul acestui experiment este observarea influenței pe care o are introducerea unei regiuni copiate într-o imagine asupra caracteristicilor bicoerenței . Am ales 2 imagini de dimensiunea unui bloc de 128×128 pixeli, cu conținut diferit (vezi figura 3.9).
Au fost realizate câte 2 falsuri pentru fiecare imagine, acestea conținând o fâșie orientată diferit (orizontal și vertical). Regiunea variază în lățime – 1, 5, 10, 15, 20, 25, 30 pixeli (vezi figura
3.10).
Pentru fiecare imagine am utilizat funcția din cadrul Matlab „imadjust” pentru a obține o variantă cu contrastul echilibrat pentru acele imagini care au contrastul foarte redus (cazul imaginii din figura 3.9 (b)). Caracteristicile bicoerenței obținute pentru aceste imagini sunt foarte apropiate de cele ale imaginii originale (vezi figurile 3.11 și 3.12).
Figura 3.9 Imaginile folosite în cadrul exprimentului:
a)imaginea I b)imaginea II
Aceste grafice (figurile 3.11 și 3.12) conțin 9 instanțe pe abscisă, primele 2 reprezentând caracteristicile bicoerenței corespunzătoare imaginii originale respectiv celei ajustate. Următoarele 7 reprezintă variația lățimii dreptunghiurilor copiate specificată anterior.
Maximele și minimele locale din aceste grafice nu evidențiază decât faptul că caracteristicile bicoerenței sunt puternic influențate de numărul contururilor din o regiune, fie ea copiată sau originală.
Rezultatele depind foarte mult de conținutul imaginilor și de cum au fost așezate porțiunile copiate în imagine. Spre exemplu, falsul 1 asociat imaginii din figura 3.9 (a) reprezintă un caz ideal deoarece regiunea copiată reprezintă exact opusul texturii relativ la poziția ocupată – vezi figura 3.10 (d). Falsul de tip 2 al aceleiași imagini reprezintă, în schimb, o aliniere aproape perfectă a texturii. Rezultatele vorbesc de la sine, în primul caz având valori foarte mari pentru amplitudine și entropia fazei, în timp ce în al doilea caz valorile sunt mult mai apropiate de cele obțiunite pentru imaginea originală.
Cu toate acestea, teoria este respectată în continuare în ceea ce privește creșterea în modul – a caracteristicilor derivate din imaginea falsificată – dar cele două valori sunt atât de asemănătoare încât în cele din urmă este foarte greu de spus daca este vorba sau nu de un fals. Astfel putem presupune că între un fals și un original ar putea exista diferențe minore atâta timp cât regiunea falsificată este asemănătoare celei acoperite. În cazul în care diferă complet dar îmbinarea este satisfăcătoare, cele două valori vor diferi în funcție de numărul de muchii conținut de regiunea copiată.
În ceea ce privește imaginea din figura 3.9 (b), pentru că avem de-a face cu o textură fină, sau obținut valori mari pentru caracteristici doar atunci când lățimea benzilor copiate era mică, de 1 sau 5 pixeli (maximele). Cu cât lățimea benzii crește, cu atât este mai greu de discriminat dintre o caracteristică venită din imaginea originală și alta venită dintr-o imagine falsificată, deoarece valorile lor sunt foarte asemănătoare. În unele cazuri valorile pentru imaginea falsificată erau mai mici în modul decât cele ale originalului, dar aceasta se explică doar prin faptul că au fost acoperite tocmai acele porțiuni care presupuneau neliniaritate în imaginea originală.
Figura 3.10. Comparație vizuală: a) Imaginile originale și echivalentul ajustat b) Lățimea benzii copiate = 1 pixel c) Lățimea benzii copiate = 5 pixeli d) Lățimea benzii copiate = 10 pixeli
e) Lățimea benzii copiate = 15 pixeli f) Lățimea benzii copiate = 20 pixeli g) Lățimea benzii
copiate = 25 pixeli h) Lățimea benzii copiate = 30 pixeli
Figura 3.11. Comparație caracteristici bicoerență corespunzătoare falsurilor de tip I pentru:
a) imaginea 1 și b) imaginea 2
Figura 3.12. Comparație caracteristici Bicoerență corespunzătoare falsurilor de tip II pentru:
a) imaginea 1 b) imaginea 2
3.2.2. Experiment 2: Variația Bicoerenței globale a unei imagini în funcție de dimensiunea ferestrei nsamp
Scopul acestui experiment este de a observa dacă dimensiunea ferestrei nsamp folosite în calcularea Bicoerenței și a trăsăturilor sale, poate fi optimizată. Pentru aceasta au fost folosite, întocmai ca în experimentul anterior, imaginile originale (pentru a crea o referință) și o serie de imagini false ce conțin o bandă cu lățimea variabilă – 1, 5, 10, 15 și 20 pixeli. Dimensiunea ferestrei nsamp a luat valorile – 16, 32, 64 și 128 eșantioane.
S-a urmărit obținerea unor rezultate care să fie cu mult diferite de valorile obținute pentru imaginea originală și care să nu varieze puternic.
Din cazul în care a fost folosită o textură cu muchii pronunțate (vezi figura 3.13 (a)) pentru falsul de tipul 1 au rezultat concluziile:
fereastra de 128 eșantioane (graficul verde) nu este bună, deoarece valorile sale rămân constante indiferent de lățimea dreptunghiului copiat (această concluzie apare în toate scenariile);
fereastra de 32 eșantioane (graficul roșu) are rezultatele cele mai bune deoarece obține un echilibru între valorile maxime și cele minime, în același timp păstrând o diferență mare față de valoarea inițială, a imaginii originale.
Din cazul în care a fost folosită o textură netedă – vezi figura 3.13 (b) – pentru falsul de tipul 1 au rezultat concluziile:
dintre toate dimensiunile, fereastra de 32 eșantioane (graficul roșu) se remarcă prin diferența mare a valorilor obținute pentru lățimi de bandă diferite, față de cea obținută pe baza imaginii originale și rata descreșterii în modul a valorilor;
fereastra de 64 eșantioane pare să fie de asemenea o opțiune bună, dar rata descreșterii este mai pronunțată iar ultima valoare (corespunzătoare benzii cu lățime de 20 pixeli) este mai apropiată de cea a imaginii originale.
Figura 3.13 Grafice prezentând evoluția caracteristicilor bicoerenței folosind diferite dimensiuni pentru fereastra nsamp, funcție de lățimea dreptunghiului copiat;
a) fals 1 corespunzător imaginii 1; b) fals 1 corespunzător imaginii 2;
Din falsurile de tipul 2 ale celor două imagini – textură fină și textură cu muchii pronunțate (vezi figura 3.14 (a) și (b) ) rezultă faptul că Bicoerența nu poate fi folosită pentru a putea discerne corect între un fals și un original tocmai din cauza asemănării valorilor obținute pentru caracteristicile Bicoerenței.
Figura 3.14. Grafice prezentând evoluția caracteristicilor bicoerenței folosind diferite dimensiuni pentru fereastra nsamp, funcție de lățimea dreptunghiului copiat;
a) fals 2 corespunzător imaginii 1 b) fals 2 corespunzător imaginii 2
3.2.3. Experiment 3: Trăsături globale utilizând baza de date
Scopul acestui experiment este de a observa valorile globale ale caracteristicilor obținute pentru un set de imagini originale, alături de valorile obținute pentru imaginile falsificate. În acest sens m-am folosit de baza de date pusă la dispoziție de [8], din care am ales 54 de imagini de tip textură. Acestor 54 imagini le corespund 54 falsuri ce conțin o suprafață dreptunghiulară copiată. La aceste falsuri am adăugat alte 54 falsuri ce conțin o suprafață copiată, de această dată de formă elipsoidală.
Rezultatele experimentului sunt prezentate în figura 3.15, sub forma unor histograme normalizate a valorilor obținute pentru – amplitudine medie, deviație standard a amplitudinii medii și entropia fazei. În determinarea histogramei am folosit 10 intervale de valori deoarece am considerat aceasta ca fiind o valoare potrivită pentru dimensiunea bazei de date folosite.
Din figura 3.15 (a) rezultă că valoarea în modul a răspunsului în amplitudine este mai mare pentru imaginile falsificate – graficul roșu și cel galben – decât pentru imaginile originale – graficul albastru. Se observă o ușoară deplasare spre dreapta, zona valorilor mai mari, ceea ce confirmă proprietatea 1.7.6 .
Deviația standard a amplitudinii este de asemenea afectată de regiunile copiate, în sensul că valorile obținute sunt mai mari pentru imaginile falsificate cu suprafață dreptunghiulară decât pentru imaginile originale. De asemenea se observă faptul că valorile corespunzătoare falsurilor cu regiuni elipsoidale sunt apropiate de cele corespunzătoare imaginilor originale. Cu toate acestea, și aici există o tendință de deplasare spre zona valorilor mari pentru caracteristicile provenite din imaginile falsificate.
Entropia fazei este o surpriză deoarece valorile obținute pentru imaginile originale –graficul albastru – sunt mai mari decât cele obținute pentru imaginile falsificate cu o suprafață dreptunghiulară – graficul roșu. Cu toate acestea, valorile corespunzătoare falsurilor cu zonă elipsoidală s-au dovedit a obține valori mai mari față de celelalte falsuri și imagini originale.
Figura 3.15 Histograme valorilor obținute pentru a) amplitudine medie b)deviația standard a amplitudinii medii c) entropia fazei
CONCLUZII
Scopul acestei lucrări a fost de a implementa algoritmul de tip block-matching propus în [3] [Anexa A] și de a studia algoritmul bazat pe bicoerență propus în [7] [Anexa B]. În ambele cazuri au fost obținute rezultate notabile.
În primul rând, algoritmul de tip block-matching și-a dovedit acuratețea în capitolul 2.1.3. și utilitatea sa atunci când rezultatele obținute pe componenta de luminanță sunt corelate cu cele obținute pentru componentele cromatice. În urma capitolului 2.1.1 rezultă că nu întotdeauna se poate folosi o atribuire dinamică a celor două praguri – nF și nD. Direcții de lucru pentru acest algoritm ar fi testarea sa în condiții de zgomot – de tip Gaussian și cu artefacte de compresie – și reproducerea rezultatelor obținute de autori în [3] luând în considerare informația de culoare. O altă propunere o reprezintă utilizarea sa în combinație cu transformata wavelet prin corelarea rezultatelor obținute la nivelul frecvențelor joase și la cele înalte.
În al doilea rând, caracteristicile bicoerenței s-au dovedit a fi foarte eficiente pentru discriminarea unui semnal 1-D falsificat, dar insuficiente pentru semnale 2-D (imagini) deoarece imaginile naturale sunt prin definiție neliniare. Pentru a depăși acest dezavantaj este necesară implementarea unui clasificator și optimizarea sa. În acest sens se va urmări determinarea unui set de caracteristici capabil să ofere clasificatorului o modalitate bună de departajare a imaginilor originale de cele falsificate prin copiere.
ANEXA A
Codul Matlab pentru algoritmul de tip block-matching (alg_final.m):
close all clear all clc
image=imread('…');
%%Dataset\BW images\spliced-rectangle\SP_S_001.bmp … SP_S_054;
%%AU_S_H_016.bmp SP_T_002.bmp AU_T_002.bmp fake horses128.jpg
% % % Dataset\BW images\spliced-ellipse\Au_s_ellipse_001.jpg … 54
% % % Dataset\BW Images\spliced-rectangle\SP_S_001.bmp … 54
% % % Dataset\Color images\Farid exp\im1\dupl_tr_im1.jpg
if length(size(image))==3 cform = makecform('srgb2lab'); lab_image = applycform(image,cform);
L=lab_image(:,:,1); a=lab_image(:,:,2); b=lab_image(:,:,3);
im=b; % componenta de luminanta im=double(im);
end
if length(size(image))==2 im=double(image);
end
[lin, col]=size(im); blockSize=24;
step=3; %% pasul blocului alunecator
% im(1:lin/2,:)=im(lin/2:lin-1,:);
% im(1:57+37-1,1:72)=im(66:66+37-1,59:59+72-1);
area=1;%% variabila ce marea suprafata copiata in testele primare
% blockSizeCop=7;% latime portiune copiata
% lengthCop=5;%col/14 -lungime portiune
% copiata(col/2,col/4,col/6,col/8,col/10)
% im(1:blockSizeCop+area-1,1:lengthCop)=im(lin-area-
blockSizeCop+2:lin,1:lengthCop); % Test I: de/comment if image is AU_T_002.bmp
% im(:,1:blockSize)=imo(:,col-blockSize+1:col); %% copierea unei benzi de
% orientare verticala
%%%*** Cazul ideal ***%%% jumatate din imagine este copiata(sanse maxime de
detectie)
% im(1:lin/2-area,1:col)=imo(lin/2+1+area:lin,1:col); %%Ideal case: half of the
image is copied onto the other half
%%%***%%%***%%%***%%%
%%%***%%%***%%%***%%%
% % % Partitionarea imaginii in blocuri de analiza
%%%***%%%***%%%***%%%
blocks=splitImage(im,blockSize,step);
%%%***%%%***%%%***%%%
% % % Analiza pe componente principale (PCA)
%%%***%%%***%%%***%%%
e=0.2;
[blocks, xi_new, nB, covariance]= myPCA(blocks,blockSize,e);
corr12=ifft(fft(xi_new(1,:)).*conj(fft(xi_new(2,:))));
%%%***%%%***%%%***%%%
% % % Cuantizare
%%%***%%%***%%%***%%%
qFactor=256;
[blocks, xi_quant]=myQuantize(blocks,xi_new,qFactor, nB);
%%%***%%%***%%%***%%%
%%% Ordonarea lexicografica a blocurilor recuantizate
%%%***%%%***%%%***%%%
[sorted_vectors, sorted_index]=sortrows(xi_quant);
%%%***%%%***%%%***%%%
% % % Analiza listei sortate
%%%***%%%***%%%***%%%
%%%Separate function
nN=1; %% Formarea de perechi astfel incat cele doua blocuri sa nu treaca de
% din lista respectiva
suspected=listDistance(blocks,nN,nB,sorted_index);
%% Calculare offset!
xi_offset=computeOffset(suspected); suspected=[suspected xi_offset];
% coloanele 7 si 8 reprezinta valoarea de offset pentru fiecare pereche de
% blocuri
[final_freq, nF,out]=freqThresh(xi_offset,suspected);
%% Aplicarea pragului de amplitudine blocurilor ce au trecut de pragul anterior
[final_list, final_magn, nD]=magnThresh(final_freq);
%% Realizarea unei masti pentru a prezenta rezultatele detectiei
[lin_fin col_fin]=size(final_list);
mask_1=zeros(lin,col); mask_2=mask_1;
for i=1:lin_fin
original_i=final_list(i,3); original_j=final_list(i,4); copy_i=final_list(i,5); copy_j=final_list(i,6); mask_1(original_i:original_i+blockSize-1,original_j:original_j+blockSize-
1)=150;
mask_2(copy_i:copy_i+blockSize-1,copy_j:copy_j+blockSize-1)=75; end
l=lin; w=col;
[L_1 ,NUM_1] = bwlabel(mask_1,4);
[L_2 ,NUM_2] = bwlabel(mask_2,4);
dimIgn=0; %% Suprafata ignorata
index=1; for i=1:NUM_1 %
P_1=sum(sum(L_1==i))/(l*w)*100; p1(index)=P_1; index=index+1; if (P_1<dimIgn) % mask_1(L_1==i)=0;
end
end index=1; for i=1:NUM_2
P_2=sum(sum(L_2==i))/(l*w)*100; p2(index)=P_2; index=index+1; if (P_2<dimIgn) mask_2(L_2==i)=0; end end
figure
subplot(2,2,1), imshow(uint8(im));
title('Imagine falsa');
subplot(2,2,2), imshow(uint8(im+mask_1+mask_2));
title('Suprafata suspecta-vizibila'); subplot(2,2,3), imshow(mask_1); title('Masca – fals(?)'); subplot(2,2,4), imshow(mask_2); title('Masca – original(?)');
Codul Matlab pentru funcțiile aferente algoritmului final
1. Funcția de partiționare a imaginii (splitImage):
function blocks=splitImage(im,blockSize,step)
[lin, col]=size(im);
k=1;
for i=1:step:lin-blockSize+1 for j=1:step:col-blockSize+1 blocks(k).position_i=i; blocks(k).position_j=j;
blocks(k).block_data=im(i:i+blockSize-1,j:j+blockSize-1);
k=k+1;
end end end
2. Funcția ce realizează analiza pe componente principale (myPCA):
function [blocks, xi_new, nB, covariance]=myPCA(blocks,blockSize,e)
%%%***%%%***%%%***%%%
% % % Principal Component Analysis (PCA)
%%%***%%%***%%%***%%%
vector_size=blockSize*blockSize; sumx=zeros(1,vector_size);
for i=1:length(blocks) %%reshape the blocks as vectors blocks(i).vector=reshape(blocks(i).block_data,1,vector_size);
mean=sum(blocks(i).vector)/(vector_size); blocks(i).vector=blocks(i).vector-mean;
xi(i,:)=blocks(i).vector; sumx=sumx+xi(i,:);
end
covariance=cov(xi); %%matricea de covarianta a blocurilor de analizaa
% nB=(length(im)-blockSize+1)^2;
nB=length(blocks);
[eigen_vectors, eigen_values]=eigs(covariance,vector_size);
% % vectori si valori proprii ale matricii de covarianta
eigen_values=sum(eigen_values); %%matrix->vector of values
eigenSum=sum(eigen_values);
coeff=1-e; mySum=0;
nT=0;
while round(eigenSum*coeff)>=round(mySum) nT=nT+1;
mySum=mySum+eigen_values(nT);
end %% calcularea parametrului nT
feature_vector=eigen_vectors(1:nT,:);
%% vectorii principali
for j=1:length(blocks) %% aplicarea vectorilor pe blocurile de analiza
new_vec=0; aux=blocks(j).vector;
for i=1:nT
aj=transp(aux)*feature_vector(i);
new_vec=new_vec+aj;
blocks(j).new_vec=transp(new_vec); xi_new(j,:)=transp(new_vec); end end
end
3. Funcția ce realizează recuantizarea blocurilor de analiză ( myQuantize):
function [blocks, xi_quant]=myQuantize(blocks,xi_new,qFactor,nB)
%%%***%%%***%%%***%%%
% % % Quantization
%%%***%%%***%%%***%%%
minimum=min(min(xi_new)); maximum=max(max(xi_new));
for i=1:nB
blocks(i).vec_quant=imquantize(blocks(i).new_vec,minimum:maximum/qFactor:maximum
);
xi_quant(i,:)=imquantize(blocks(i).new_vec,minimum:maximum/qFactor:maximum); end end
4. Funcția ce realizează perechile (listDistance):
function suspected=listDistance(blocks,nN,nB,sorted_index)
index=1; for i=1:nB for j=1:nB
if abs(i-j)<=nN && i~=j && sign(j-i)>0
suspected(index,1)=sorted_index(i); %block position in the Sorted matrix
suspected(index,2)=sorted_index(j);
index=index+1;
end end end
% % campurile matricii: index bloc1, index bloc2, block1_i, block2_i, block1_j,
block2_j
suspected=sortrows(suspected);
suspected=[suspected zeros(length(suspected),4)];
for i=1:length(suspected)
suspected(i,3)=blocks(suspected(i,1)).position_i; suspected(i,4)=blocks(suspected(i,1)).position_j; suspected(i,5)=blocks(suspected(i,2)).position_i; suspected(i,6)=blocks(suspected(i,2)).position_j; end
% indexurile blocurilor sunt mai intai ordonate, apoi este adaugata
% informatia aferenta (coordonatele)
end
5. Funcția ce calculează offset-ul unei perechi de blocuri (computeOffset):
function xi_offset=computeOffset(suspected)
for i=1:length(suspected) xi=suspected(i,3); yi=suspected(i,4); xj=suspected(i,5); yj=suspected(i,6);
if xi-xj>0
xi_offset(i,:)=[xi-xj,yi-yj]; end if xi-xj<0
xi_offset(i,:)=[xj-xi,yi-yj];
end if xi==xj
xi_offset(i,:)=[0, abs(yi-yj)]; end end end
6. Funcția ce impune pragul nF (freqThresh):
function [final_freq, nF, out]=freqThresh(xi_offset,suspected)
%%Determinarea frecventei unei perechi de blocuri
[ii,jj,kk]=unique(xi_offset,'rows','stable'); f=histc(kk,1:numel(jj)); %frequencies
out=[ii f] ; % the first two columns represent ii, the third represent the frequency
%% Determinarea automata a lui nF nF=round(max(out(:,3))/2);
% nF=;%uneori trebuie impusa o anumita valoare
%% Impunerea pragului nF
aux_out=out; for i=1:length(aux_out) if aux_out(i,3)<nF aux_out(i,3)=0;
end end
%% Scoaterea din lista a acelor offseturi care acum au o frecventa = 0
index=1;
for i=1:length(aux_out) if aux_out(i,3)~=0
suspect_offset(index,:)=[aux_out(i,1) aux_out(i,2) aux_out(i,3)];
index=index+1; end end
%% Recuperarea acelor perechi de blocuri ce au trecut de pragul nF
index=1;
[lin_offset col_offset]=size(suspect_offset);
for i=1:length(suspected) for j=1:lin_offset
if (suspected(i,7)==suspect_offset(j,1)) &&
(suspected(i,8)==suspect_offset(j,2)) final_freq(index,:)=suspected(i,1:8);
index=index+1; end end end end
7. Funcția ce impune pragul nD (magnThresh):
function [final_list,final_magn, nD]=magnThresh(final_freq)
[a b]=size(final_freq); index=1; for i=1:a
magn(index,:)= sqrt( (final_freq(i,3)-final_freq(i,5))^2 + (final_freq(i,4)-
final_freq(i,6))^2 ); index=index+1;
end
[a, b]=size(final_freq); final_magn=zeros(a,b+1); final_magn=final_freq; final_magn(:,b+1)=magn;
%%coloana 9 reprezinta amplitudinea offsetului corespunzator perechii de
%%blocuri
%% Determinarea automata a pragului nD nD=round(max(final_magn(:,9))/2);
for i=1:length(final_magn) if final_magn(i,9)<=nD; final_magn(i,9)=0;
end end
aux=final_magn;
%% indepartarea offseturilor cu amplitudinea = 0
index=1; for i=1:length(aux) if aux(i,9)~=0
final_list(index,:)=aux(i,:);
index=index+1; end end end
ANEXA B
Semnal 1-D
1. Funcția pentru determinarea bicoerenței [10]:
function bic = computeBicoherence (y, nfft, wind, nsamp, overlap)
%BICOHER – Direct (FD) method for estimating bicoherence
% [bic,waxis] = bicoher (y, nfft, wind, segsamp, overlap)
% y – data vector or time-series
% nfft – fft length [default = power of two > segsamp]
% actual size used is power of two greater than 'nsamp'
% wind – specifies the time-domain window to be applied to each
% data segment; should be of length 'segsamp' (see below); % otherwise, the default Hanning window is used.
% segsamp – samples per segment [default: such that we have 8 segments]
% – if x is a matrix, segsamp is set to the number of rows
% overlap – percentage overlap, allowed range [0,99]. [default = 50]; % – if x is a matrix, overlap is set to 0.
% bic – estimated bicoherence: an nfft x nfft array, with origin % at the center, and axes pointing down and to the right.
% waxis – vector of frequencies associated with the rows and columns % of bic; sampling frequency is assumed to be 1.
% Copyright (c) 1991-2001 by United Signals & Systems, Inc.
% $Revision: 1.7 $
% A. Swami January 20, 1995
% ––––––– parameter checks ––––––––––
[ly, nrecs] = size(y);
if (ly == 1) y = y(:); ly = nrecs; nrecs = 1; end
if (exist('nfft') ~= 1) nfft = 128; end if (exist('overlap') ~= 1) overlap = 50; end overlap = max(0,min(overlap,99));
if (nrecs > 1) overlap = 0; end if (exist('nsamp') ~= 1) nsamp = 0; end if (nrecs > 1) nsamp = ly; end
if (nrecs == 1 & nsamp <= 0) nsamp = fix(ly/ (8 – 7 * overlap/100));
end
if (nfft < nsamp) nfft = 2^nextpow2(nsamp); end
overlap = fix( nsamp * overlap/100); nadvance = nsamp – overlap;
nrecs = fix ( (ly*nrecs – overlap) / nadvance);
% –––––––––––––––––––––––-
if (exist('wind') ~= 1) wind = hanning(nsamp); end
[rw,cw] = size(wind);
if (min(rw,cw) ~= 1 | max(rw,cw) ~= nsamp) disp(['Segment size is ',int2str(nsamp)])
disp(['"wind" array is ',int2str(rw),' by ',int2str(cw)])
disp(['Using default Hanning window'])
wind = hanning(nsamp); end
wind = wind(:);
% –––––- accumulate triple products –––––––-
bic = zeros(nfft,nfft);
Pyy = zeros(nfft,1);
mask = hankel([1:nfft],[nfft,1:nfft-1] ); % the hankel mask (faster)
Yf12 = zeros(nfft,nfft); ind = [1:nsamp];
for k = 1:nrecs ys = y(ind);
ys = (ys(:) – mean(ys)) .* wind;
Yf = fft(ys,nfft) / nsamp;
CYf = conj(Yf);
Pyy = Pyy + Yf .* CYf;
Yf12(:) = CYf(mask); bic = bic + (Yf * Yf.') .* Yf12;
ind = ind + nadvance; end
bic = bic / nrecs; Pyy = Pyy / nrecs; mask(:) = Pyy(mask);
bic = (bic.^2) ./ (Pyy * Pyy.' .* mask); bic = fftshift(bic) ;
2. Funcția ce determină bicoerența globală (computeGlobalBic)
function [magnMeanY, stdMagn, HY] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap)
%computeGlobalBic
% Calculeaza Bicoerenta unui semnal iar pe baza acestuia
%sunt calculate media amplitudinii, deviatia standard a amplitudinii si
%entropia histogramei fazelor; acestea sunt folosite ulterior pentru a
%putea spune daca un semnal (1-D sau 2-D) prezinta urme de editare
%(neliniaritati)
%%%Bicoerenta Globala
bicY= computeBicoherence (y, nfft, wind, nsamp, overlap);
%*%*%*% Amplitudine medie si entropia fazei %*%*%*% phaseY=[];
magnY=abs(bicY); angleY=angle(bicY); index=1; for i=1:nfft for j=1:nfft if magnY(i,j)>0.1
phaseY(index,:)=angleY(i,j);
index=index+1; end end end aux=imadjust(abs(bicY));
% figure
% subplot(1,2,1), imshow(aux);
% % title(['amplitudine pentru alfa= ' num2str(alfa)]); %%studiu alfa
% % title(['amplitudine pentru nsamp= ' num2str(nsamp)]); %%studiu nsamp
% % title(['amplitudine pentru nfft= ' num2str(nfft)]);
% subplot(1,2,2),hist(phaseY,100);
% hb=gca;
% % set(hb,'XLim',[-4 4]);
% % set(hb,'YLim',[0 500]); %pt x^2 si sqrt(x) -> [0 500]
% axis('tight');
magnMeanY=sum(sum(magnY))/(length(magnY));
% display(' ');
% display(['Magnitude Mean(Bicoherence) Spliced= ' num2str(magnMeanY)]);
stdMagn=std(magnY(:));
% display(' ');
% display(['Magnitude STD (Bicoherence) Spliced= ' num2str(stdMagn)]);
if length(phaseY)==0
HY=0; end
if length(phaseY)~=0
[hY, x_hY]=hist(phaseY,linspace(-pi,pi,100));
HY=sum(hY.*log2(hY+(hY==0)))/length(hY); end end
3. Experimentul în care variază alfa :
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta coeficientului de
% % % neliniaritate alfa asupra Bicoerentei (aplicat pe 2 semnale, in functie
% % % de tipul de neliniaritate studiat)
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
nsamp=32; wind='hanning'; nfft=128; overlap=50;
alfa=0;
y0=x+alfa*nonLinear;
[magnMean0, stdMagn0, HY0] = computeGlobalBic(alfa,y0,nsamp,wind,nfft,overlap);
alfa=0.001; %***!!!***!!!*** non-linearity factor y1=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y1,nsamp,wind,nfft,overlap);
alfa=0.01; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
alfa=0.1; %***!!!***!!!*** non-linearity factor y3=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y3,nsamp,wind,nfft,overlap);
alfa=0.2; %***!!!***!!!*** non-linearity factor y4=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y4,nsamp,wind,nfft,overlap);
alfa=0.3; %***!!!***!!!*** non-linearity factor y5=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y5,nsamp,wind,nfft,overlap);
alfa=0.4; %***!!!***!!!*** non-linearity factor y6=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y6,nsamp,wind,nfft,overlap);
alfa=0.5; %***!!!***!!!*** non-linearity factor y7=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean7, stdMagn7, HY7] = computeGlobalBic(alfa,y7,nsamp,wind,nfft,overlap);
alfa=0.6; %***!!!***!!!*** non-linearity factor y8=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean8, stdMagn8, HY8] = computeGlobalBic(alfa,y8,nsamp,wind,nfft,overlap);
alfa=0.7; %***!!!***!!!*** non-linearity factor y9=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean9, stdMagn9, HY9] = computeGlobalBic(alfa,y9,nsamp,wind,nfft,overlap);
alfa=0.8; %***!!!***!!!*** non-linearity factor y10=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean10, stdMagn10, HY10] =
computeGlobalBic(alfa,y10,nsamp,wind,nfft,overlap);
alfa=0.9; %***!!!***!!!*** non-linearity factor y11=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean11, stdMagn11, HY11] =
computeGlobalBic(alfa,y11,nsamp,wind,nfft,overlap);
alfa=1; %***!!!***!!!*** non-linearity factor y12=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean12, stdMagn12, HY12] =
computeGlobalBic(alfa,y12,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6 HY7 HY8 HY9 HY10 HY11 HY12];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 … magnMean6 magnMean7 magnMean8 magnMean9 magnMean10… magnMean11 magnMean12]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6 stdMagn7 stdMagn8
… stdMagn9 stdMagn10 stdMagn11 stdMagn12]; stdMagn=stdMagn';
features=[magnMean0 stdMagn0 HY0; magnMean stdMagn H];
4. Experimentul în care variază nSamp:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii ferestrei
% % % utilizate in calcularea Bicoerentei (nsamp)
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2 fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000; % interesant ce se intampla atunci cand valorile pt Fs si nsamp sunt
corelate! 16kHz->16; 32kHz->32; 64kHz->64;128kHz->128;
% observat un maxim in dreptul nsamp cu valoarea corelata;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
wind='hanning'; nfft=1024; %1024 si 512
overlap=50;
alfa=0; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
% nsamp=16;
% [magnMean0, stdMagn0, HY0] =
computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=16;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=32;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=64;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap); nsamp=128;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
% nfft=512; nsamp=256;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=512;
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=1024; nsamp=1024;
[magnMean7, stdMagn7, HY7] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6 HY7];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 … magnMean6 magnMean7]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6 stdMagn7]; stdMagn=stdMagn';
features=[magnMean stdMagn H];
5. Experimentul în care variază nfft:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii ferestrei
% % % utilizate in calcularea NFFT ca parte a algoritmului de determinare a
% % % Bicoerentei
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
nsamp=32; wind='hanning'; overlap=50;
alfa=0.01; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!! % nsamp=16;
% [magnMean0, stdMagn0, HY0] =
computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=32;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=64;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=128;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=256;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=512;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5];
H=H';
%%%***%%%
magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5];
magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5]; stdMagn=stdMagn';
6. Experimentul în care s-a copiat un o porțiune de semnal în interiorul său:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii unui interval
% % % copiat intr-o alta parte a semnalului generat, asupra trasaturilor bazate
% % % pe Bicoerenta
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
wind='hanning'; overlap=50; nfft=512; alfa=0;
%%%***%%% Copied Region Size %%%***%%%
startCopiedWind=10;
windSize=128; middle=length(x)/2;
x(middle:middle+windSize)=x(startCopiedWind:startCopiedWind+windSize); y=x;
xmin=middle-20; xmax=middle+windSize+20;
figure, plot(y(middle-20:middle+windSize+20)); % axis( [middle-20, middle+windSize+20, 0 ,30]);
h=gca;
set(h,'YLim',[-30 30]);
%%%!!!%%% Computing the Bicoherence Features nsamp=16;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=32;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=64;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
% nfft=512; nsamp=128;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=256;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=512;
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
%%%!!!%%%***%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 …
magnMean6]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6];
stdMagn=stdMagn';
trasaturi=[magnMean stdMagn H];
Semnal 2-D
1. Funcția ce determină trăsăturile bazate pe bicoerență (computeImageBicFeatures):
function [ featureMagn,featurePhase,featureStd ] = computeImageBicFeatures(im, nfft,wind,nsamp,overlap )
%Compute an Image's Bicoherence Features a)Magnitude Feature
%(Vertical+Horizontal), b)Standard Deviation of the Magnitude
%(Vertical+Horizontal), c)Entropy of the Phase Histogram
%(Vertical+Horizontal);
im=double(im); windowSize=nfft*nfft;
Vertical=zeros(1,windowSize);
Horizontal=Vertical; alfa=0;
verticalMagnMean=zeros(128,1); horizontalMagnMean=verticalMagnMean; verticalStdMagn=zeros(128,1); horizontalStdMagn=verticalStdMagn; verticalH=zeros(128,1); horizontalH=verticalH;
for i=1:length(im)
[magnMeanV, stdMagnV, HV] =
computeGlobalBic(alfa,im(:,i),nsamp,wind,nfft,overlap);
verticalMagnMean(i,:)=magnMeanV; verticalStdMagn(i,:)=stdMagnV; verticalH(i,:)=HV;
[magnMeanH, stdMagnH, HH] =
computeGlobalBic(alfa,im(:,i),nsamp,wind,nfft,overlap);
horizontalMagnMean(i,:)=magnMeanH; horizontalStdMagn(i,:)=stdMagnH; horizontalH(i,:)=HH;
end %media amplitudinii, entropia fazei.
featureMagn=sqrt((sum(verticalMagnMean)/nfft)^2 +
(sum(horizontalMagnMean)/nfft)^2);
featurePhase=sqrt((sum(verticalH)/nfft)^2 + (sum(horizontalH)/nfft)^2); featureStd=sqrt((sum(verticalStdMagn)/nfft)^2 +
(sum(horizontalStdMagn)/nfft)^2); end
2. Experimentul în care s-a introdus o bandă de lățime variabilă:
close all clear all clc
% % % Experiment ce presupune introducerea intr-o imagine a unei benzi de
% latime diferita, pentru a cum este afectata bicoerenta acelei imagini
im1=imread('AU_T_002.bmp');%% AU_T_002.bmp & Au_s_2.jpg
im2=imread('Au_s_2.jpg'); im2=rgb2gray(im2);
[lin1, col1]=size(im1);
[lin2, col2]=size(im2);
nfft=256; wind='hanning'; nsamp=128; overlap=50;
[ featureMagn1_orig,featurePhase1_orig,featureStd1_orig ] = computeImageBicFeatures(im1, nfft,wind,nsamp,overlap );
[ featureMagn2_orig,featurePhase2_orig,featureStd2_orig ] = computeImageBicFeatures(im2, nfft,wind,nsamp,overlap );
im1_adjust=imadjust(im1);
im2_adjust=imadjust(im2);
[ featureMagn1_adjust,featurePhase1_adjust,featureStd1_adjust ] = computeImageBicFeatures(im1_adjust, nfft,wind,nsamp,overlap );
[ featureMagn2_adjust,featurePhase2_adjust,featureStd2_adjust ] = computeImageBicFeatures(im2_adjust, nfft,wind,nsamp,overlap );
%%%***%%%!!!%%%***%%%
areaSide=20; %% [1,5,10,15,20,25,30]
startDest=30;
startInit=col1-areaSide;
%%%***%%%!!!%%%***%%%
im1_fake1=im1; im2_fake1=im2;
im1_fake1(startDest:startDest+areaSide,:)=im1_fake1(startInit:startInit+areaSide
,:);
im2_fake1(startDest:startDest+areaSide,:)=im2_fake1(startInit:startInit+areaSide
,:);
[ featureMagn1_fake1,featurePhase1_fake1,featureStd1_fake1 ] = computeImageBicFeatures(im1_fake1, nfft,wind,nsamp,overlap );
[ featureMagn2_fake1,featurePhase2_fake1,featureStd2__fake1 ] = computeImageBicFeatures(im2_fake1, nfft,wind,nsamp,overlap );
im1_fake2=im1; im2_fake2=im2;
im1_fake2(:,startDest:startDest+areaSide)=im1_fake2(:,startInit:startInit+areaSi
de);
im2_fake2(:,startDest:startDest+areaSide)=im2_fake2(:,startInit:startInit+areaSi
de);
[ featureMagn1_fake2,featurePhase1_fake2,featureStd1_fake2 ] = computeImageBicFeatures(im1_fake2, nfft,wind,nsamp,overlap );
[ featureMagn2_fake2,featurePhase2_fake2,featureStd2__fake2 ] = computeImageBicFeatures(im2_fake2, nfft,wind,nsamp,overlap );
trasaturi=[ featureMagn1_orig featureStd1_orig featurePhase1_orig featureMagn2_orig featureStd2_orig featurePhase2_orig ;… featureMagn1_adjust featureStd1_adjust featurePhase1_adjust featureMagn2_adjust featureStd2_adjust featurePhase2_adjust;… featureMagn1_fake1 featureStd1_fake1 featurePhase1_fake1 featureMagn2_fake1 featureStd2__fake1 featurePhase2_fake1;… featureMagn1_fake2 featureStd1_fake2 featurePhase1_fake2 featureMagn2_fake2 featureStd2__fake2 featurePhase2_fake2];
figure,
subplot(4,2,1),imshow(im1); title('imagine1 originala'); subplot(4,2,2),imshow(im2); title('imagine2 originala');
subplot(4,2,3),imshow(im1_adjust); title('imagine1-ajustata'); subplot(4,2,4),imshow(im2_adjust); title('imagine2-ajustata');
subplot(4,2,5),imshow(im1_fake1); title('imagine1-fals tip I-ajustata'); subplot(4,2,6),imshow(imadjust(im2_fake1)); title('imagine2-fals tip I');
subplot(4,2,7),imshow(im1_fake2); title('imagine1-fals tip II'); subplot(4,2,8),imshow(imadjust(im2_fake2)); title('imagine2-fals tip II-ajustata');
3. Determinarea caracteristicilor bazate pe bicoerență a celor 54 imagini din baza de date:
close all clear all clc
originals_magn=[…]; originals_std=[…]; originals_phase=[…];
rectangle_magn=[…]; rectangle_std=[…]; rectangle_phase=[…];
ellipse_magn=[…]; ellipse_std=[…]; ellipse_phase=[…];
nr_bin=10;
hOM=hist(originals_magn,nr_bin)/nr_bin; hOStd=hist(originals_std,nr_bin)/nr_bin; hOP=hist(originals_phase,nr_bin)/nr_bin;
hRM=hist(rectangle_magn,nr_bin)/nr_bin; hRStd=hist(rectangle_std,nr_bin)/nr_bin; hRP=hist(rectangle_phase,nr_bin)/nr_bin;
hEM=hist(ellipse_magn,nr_bin)/nr_bin; hEStd=hist(ellipse_std,nr_bin)/nr_bin; hEP=hist(ellipse_phase,nr_bin)/nr_bin;
histM=[hOM' hRM' hEM']; histStd=[hOStd' hRStd' hEStd']; histP=[hOP' hRP' hEP'];
BIBLIOGRAFIE
Weiqi Luo, Jiwu Huang,Guoping Qiu „Robust Detection of Region-Duplication Forgery in Digital Image” ICPR 2006. 18th International Conference on Pattern Recognition, 2006 (Volume:4 ) p 746 – 749 Publisher: IEEE
Jessica Fridrich, David Soukal, Jan Lukáš „Detection of Copy-Move Forgery in Digital Images” Proceedings of Digital Forensic Research Workshop 2003
A.C. Popescu and H. Farid. Exposing digital forgeries by detecting duplicated image regions. Technical Report TR2004- 515, Dartmouth College, Aug. 2004.
http://nyx-www.informatik.uni-bremen.de/664/1/smith_tr_02.pdf (accesat Martie 2014)
Shoukat M. A. A. Choudhury,Sirish L. Shah,Nina F. „Bispectrum and Bicoherence”, EdituraThornhill 2008
Tian-Tsong Ng, Shih-Fu Chang. „A Model for Image Splicing” în EEE International Conference on Image Processing (ICIP), Singapore, October 2004
Tian-Tsong Ng. „Statistical and Geometric Methods for Passive-blind Image Forensics” PhD Thesis Graduate School of Arts and Sciences, Columbia University, 2007
O bază de date ce cuprinde imagini autentice și despicate – DVMM, Columbia Univ., http://www.ee.columbia.edu/dvmm/researchProjects/AuthenticationWatermarking/BlindIma geVideoForensic/
http://www5.cs.fau.de/research/data/image-manipulation/ (accesat Noiembrie 2013)
A. Swami United Signals & Systems, Inc. Ianuarie 20, 1995
Hany Farid „Detecting Digital Forgeries Using Bispectral Analysis”, Technical Report, Massachusetts Institute of Technology Cambridge, MA, USA 1999
Tian-Tsong Ng, Shih-Fu Chang, Qibin Sun „Blind Detection of Photomontage Using Higher Order Statistics” In IEEE International Symposium on Circuits and Systems (ISCAS),
Vancouver, Canada, May 2004
BIBLIOGRAFIE
Weiqi Luo, Jiwu Huang,Guoping Qiu „Robust Detection of Region-Duplication Forgery in Digital Image” ICPR 2006. 18th International Conference on Pattern Recognition, 2006 (Volume:4 ) p 746 – 749 Publisher: IEEE
Jessica Fridrich, David Soukal, Jan Lukáš „Detection of Copy-Move Forgery in Digital Images” Proceedings of Digital Forensic Research Workshop 2003
A.C. Popescu and H. Farid. Exposing digital forgeries by detecting duplicated image regions. Technical Report TR2004- 515, Dartmouth College, Aug. 2004.
http://nyx-www.informatik.uni-bremen.de/664/1/smith_tr_02.pdf (accesat Martie 2014)
Shoukat M. A. A. Choudhury,Sirish L. Shah,Nina F. „Bispectrum and Bicoherence”, EdituraThornhill 2008
Tian-Tsong Ng, Shih-Fu Chang. „A Model for Image Splicing” în EEE International Conference on Image Processing (ICIP), Singapore, October 2004
Tian-Tsong Ng. „Statistical and Geometric Methods for Passive-blind Image Forensics” PhD Thesis Graduate School of Arts and Sciences, Columbia University, 2007
O bază de date ce cuprinde imagini autentice și despicate – DVMM, Columbia Univ., http://www.ee.columbia.edu/dvmm/researchProjects/AuthenticationWatermarking/BlindIma geVideoForensic/
http://www5.cs.fau.de/research/data/image-manipulation/ (accesat Noiembrie 2013)
A. Swami United Signals & Systems, Inc. Ianuarie 20, 1995
Hany Farid „Detecting Digital Forgeries Using Bispectral Analysis”, Technical Report, Massachusetts Institute of Technology Cambridge, MA, USA 1999
Tian-Tsong Ng, Shih-Fu Chang, Qibin Sun „Blind Detection of Photomontage Using Higher Order Statistics” In IEEE International Symposium on Circuits and Systems (ISCAS),
Vancouver, Canada, May 2004
ANEXA A
Codul Matlab pentru algoritmul de tip block-matching (alg_final.m):
close all clear all clc
image=imread('…');
%%Dataset\BW images\spliced-rectangle\SP_S_001.bmp … SP_S_054;
%%AU_S_H_016.bmp SP_T_002.bmp AU_T_002.bmp fake horses128.jpg
% % % Dataset\BW images\spliced-ellipse\Au_s_ellipse_001.jpg … 54
% % % Dataset\BW Images\spliced-rectangle\SP_S_001.bmp … 54
% % % Dataset\Color images\Farid exp\im1\dupl_tr_im1.jpg
if length(size(image))==3 cform = makecform('srgb2lab'); lab_image = applycform(image,cform);
L=lab_image(:,:,1); a=lab_image(:,:,2); b=lab_image(:,:,3);
im=b; % componenta de luminanta im=double(im);
end
if length(size(image))==2 im=double(image);
end
[lin, col]=size(im); blockSize=24;
step=3; %% pasul blocului alunecator
% im(1:lin/2,:)=im(lin/2:lin-1,:);
% im(1:57+37-1,1:72)=im(66:66+37-1,59:59+72-1);
area=1;%% variabila ce marea suprafata copiata in testele primare
% blockSizeCop=7;% latime portiune copiata
% lengthCop=5;%col/14 -lungime portiune
% copiata(col/2,col/4,col/6,col/8,col/10)
% im(1:blockSizeCop+area-1,1:lengthCop)=im(lin-area-
blockSizeCop+2:lin,1:lengthCop); % Test I: de/comment if image is AU_T_002.bmp
% im(:,1:blockSize)=imo(:,col-blockSize+1:col); %% copierea unei benzi de
% orientare verticala
%%%*** Cazul ideal ***%%% jumatate din imagine este copiata(sanse maxime de
detectie)
% im(1:lin/2-area,1:col)=imo(lin/2+1+area:lin,1:col); %%Ideal case: half of the
image is copied onto the other half
%%%***%%%***%%%***%%%
%%%***%%%***%%%***%%%
% % % Partitionarea imaginii in blocuri de analiza
%%%***%%%***%%%***%%%
blocks=splitImage(im,blockSize,step);
%%%***%%%***%%%***%%%
% % % Analiza pe componente principale (PCA)
%%%***%%%***%%%***%%%
e=0.2;
[blocks, xi_new, nB, covariance]= myPCA(blocks,blockSize,e);
corr12=ifft(fft(xi_new(1,:)).*conj(fft(xi_new(2,:))));
%%%***%%%***%%%***%%%
% % % Cuantizare
%%%***%%%***%%%***%%%
qFactor=256;
[blocks, xi_quant]=myQuantize(blocks,xi_new,qFactor, nB);
%%%***%%%***%%%***%%%
%%% Ordonarea lexicografica a blocurilor recuantizate
%%%***%%%***%%%***%%%
[sorted_vectors, sorted_index]=sortrows(xi_quant);
%%%***%%%***%%%***%%%
% % % Analiza listei sortate
%%%***%%%***%%%***%%%
%%%Separate function
nN=1; %% Formarea de perechi astfel incat cele doua blocuri sa nu treaca de
% din lista respectiva
suspected=listDistance(blocks,nN,nB,sorted_index);
%% Calculare offset!
xi_offset=computeOffset(suspected); suspected=[suspected xi_offset];
% coloanele 7 si 8 reprezinta valoarea de offset pentru fiecare pereche de
% blocuri
[final_freq, nF,out]=freqThresh(xi_offset,suspected);
%% Aplicarea pragului de amplitudine blocurilor ce au trecut de pragul anterior
[final_list, final_magn, nD]=magnThresh(final_freq);
%% Realizarea unei masti pentru a prezenta rezultatele detectiei
[lin_fin col_fin]=size(final_list);
mask_1=zeros(lin,col); mask_2=mask_1;
for i=1:lin_fin
original_i=final_list(i,3); original_j=final_list(i,4); copy_i=final_list(i,5); copy_j=final_list(i,6); mask_1(original_i:original_i+blockSize-1,original_j:original_j+blockSize-
1)=150;
mask_2(copy_i:copy_i+blockSize-1,copy_j:copy_j+blockSize-1)=75; end
l=lin; w=col;
[L_1 ,NUM_1] = bwlabel(mask_1,4);
[L_2 ,NUM_2] = bwlabel(mask_2,4);
dimIgn=0; %% Suprafata ignorata
index=1; for i=1:NUM_1 %
P_1=sum(sum(L_1==i))/(l*w)*100; p1(index)=P_1; index=index+1; if (P_1<dimIgn) % mask_1(L_1==i)=0;
end
end index=1; for i=1:NUM_2
P_2=sum(sum(L_2==i))/(l*w)*100; p2(index)=P_2; index=index+1; if (P_2<dimIgn) mask_2(L_2==i)=0; end end
figure
subplot(2,2,1), imshow(uint8(im));
title('Imagine falsa');
subplot(2,2,2), imshow(uint8(im+mask_1+mask_2));
title('Suprafata suspecta-vizibila'); subplot(2,2,3), imshow(mask_1); title('Masca – fals(?)'); subplot(2,2,4), imshow(mask_2); title('Masca – original(?)');
Codul Matlab pentru funcțiile aferente algoritmului final
1. Funcția de partiționare a imaginii (splitImage):
function blocks=splitImage(im,blockSize,step)
[lin, col]=size(im);
k=1;
for i=1:step:lin-blockSize+1 for j=1:step:col-blockSize+1 blocks(k).position_i=i; blocks(k).position_j=j;
blocks(k).block_data=im(i:i+blockSize-1,j:j+blockSize-1);
k=k+1;
end end end
2. Funcția ce realizează analiza pe componente principale (myPCA):
function [blocks, xi_new, nB, covariance]=myPCA(blocks,blockSize,e)
%%%***%%%***%%%***%%%
% % % Principal Component Analysis (PCA)
%%%***%%%***%%%***%%%
vector_size=blockSize*blockSize; sumx=zeros(1,vector_size);
for i=1:length(blocks) %%reshape the blocks as vectors blocks(i).vector=reshape(blocks(i).block_data,1,vector_size);
mean=sum(blocks(i).vector)/(vector_size); blocks(i).vector=blocks(i).vector-mean;
xi(i,:)=blocks(i).vector; sumx=sumx+xi(i,:);
end
covariance=cov(xi); %%matricea de covarianta a blocurilor de analizaa
% nB=(length(im)-blockSize+1)^2;
nB=length(blocks);
[eigen_vectors, eigen_values]=eigs(covariance,vector_size);
% % vectori si valori proprii ale matricii de covarianta
eigen_values=sum(eigen_values); %%matrix->vector of values
eigenSum=sum(eigen_values);
coeff=1-e; mySum=0;
nT=0;
while round(eigenSum*coeff)>=round(mySum) nT=nT+1;
mySum=mySum+eigen_values(nT);
end %% calcularea parametrului nT
feature_vector=eigen_vectors(1:nT,:);
%% vectorii principali
for j=1:length(blocks) %% aplicarea vectorilor pe blocurile de analiza
new_vec=0; aux=blocks(j).vector;
for i=1:nT
aj=transp(aux)*feature_vector(i);
new_vec=new_vec+aj;
blocks(j).new_vec=transp(new_vec); xi_new(j,:)=transp(new_vec); end end
end
3. Funcția ce realizează recuantizarea blocurilor de analiză ( myQuantize):
function [blocks, xi_quant]=myQuantize(blocks,xi_new,qFactor,nB)
%%%***%%%***%%%***%%%
% % % Quantization
%%%***%%%***%%%***%%%
minimum=min(min(xi_new)); maximum=max(max(xi_new));
for i=1:nB
blocks(i).vec_quant=imquantize(blocks(i).new_vec,minimum:maximum/qFactor:maximum
);
xi_quant(i,:)=imquantize(blocks(i).new_vec,minimum:maximum/qFactor:maximum); end end
4. Funcția ce realizează perechile (listDistance):
function suspected=listDistance(blocks,nN,nB,sorted_index)
index=1; for i=1:nB for j=1:nB
if abs(i-j)<=nN && i~=j && sign(j-i)>0
suspected(index,1)=sorted_index(i); %block position in the Sorted matrix
suspected(index,2)=sorted_index(j);
index=index+1;
end end end
% % campurile matricii: index bloc1, index bloc2, block1_i, block2_i, block1_j,
block2_j
suspected=sortrows(suspected);
suspected=[suspected zeros(length(suspected),4)];
for i=1:length(suspected)
suspected(i,3)=blocks(suspected(i,1)).position_i; suspected(i,4)=blocks(suspected(i,1)).position_j; suspected(i,5)=blocks(suspected(i,2)).position_i; suspected(i,6)=blocks(suspected(i,2)).position_j; end
% indexurile blocurilor sunt mai intai ordonate, apoi este adaugata
% informatia aferenta (coordonatele)
end
5. Funcția ce calculează offset-ul unei perechi de blocuri (computeOffset):
function xi_offset=computeOffset(suspected)
for i=1:length(suspected) xi=suspected(i,3); yi=suspected(i,4); xj=suspected(i,5); yj=suspected(i,6);
if xi-xj>0
xi_offset(i,:)=[xi-xj,yi-yj]; end if xi-xj<0
xi_offset(i,:)=[xj-xi,yi-yj];
end if xi==xj
xi_offset(i,:)=[0, abs(yi-yj)]; end end end
6. Funcția ce impune pragul nF (freqThresh):
function [final_freq, nF, out]=freqThresh(xi_offset,suspected)
%%Determinarea frecventei unei perechi de blocuri
[ii,jj,kk]=unique(xi_offset,'rows','stable'); f=histc(kk,1:numel(jj)); %frequencies
out=[ii f] ; % the first two columns represent ii, the third represent the frequency
%% Determinarea automata a lui nF nF=round(max(out(:,3))/2);
% nF=;%uneori trebuie impusa o anumita valoare
%% Impunerea pragului nF
aux_out=out; for i=1:length(aux_out) if aux_out(i,3)<nF aux_out(i,3)=0;
end end
%% Scoaterea din lista a acelor offseturi care acum au o frecventa = 0
index=1;
for i=1:length(aux_out) if aux_out(i,3)~=0
suspect_offset(index,:)=[aux_out(i,1) aux_out(i,2) aux_out(i,3)];
index=index+1; end end
%% Recuperarea acelor perechi de blocuri ce au trecut de pragul nF
index=1;
[lin_offset col_offset]=size(suspect_offset);
for i=1:length(suspected) for j=1:lin_offset
if (suspected(i,7)==suspect_offset(j,1)) &&
(suspected(i,8)==suspect_offset(j,2)) final_freq(index,:)=suspected(i,1:8);
index=index+1; end end end end
7. Funcția ce impune pragul nD (magnThresh):
function [final_list,final_magn, nD]=magnThresh(final_freq)
[a b]=size(final_freq); index=1; for i=1:a
magn(index,:)= sqrt( (final_freq(i,3)-final_freq(i,5))^2 + (final_freq(i,4)-
final_freq(i,6))^2 ); index=index+1;
end
[a, b]=size(final_freq); final_magn=zeros(a,b+1); final_magn=final_freq; final_magn(:,b+1)=magn;
%%coloana 9 reprezinta amplitudinea offsetului corespunzator perechii de
%%blocuri
%% Determinarea automata a pragului nD nD=round(max(final_magn(:,9))/2);
for i=1:length(final_magn) if final_magn(i,9)<=nD; final_magn(i,9)=0;
end end
aux=final_magn;
%% indepartarea offseturilor cu amplitudinea = 0
index=1; for i=1:length(aux) if aux(i,9)~=0
final_list(index,:)=aux(i,:);
index=index+1; end end end
ANEXA B
Semnal 1-D
1. Funcția pentru determinarea bicoerenței [10]:
function bic = computeBicoherence (y, nfft, wind, nsamp, overlap)
%BICOHER – Direct (FD) method for estimating bicoherence
% [bic,waxis] = bicoher (y, nfft, wind, segsamp, overlap)
% y – data vector or time-series
% nfft – fft length [default = power of two > segsamp]
% actual size used is power of two greater than 'nsamp'
% wind – specifies the time-domain window to be applied to each
% data segment; should be of length 'segsamp' (see below); % otherwise, the default Hanning window is used.
% segsamp – samples per segment [default: such that we have 8 segments]
% – if x is a matrix, segsamp is set to the number of rows
% overlap – percentage overlap, allowed range [0,99]. [default = 50]; % – if x is a matrix, overlap is set to 0.
% bic – estimated bicoherence: an nfft x nfft array, with origin % at the center, and axes pointing down and to the right.
% waxis – vector of frequencies associated with the rows and columns % of bic; sampling frequency is assumed to be 1.
% Copyright (c) 1991-2001 by United Signals & Systems, Inc.
% $Revision: 1.7 $
% A. Swami January 20, 1995
% ––––––– parameter checks ––––––––––
[ly, nrecs] = size(y);
if (ly == 1) y = y(:); ly = nrecs; nrecs = 1; end
if (exist('nfft') ~= 1) nfft = 128; end if (exist('overlap') ~= 1) overlap = 50; end overlap = max(0,min(overlap,99));
if (nrecs > 1) overlap = 0; end if (exist('nsamp') ~= 1) nsamp = 0; end if (nrecs > 1) nsamp = ly; end
if (nrecs == 1 & nsamp <= 0) nsamp = fix(ly/ (8 – 7 * overlap/100));
end
if (nfft < nsamp) nfft = 2^nextpow2(nsamp); end
overlap = fix( nsamp * overlap/100); nadvance = nsamp – overlap;
nrecs = fix ( (ly*nrecs – overlap) / nadvance);
% –––––––––––––––––––––––-
if (exist('wind') ~= 1) wind = hanning(nsamp); end
[rw,cw] = size(wind);
if (min(rw,cw) ~= 1 | max(rw,cw) ~= nsamp) disp(['Segment size is ',int2str(nsamp)])
disp(['"wind" array is ',int2str(rw),' by ',int2str(cw)])
disp(['Using default Hanning window'])
wind = hanning(nsamp); end
wind = wind(:);
% –––––- accumulate triple products –––––––-
bic = zeros(nfft,nfft);
Pyy = zeros(nfft,1);
mask = hankel([1:nfft],[nfft,1:nfft-1] ); % the hankel mask (faster)
Yf12 = zeros(nfft,nfft); ind = [1:nsamp];
for k = 1:nrecs ys = y(ind);
ys = (ys(:) – mean(ys)) .* wind;
Yf = fft(ys,nfft) / nsamp;
CYf = conj(Yf);
Pyy = Pyy + Yf .* CYf;
Yf12(:) = CYf(mask); bic = bic + (Yf * Yf.') .* Yf12;
ind = ind + nadvance; end
bic = bic / nrecs; Pyy = Pyy / nrecs; mask(:) = Pyy(mask);
bic = (bic.^2) ./ (Pyy * Pyy.' .* mask); bic = fftshift(bic) ;
2. Funcția ce determină bicoerența globală (computeGlobalBic)
function [magnMeanY, stdMagn, HY] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap)
%computeGlobalBic
% Calculeaza Bicoerenta unui semnal iar pe baza acestuia
%sunt calculate media amplitudinii, deviatia standard a amplitudinii si
%entropia histogramei fazelor; acestea sunt folosite ulterior pentru a
%putea spune daca un semnal (1-D sau 2-D) prezinta urme de editare
%(neliniaritati)
%%%Bicoerenta Globala
bicY= computeBicoherence (y, nfft, wind, nsamp, overlap);
%*%*%*% Amplitudine medie si entropia fazei %*%*%*% phaseY=[];
magnY=abs(bicY); angleY=angle(bicY); index=1; for i=1:nfft for j=1:nfft if magnY(i,j)>0.1
phaseY(index,:)=angleY(i,j);
index=index+1; end end end aux=imadjust(abs(bicY));
% figure
% subplot(1,2,1), imshow(aux);
% % title(['amplitudine pentru alfa= ' num2str(alfa)]); %%studiu alfa
% % title(['amplitudine pentru nsamp= ' num2str(nsamp)]); %%studiu nsamp
% % title(['amplitudine pentru nfft= ' num2str(nfft)]);
% subplot(1,2,2),hist(phaseY,100);
% hb=gca;
% % set(hb,'XLim',[-4 4]);
% % set(hb,'YLim',[0 500]); %pt x^2 si sqrt(x) -> [0 500]
% axis('tight');
magnMeanY=sum(sum(magnY))/(length(magnY));
% display(' ');
% display(['Magnitude Mean(Bicoherence) Spliced= ' num2str(magnMeanY)]);
stdMagn=std(magnY(:));
% display(' ');
% display(['Magnitude STD (Bicoherence) Spliced= ' num2str(stdMagn)]);
if length(phaseY)==0
HY=0; end
if length(phaseY)~=0
[hY, x_hY]=hist(phaseY,linspace(-pi,pi,100));
HY=sum(hY.*log2(hY+(hY==0)))/length(hY); end end
3. Experimentul în care variază alfa :
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta coeficientului de
% % % neliniaritate alfa asupra Bicoerentei (aplicat pe 2 semnale, in functie
% % % de tipul de neliniaritate studiat)
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
nsamp=32; wind='hanning'; nfft=128; overlap=50;
alfa=0;
y0=x+alfa*nonLinear;
[magnMean0, stdMagn0, HY0] = computeGlobalBic(alfa,y0,nsamp,wind,nfft,overlap);
alfa=0.001; %***!!!***!!!*** non-linearity factor y1=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y1,nsamp,wind,nfft,overlap);
alfa=0.01; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
alfa=0.1; %***!!!***!!!*** non-linearity factor y3=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y3,nsamp,wind,nfft,overlap);
alfa=0.2; %***!!!***!!!*** non-linearity factor y4=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y4,nsamp,wind,nfft,overlap);
alfa=0.3; %***!!!***!!!*** non-linearity factor y5=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y5,nsamp,wind,nfft,overlap);
alfa=0.4; %***!!!***!!!*** non-linearity factor y6=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y6,nsamp,wind,nfft,overlap);
alfa=0.5; %***!!!***!!!*** non-linearity factor y7=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean7, stdMagn7, HY7] = computeGlobalBic(alfa,y7,nsamp,wind,nfft,overlap);
alfa=0.6; %***!!!***!!!*** non-linearity factor y8=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean8, stdMagn8, HY8] = computeGlobalBic(alfa,y8,nsamp,wind,nfft,overlap);
alfa=0.7; %***!!!***!!!*** non-linearity factor y9=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean9, stdMagn9, HY9] = computeGlobalBic(alfa,y9,nsamp,wind,nfft,overlap);
alfa=0.8; %***!!!***!!!*** non-linearity factor y10=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean10, stdMagn10, HY10] =
computeGlobalBic(alfa,y10,nsamp,wind,nfft,overlap);
alfa=0.9; %***!!!***!!!*** non-linearity factor y11=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean11, stdMagn11, HY11] =
computeGlobalBic(alfa,y11,nsamp,wind,nfft,overlap);
alfa=1; %***!!!***!!!*** non-linearity factor y12=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
[magnMean12, stdMagn12, HY12] =
computeGlobalBic(alfa,y12,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6 HY7 HY8 HY9 HY10 HY11 HY12];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 … magnMean6 magnMean7 magnMean8 magnMean9 magnMean10… magnMean11 magnMean12]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6 stdMagn7 stdMagn8
… stdMagn9 stdMagn10 stdMagn11 stdMagn12]; stdMagn=stdMagn';
features=[magnMean0 stdMagn0 HY0; magnMean stdMagn H];
4. Experimentul în care variază nSamp:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii ferestrei
% % % utilizate in calcularea Bicoerentei (nsamp)
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2 fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000; % interesant ce se intampla atunci cand valorile pt Fs si nsamp sunt
corelate! 16kHz->16; 32kHz->32; 64kHz->64;128kHz->128;
% observat un maxim in dreptul nsamp cu valoarea corelata;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
wind='hanning'; nfft=1024; %1024 si 512
overlap=50;
alfa=0; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!!
% nsamp=16;
% [magnMean0, stdMagn0, HY0] =
computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=16;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=32;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=64;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap); nsamp=128;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
% nfft=512; nsamp=256;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nsamp=512;
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=1024; nsamp=1024;
[magnMean7, stdMagn7, HY7] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6 HY7];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 … magnMean6 magnMean7]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6 stdMagn7]; stdMagn=stdMagn';
features=[magnMean stdMagn H];
5. Experimentul în care variază nfft:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii ferestrei
% % % utilizate in calcularea NFFT ca parte a algoritmului de determinare a
% % % Bicoerentei
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
nonLinear=x.^2; % x.^2 sau sqrt(x)
nsamp=32; wind='hanning'; overlap=50;
alfa=0.01; %***!!!***!!!*** non-linearity factor y2=x+alfa*nonLinear;%% sqrt(x); x.^2%Global non-linearity !!!!!!!!!!!!!!! % nsamp=16;
% [magnMean0, stdMagn0, HY0] =
computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=32;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=64;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=128;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=256;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
nfft=512;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y2,nsamp,wind,nfft,overlap);
%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5];
H=H';
%%%***%%%
magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5];
magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5]; stdMagn=stdMagn';
6. Experimentul în care s-a copiat un o porțiune de semnal în interiorul său:
close all clear all clc
% % % Descriere:
% % % fisier creat pentru a observa influenta dimensiunii unui interval
% % % copiat intr-o alta parte a semnalului generat, asupra trasaturilor bazate
% % % pe Bicoerenta
%%%***%%% Generarea semnalului %%%***%%%
A1=12.5;
A2=10;
w1=2*pi*450; %frecventa unghiulara 1 w2=2*pi*600; %frecventa unghiulara 2
fi1=55; %randn(1)*100; fi2=89; %randn(1)*100;
Fs=16000;
t=1:2048; t=t/Fs;
x=A1*sin(w1*t+fi1)+A2*sin(w2*t+fi2);
wind='hanning'; overlap=50; nfft=512; alfa=0;
%%%***%%% Copied Region Size %%%***%%%
startCopiedWind=10;
windSize=128; middle=length(x)/2;
x(middle:middle+windSize)=x(startCopiedWind:startCopiedWind+windSize); y=x;
xmin=middle-20; xmax=middle+windSize+20;
figure, plot(y(middle-20:middle+windSize+20)); % axis( [middle-20, middle+windSize+20, 0 ,30]);
h=gca;
set(h,'YLim',[-30 30]);
%%%!!!%%% Computing the Bicoherence Features nsamp=16;
[magnMean1, stdMagn1, HY1] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=32;
[magnMean2, stdMagn2, HY2] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=64;
[magnMean3, stdMagn3, HY3] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
% nfft=512; nsamp=128;
[magnMean4, stdMagn4, HY4] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=256;
[magnMean5, stdMagn5, HY5] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
nsamp=512;
[magnMean6, stdMagn6, HY6] = computeGlobalBic(alfa,y,nsamp,wind,nfft,overlap);
%%%!!!%%%***%%%!!!%%%
H=[HY1 HY2 HY3 HY4 HY5 HY6];
H=H';
%%%***%%% magnMean=[magnMean1 magnMean2 magnMean3 magnMean4 magnMean5 …
magnMean6]; magnMean=magnMean';
%%%!!!%%%
stdMagn=[stdMagn1 stdMagn2 stdMagn3 stdMagn4 stdMagn5 stdMagn6];
stdMagn=stdMagn';
trasaturi=[magnMean stdMagn H];
Semnal 2-D
1. Funcția ce determină trăsăturile bazate pe bicoerență (computeImageBicFeatures):
function [ featureMagn,featurePhase,featureStd ] = computeImageBicFeatures(im, nfft,wind,nsamp,overlap )
%Compute an Image's Bicoherence Features a)Magnitude Feature
%(Vertical+Horizontal), b)Standard Deviation of the Magnitude
%(Vertical+Horizontal), c)Entropy of the Phase Histogram
%(Vertical+Horizontal);
im=double(im); windowSize=nfft*nfft;
Vertical=zeros(1,windowSize);
Horizontal=Vertical; alfa=0;
verticalMagnMean=zeros(128,1); horizontalMagnMean=verticalMagnMean; verticalStdMagn=zeros(128,1); horizontalStdMagn=verticalStdMagn; verticalH=zeros(128,1); horizontalH=verticalH;
for i=1:length(im)
[magnMeanV, stdMagnV, HV] =
computeGlobalBic(alfa,im(:,i),nsamp,wind,nfft,overlap);
verticalMagnMean(i,:)=magnMeanV; verticalStdMagn(i,:)=stdMagnV; verticalH(i,:)=HV;
[magnMeanH, stdMagnH, HH] =
computeGlobalBic(alfa,im(:,i),nsamp,wind,nfft,overlap);
horizontalMagnMean(i,:)=magnMeanH; horizontalStdMagn(i,:)=stdMagnH; horizontalH(i,:)=HH;
end %media amplitudinii, entropia fazei.
featureMagn=sqrt((sum(verticalMagnMean)/nfft)^2 +
(sum(horizontalMagnMean)/nfft)^2);
featurePhase=sqrt((sum(verticalH)/nfft)^2 + (sum(horizontalH)/nfft)^2); featureStd=sqrt((sum(verticalStdMagn)/nfft)^2 +
(sum(horizontalStdMagn)/nfft)^2); end
2. Experimentul în care s-a introdus o bandă de lățime variabilă:
close all clear all clc
% % % Experiment ce presupune introducerea intr-o imagine a unei benzi de
% latime diferita, pentru a cum este afectata bicoerenta acelei imagini
im1=imread('AU_T_002.bmp');%% AU_T_002.bmp & Au_s_2.jpg
im2=imread('Au_s_2.jpg'); im2=rgb2gray(im2);
[lin1, col1]=size(im1);
[lin2, col2]=size(im2);
nfft=256; wind='hanning'; nsamp=128; overlap=50;
[ featureMagn1_orig,featurePhase1_orig,featureStd1_orig ] = computeImageBicFeatures(im1, nfft,wind,nsamp,overlap );
[ featureMagn2_orig,featurePhase2_orig,featureStd2_orig ] = computeImageBicFeatures(im2, nfft,wind,nsamp,overlap );
im1_adjust=imadjust(im1);
im2_adjust=imadjust(im2);
[ featureMagn1_adjust,featurePhase1_adjust,featureStd1_adjust ] = computeImageBicFeatures(im1_adjust, nfft,wind,nsamp,overlap );
[ featureMagn2_adjust,featurePhase2_adjust,featureStd2_adjust ] = computeImageBicFeatures(im2_adjust, nfft,wind,nsamp,overlap );
%%%***%%%!!!%%%***%%%
areaSide=20; %% [1,5,10,15,20,25,30]
startDest=30;
startInit=col1-areaSide;
%%%***%%%!!!%%%***%%%
im1_fake1=im1; im2_fake1=im2;
im1_fake1(startDest:startDest+areaSide,:)=im1_fake1(startInit:startInit+areaSide
,:);
im2_fake1(startDest:startDest+areaSide,:)=im2_fake1(startInit:startInit+areaSide
,:);
[ featureMagn1_fake1,featurePhase1_fake1,featureStd1_fake1 ] = computeImageBicFeatures(im1_fake1, nfft,wind,nsamp,overlap );
[ featureMagn2_fake1,featurePhase2_fake1,featureStd2__fake1 ] = computeImageBicFeatures(im2_fake1, nfft,wind,nsamp,overlap );
im1_fake2=im1; im2_fake2=im2;
im1_fake2(:,startDest:startDest+areaSide)=im1_fake2(:,startInit:startInit+areaSi
de);
im2_fake2(:,startDest:startDest+areaSide)=im2_fake2(:,startInit:startInit+areaSi
de);
[ featureMagn1_fake2,featurePhase1_fake2,featureStd1_fake2 ] = computeImageBicFeatures(im1_fake2, nfft,wind,nsamp,overlap );
[ featureMagn2_fake2,featurePhase2_fake2,featureStd2__fake2 ] = computeImageBicFeatures(im2_fake2, nfft,wind,nsamp,overlap );
trasaturi=[ featureMagn1_orig featureStd1_orig featurePhase1_orig featureMagn2_orig featureStd2_orig featurePhase2_orig ;… featureMagn1_adjust featureStd1_adjust featurePhase1_adjust featureMagn2_adjust featureStd2_adjust featurePhase2_adjust;… featureMagn1_fake1 featureStd1_fake1 featurePhase1_fake1 featureMagn2_fake1 featureStd2__fake1 featurePhase2_fake1;… featureMagn1_fake2 featureStd1_fake2 featurePhase1_fake2 featureMagn2_fake2 featureStd2__fake2 featurePhase2_fake2];
figure,
subplot(4,2,1),imshow(im1); title('imagine1 originala'); subplot(4,2,2),imshow(im2); title('imagine2 originala');
subplot(4,2,3),imshow(im1_adjust); title('imagine1-ajustata'); subplot(4,2,4),imshow(im2_adjust); title('imagine2-ajustata');
subplot(4,2,5),imshow(im1_fake1); title('imagine1-fals tip I-ajustata'); subplot(4,2,6),imshow(imadjust(im2_fake1)); title('imagine2-fals tip I');
subplot(4,2,7),imshow(im1_fake2); title('imagine1-fals tip II'); subplot(4,2,8),imshow(imadjust(im2_fake2)); title('imagine2-fals tip II-ajustata');
3. Determinarea caracteristicilor bazate pe bicoerență a celor 54 imagini din baza de date:
close all clear all clc
originals_magn=[…]; originals_std=[…]; originals_phase=[…];
rectangle_magn=[…]; rectangle_std=[…]; rectangle_phase=[…];
ellipse_magn=[…]; ellipse_std=[…]; ellipse_phase=[…];
nr_bin=10;
hOM=hist(originals_magn,nr_bin)/nr_bin; hOStd=hist(originals_std,nr_bin)/nr_bin; hOP=hist(originals_phase,nr_bin)/nr_bin;
hRM=hist(rectangle_magn,nr_bin)/nr_bin; hRStd=hist(rectangle_std,nr_bin)/nr_bin; hRP=hist(rectangle_phase,nr_bin)/nr_bin;
hEM=hist(ellipse_magn,nr_bin)/nr_bin; hEStd=hist(ellipse_std,nr_bin)/nr_bin; hEP=hist(ellipse_phase,nr_bin)/nr_bin;
histM=[hOM' hRM' hEM']; histStd=[hOStd' hRStd' hEStd']; histP=[hOP' hRP' hEP'];
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Detectarea Regiunilor Falsificate In Imagini (ID: 149704)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
