🟡 Ֆիլտրեր

Grayscale

Նորից վերհիշենք, որ եթե պիկսելի բոլոր բիթերում գրված է զրո՝ 0x000000, դա նշանակում է, որ այն ունի սև գույն (պիկսելը ոչ մի գույն չի պարունակում)։ Եթե բոլոր բիթերում գրված է 1 0xffffff՝ պիկսելը ունի սպիտակ գույն (պիկսելը պարունակում է բոլոր գույները)։ Եթե փոփոխենք պիկսելի կապույտ, կանաչ, կարմիր գույների արժեքները այնպես, որ նրանք միշտ մնան իրար հավասար, ապա կստանանք մոխրագույնի տարբեր երանգներ։ Ընդ որոմ, ինչքան մեծ լինեն արժեքները (սպիտակ գույնի մոտ), այնքան ավելի բաց երանգով մոխրագույն կստացվի։ Եվ հակառակը, ինչքան ավելի փոքր լինեն արժեքները (սև գույնի մոտ), այնքան ավելի մուգ երանգով մոխրագույն կստանանք։

Այսպիսով, որպեսզի գունավոր նկարը ձևափոխենք սև-սպիտակ նկարի, մեզ անհրաժեշտ է ամեն պիկսելի կարմիր, կապույտ և կանաչ գույների արժեքները հավասարեցնել իրար։ Ընդ որում, եթե պիկսելում կարմիր, կապույտ, կանաչ գույների սկզբնական արժեքները մեծ են, ապա պետք է, որ նոր արժեքը նույնպես լինի «մեծ», և հակառակը։

Քանի՞ մոխրագույն երանգ կարող ենք ստանալ, եթե պիկսելը պահելու համար օգտագործվում է 24 բիթ հիշողություն։

Sepia

Sepia ֆիլտրը տալիս է նկարին «հնաոճության» էֆեկտ։

tower.bmp
out.bmp

Գոյություն ունեն Sepia էֆեկտին հասնելու տարբեր ալգորիթմներ։ Այս խնդրում մենք կօգտվենք հետևյալ ալգորիթմից՝ նկարի յուրաքանչյուր պիկսելի կապույտ, կարմիր, կանաչ գույների արժեքները հարկավոր է փոխարինել հետևյալ կերպ՝

sepiaRed = .393 * originalRed + .769 * originalGreen + .189 * originalBlue
sepiaGreen = .349 * originalRed + .686 * originalGreen + .168 * originalBlue
sepiaBlue = .272 * originalRed + .534 * originalGreen + .131 * originalBlue

Reflection

Reflection ֆիլտրը կիրառելուց հետո ստացվում է այնպիսի նկար, որը կստանանք եթե սկզբնական նկարը դնեք հայելու առջև։

tower.bmp
out.bmp

Այս էֆեկտը ստանալու համար, հարկավոր է նկարի ձախ կողմի յուրաքանչյուր պիկսել փոխարինել դրա աջ կողմի պիկսելներով։

Blur

Blur ֆիլտրը տալիս է նկարին «լղոզվածության էֆեկտ»։

courtyard.bmp
out.bmp

Գոյություն ունեն տարբեր ալգորիթմներ Blur էֆեկտը ստանալու համար։ Այս խնդրում, մենք կօգտագործենք «Box Blur» ալգորիթմը։ Պիկսելի յուրաքանչյուր գույնի (bgr) նոր արժեքը հավասար է նրա շրջակա պիկսելների համապատասխան գույների միջին արժեքին։

Պիկսելի նոր արժեքը հաշվելիս օգտագործվում է նրա անմիջական հարևան պիկսելների արժեքները (մեկ տող և մեկ սյուն հեռավորության վրա գտնվող)։ Այս օրինակում, 6 -րդ «համարի» պիկսելի կարմիր գույնի նոր արժեքը հավասար կլինի 1, 2, 3, 5, 6, 7, 9, 10, 11 համարի պիկսելների կարմիր գույների արժեքների միջին թվաբանականին (նկատեք, որ 6 -րդ համարի պիկսլը նույնպես մասնակցում է հաշվարկում)։

grid.png

Նմանապես, 11-րդ «համարի» պիկսելի յուրաքանչյուր գույնի արժեքը հաշվելիս հարկավոր է միջինացնել 6, 7, 8, 10, 11, 12, 14, 15, 16 համարի պիկսելների համապատասխան գույների արժեքները։

grid 2.png

Եթե պիկսելը գտնվում է «եզրի» վրա, հաշվարկին մասնակցում են միայն գոյություն ունեցող հարևանները։ Օրինակ՝ 15 համարի պիկսելի արժեքը հաշվելու համար հարկավոր է օգտագործել 10, 11, 12, 14, 15, 16 համարի պիկսելները։

grid copy.png

Ձեր խնդիրը փոքր-ինչ թեթևացնելու համար մենք արդեն իսկ գրել ենք ծրագրի մի հատվածը։ Այն կարող եք գտնել՝ սեղմելով “projects” կոճակի վրա։

Untitled

Ինչպես նաև կարող եք ներբեռնել ծրագրի կոդը։

Ձեզ մնում է միայն իրականացնել համապատասխալ ալգորիթմները filter.cpp ֆայլում։

Constraints

Time limit: 0.2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue