Scrierea vectorizer imagine
Scrierea vectorizer imagine
Cu ajutorul vectorizer imaginii poate traduce o imagine raster într-o formă vectorială. Vectorizer identifică contururile de bază ale unui algoritm specific, astfel încât rezultatul muncii sale este întotdeauna mai rău decât de rutare manuală. Cu toate acestea, utilizarea sa poate fi justificată în cazul în care este necesar să se urmărească un număr mare de imagini, sau în cazul în care imaginea are un contur ascuțit și conține puține tranziții semitonuri. Rezultatul său în programul salvează fișierele ILDA.
Aici ne uităm la modul de a scrie un astfel de program, și ar trebui să acorde o atenție. În dezvoltarea instrumentelor sale am folosit algoritmi mai simple.
În general, un proces de vectorizare implică mai multe etape: filtrarea vectorizarea a imaginii în sine și ștergerea.
1. Filtrarea.
Filtrarea imaginii este necesară pentru a identifica contururile, care apoi va rula trasor. În același timp, producția celor două imagini vor fi formate: (binar) imagine alb-negru - trasor hartă mișcare și imaginea color pe acel router va fi vopsit în vectorii de culoare dorite. Toate contururile generate la pixelul de ieșire au o grosime de 1 - condiție pentru vectorizer muncă calitativă.
Fiecare pixel din imagine este reprezentată de trei componente de culoare. schimbare bruscă a valorii componentei este de natură să indice prezența circuitului. Acesta ar trebui să prezinte prag de luminozitate scăzută pentru declanșare, deoarece la luminozitate scăzută a crescut nivelul de zgomot (acest lucru este cel mai clar vizibil în imaginile în format JPG). În general, putem spune că aici există o filtrare luminanță de înaltă frecvență. Am încercat neskoltso algoritm criptografic: FFT și o simplă scădere de pixeli învecinate. Rezultatul este o simplă scădere de mine mai mult ca, este ceea ce am folosit.
Imaginea poate fi scanată de la stânga la dreapta. Ie în termen de o linie se scade din următorul pixel anterior. În același timp, observăm că liniile care rulează în paralel cu liniile dispar ca aici, acestea sunt reprezentate de componente de joasă frecvență.
Un efect similar se produce atunci când scanarea se realizează de sus în jos.
Acum, cu ajutorul chirurgiei sau a fuziona cele două imagini ale matricei și a obține ceea ce avem nevoie.
astfel în programul am folosi cu dublă scanare.
Imagini cu tranziții fine de culoare, de regulă, nu generează contururi clare. În acest caz, adâncimea de culoare poate fi redus prin tăierea LSB.
2. Vectorizare.
Ca un trasor am ales algoritmul recursiv 8-conectat pentru umplerea cu semințe, în timp ce modificați pentru a satisface nevoile dumneavoastra.
La rândul său, se deplasează toate pixelii hărților de imagini binare. De îndată ce este detectat un pixel contur (pixel alb), atunci este o sămânță și acest loc se execută trasor. Tracer verifică 8 pixeli adiacenți și dacă cel puțin una dintre ele permite mișcarea cauzată de funcția de copiere obișnuită trasorul. În acest caz, stiva este copiat pentru a coordona și culoarea următorului pixel pe care a existat o tranziție. Iar pixelul actuală a hărții de mișcare revopsite negru - astfel încât să se evite re-urmărire a aceluiași pixel. Pentru a evita o depășire de stivă în apelurile adăugate la contorul de funcții.
Dacă urmele am ajuns la ultima linie a pixelului și vecine 8 puncte nu permit mișcarea, linia este punctul blanking închis (punctul martor) și continuă procesul de găsire a unei noi semințe (de ex. Căutarea unui nou punct alb). Această fază durează atât timp cât procesul de sortare, nu ajunge la punctul final al imaginii.
Funcția simplificată trasor arată astfel:
StackCounter = StackCounter + 1
Cu VStack (StackCounter)
.X = X
.Y = Y
.R = ImageMatrix (X, Y) .Red
.G = ImageMatrix (X, Y) .Green
.B = ImageMatrix (X, Y) .Blue
Cu End
Dacă ImageMatrix (X + 1, Y) .Status = 1 Apoi „Dreapta
Call Wave (ImageMatrix, X + 1, Y)
End If
Dacă ImageMatrix (X, Y + 1) .Status = 1 Apoi „jos
Call Wave (ImageMatrix, X, Y + 1)
End If
Dacă ImageMatrix (X - 1, Y) .Status = 1 Apoi „stânga
Call Wave (ImageMatrix, X - 1, Y)
End If
Dacă ImageMatrix (X, Y - 1) .Status = 1 Apoi „sus
Call Wave (ImageMatrix, X, Y - 1)
End If
Dacă ImageMatrix (X + 1, Y + 1) .Status = 1 Apoi „jos dreapta
Call Wave (ImageMatrix, X + 1, Y + 1)
End If
Dacă ImageMatrix (X - 1, Y + 1) .Status = 1 Apoi „stânga-jos
Call Wave (ImageMatrix, X - 1, Y + 1)
End If
Dacă ImageMatrix (X - 1, Y - 1) .Status = 1 Apoi „stânga-sus
Call Wave (ImageMatrix, X - 1, Y - 1)
End If
Dacă ImageMatrix (X + 1, Y - 1) .Status = 1 Apoi „dreapta sus
Call Wave (ImageMatrix, X + 1, Y - 1)
End If
end Sub
3. ștersături.
În timpul funcționării generate punctul trasor (sau vector), la o distanță de un pixel unul față de celălalt. O astfel de densitate mare de pixeli nu permite afișarea imaginilor pe un proiector cu laser. Prin urmare, este necesar să se reducă numărul de puncte.
Cele mai multe doar o fac pe liniile verticale și orizontale ca una dintre coordonatele vor fi întotdeauna constantă.
De asemenea, este ușor de tăiat punctele situate în mijlocul celorlalte două cu un singur pas. Alte cazuri sunt mai problematice, deoarece este necesar să se recunoască o linie dreaptă și verificați cu o anumită toleranță, dacă este sau nu sub el punctul de abordare. Această metodă de aici nu a fost realizat.
Cu o probabilitate mare se poate spune că liniile care conțin un număr mic de puncte (2-5) sunt zgomot. Prin urmare, acestea pot fi eliminate în condiții de siguranță, fără a compromite calitatea imaginii.
Optimizarea în continuare a traseului fasciculului și densitatea punctelor nu am făcut din Aceasta este sarcina pentru programe speciale.
Ca rezultat al experimentelor sa dovedit aici programm:
Descărcați fișierele executabile de program.
Acest program este o aplicație pe 32 de biți. Arhiva include numai fișiere executabile. În cazul în care pornire se va afișa un mesaj care îi lipsește orice COMDLG32.OCX tip de fișier, etc. atunci ar trebui să executați programul de instalare orice program scris în Visual Basic 6. Instalați Visual Basic în sine.