Originaalne filtri disain

Tegin kaua aega tagasi ühe 2D pildi filtri ja see on jäänud meelde kui huvitav kogemus. Olles õppinud ära mõned pilditöötluse põhilised manöövrid nagu pikslite värvi muutmine, lävendi filtrid, regioonide leidmine jne, on 2D filtrite loomine suhteliselt loominguline tegevus. Antud filtri idee tekkis pildi regiooni perimeetri leidmisel ja on tegelikult väga lihtne.

Oletame, et on isoleeritud üks regioon, tehes mingi lävendi operatsiooni. Võtame selle regiooni perimeetrist ühe piksli ja vaatame ta ümbruskonda (8 pikslit ).

img0

Märgime kõik pikslid, mis ei kuulu regiooni mingi arvuga, mille otstarve selgub hiljem. Siin on see 10. Siis võtame järgmise piksli ja toimime täpselt samamoodi.

img1

img2

Peale mõnda aega on tulemus selline.

img3

Siis võtame need pikslid, mis moodustavad perimeetri ( siin number 10-ned ) ja toimime samamoodi, ainult, et 10-ne asemel on nüüd 9, siis 8 jne. Varsti on tulemus selline.

img4

Ja ei maksa unustada, et alguses olid antud need pikslid.

img5

Peaks üsna selge olema, mida see filter teeb. Üks variant sellest on kui sisendiks on mingid maksimaalsed väärtused, mis on näiteks 255 ning väljundiks on sujuvad üleminekud 255 pealt kuni 0-ini. Veits keerulisem variant on, kui sujuvalt muutuvate numbrite peale on määratud mingi funktsioon, nagu siinus. Selle filtri ehitamiseks on palju mooduseid ja optimeerimine päris põnev. Tahaks saavutada reaalajas kiiruse kasvõi ainult väikeste resolutsioonidega.

Sisend.

input1

Väljund.

output1

Nagu näha on antud pildil sisendiks mitu regiooni ( tähte ),  sel juhul tuleb kõigil regioonidel kõigepealt leida 10, siis 9 jne ( või siis 255, 244, jne ). Selles mõttes, et ei tohi ühel regioonil leida kõiki kümmet ja siis teisel. See on vale. Ja kui mingil hetkel kahe regiooni suurenevad perimeetrid põrkuvad, siis lihtsalt töö peatub ja jätkub mujalt. Vähemalt niimoodi tehes tekib regioonide vahele konstantne kurvatuur, mis on sel juhul filtri üks omadusi.

Kood selle jaoks on üsna kompaktne ja ilus, kuna eesmärk on hästi defineeritud. Otsustasin siiski mitte koodi postitada, kuna seda on võibolla rohkem kui ühe lugemisega viitsib läbi vaadata.

Advertisements