🟡 Ֆիլտրեր

 
🤖
Այս խնդում մենք կգրենք ծրագիր, որը կձևափոխի մուտքային նկարը, կիրառելով նրա վրա մի քանի հայտնի ֆիլտրներ`
  1. Grayscale - նկարը դարձնում է սև և սպիտակ
  1. Sepia - նկարին տալիս է «հնության» էֆեկտ
  1. Reflection - նկարի հայելային արտապատկերում
  1. Blur - նկարին տալիս է "լղոզվածության” էֆեկտ

Grayscale

Նորից վերհիշենք, որ եթե պիկսելի բոլոր բիթերում գրված է զրո՝ 0x000000, դա նշանակում է, որ այն ունի սև գույն (պիկսելը ոչ մի գույն չի պարունակում)։ Եթե բոլոր բիթերում գրված է 1 0xffffff՝ պիկսելը ունի սպիտակ գույն (պիկսելը պարունակում է բոլոր գույները)։ Եթե փոփոխենք պիկսելի կապույտ, կանաչ, կարմիր գույների արժեքները այնպես, որ նրանք միշտ մնան իրար հավասար, ապա կստանանք մոխրագույնի տարբեր երանգներ։ Ընդ որոմ, ինչքան մեծ լինեն արժեքները (սպիտակ գույնի մոտ), այնքան ավելի բաց երանգով մոխրագույն կստացվի։ Եվ հակառակը, ինչքան ավելի փոքր լինեն արժեքները (սև գույնի մոտ), այնքան ավելի մուգ երանգով մոխրագույն կստանանք։
ℹ️
Անցեք հղումով և փորձեք կարմիր, կանաչ, կապույտ գույներին տալ իրար հավասար տարբեր արժեքներ, որպեսզի վիզուալ տեսնեք մոխրագույնի երանգները։
Այսպիսով, որպեսզի գունավոր նկարը ձևափոխենք սև-սպիտակ նկարի, մեզ անհրաժեշտ է ամեն պիկսելի կարմիր, կապույտ և կանաչ գույների արժեքները հավասարեցնել իրար։ Ընդ որում, եթե պիկսելում կարմիր, կապույտ, կանաչ գույների սկզբնական արժեքները մեծ են, ապա պետք է, որ նոր արժեքը նույնպես լինի «մեծ», և հակառակը։
👩‍💻
Պիկսելի նոր արժեքը ստանալու համար, հարկավոր է նրա յուրաքանչյուր գույնին (կապույտ, կանաչ, կարմիր) վերագրել բոլոր 3 գույների միջին արժեքը։ Եթե կիրառենք այս ալգորիթմը պատկերի բոլոր պիկսելների համար, կստանանք սկզբնական նկարի սև-սպիտակ տարբերակը։

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

Sepia

Sepia ֆիլտրը տալիս է նկարին «հնաոճության» էֆեկտ։
notion image
notion image
Գոյություն ունեն Sepia էֆեկտին հասնելու տարբեր ալգորիթմներ։ Այս խնդրում մենք կօգտվենք հետևյալ ալգորիթմից՝ նկարի յուրաքանչյուր պիկսելի կապույտ, կարմիր, կանաչ գույների արժեքները հարկավոր է փոխարինել հետևյալ կերպ՝
sepiaRed = .393 * originalRed + .769 * originalGreen + .189 * originalBlue
sepiaGreen = .349 * originalRed + .686 * originalGreen + .168 * originalBlue
sepiaBlue = .272 * originalRed + .534 * originalGreen + .131 * originalBlue
ℹ️
 Այս գործակիցները ընտված են փորձարկումների հիման վրա։ Դուք կարող եք փոփոխել դրանք և Sepia ֆիլտրի այլ վարիացիաներ։
⚠️
Նոր արժեքը հաշվելուց ստացվում է սահող կետով թիվ, որը անհրաժեշտ է կլորացնել դեպի մոտակա ամբողջ թիվը։
⚠️
Հիշե՛ք, որ պիկսելի յուրաքանչյուր գույնը զբաղեցնում է 8 բիթ հիշողություն։ Հնարավոր է, որ ստացված նոր գույնի արժեքը մեծ լինի 255-ից (չտեղավորվի 8 բիթի մեջ)։ Հարկավոր է ամեն գույնի նոր արժեքը սահմանափակել 255-ով։

Reflection

Reflection ֆիլտրը կիրառելուց հետո ստացվում է այնպիսի նկար, որը կստանանք եթե սկզբնական նկարը դնեք հայելու առջև։
notion image
notion image
Այս էֆեկտը ստանալու համար, հարկավոր է նկարի ձախ կողմի յուրաքանչյուր պիկսել փոխարինել դրա աջ կողմի պիկսելներով։

Blur

Blur ֆիլտրը տալիս է նկարին «լղոզվածության էֆեկտ»։
notion image
notion image
Գոյություն ունեն տարբեր ալգորիթմներ Blur էֆեկտը ստանալու համար։ Այս խնդրում, մենք կօգտագործենք «Box Blur» ալգորիթմը։ Պիկսելի յուրաքանչյուր գույնի (bgr) նոր արժեքը հավասար է նրա շրջակա պիկսելների համապատասխան գույների միջին արժեքին։
Պիկսելի նոր արժեքը հաշվելիս օգտագործվում է նրա անմիջական հարևան պիկսելների արժեքները (մեկ տող և մեկ սյուն հեռավորության վրա գտնվող)։ Այս օրինակում, 6 -րդ «համարի» պիկսելի կարմիր գույնի նոր արժեքը հավասար կլինի 1, 2, 3, 5, 6, 7, 9, 10, 11 համարի պիկսելների կարմիր գույների արժեքների միջին թվաբանականին (նկատեք, որ 6 -րդ համարի պիկսլը նույնպես մասնակցում է հաշվարկում)։
notion image
 
Նմանապես, 11-րդ «համարի» պիկսելի յուրաքանչյուր գույնի արժեքը հաշվելիս հարկավոր է միջինացնել 6, 7, 8, 10, 11, 12, 14, 15, 16 համարի պիկսելների համապատասխան գույների արժեքները։
notion image
Եթե պիկսելը գտնվում է «եզրի» վրա, հաշվարկին մասնակցում են միայն գոյություն ունեցող հարևանները։ Օրինակ՝ 15 համարի պիկսելի արժեքը հաշվելու համար հարկավոր է օգտագործել 10, 11, 12, 14, 15, 16 համարի պիկսելները։
notion image
 
Ձեր խնդիրը փոքր-ինչ թեթևացնելու համար մենք արդեն իսկ գրել ենք ծրագրի մի հատվածը։ Այն կարող եք գտնել՝ սեղմելով “projects” կոճակի վրա։
notion image
Ինչպես նաև կարող եք ներբեռնել ծրագրի կոդը։
Ձեզ մնում է միայն իրականացնել համապատասխալ ալգորիթմները filter.cpp ֆայլում։
⚠️
Տվյալ պահին տեխնիկական պատճառներով այս խնդրի ավոտմատ թեստավորումը անհասանելի է։ Ծրագիրը լոկալ թեստավորելու համար կարող եք օգտվել հետևյալ bmp ֆայլերից։
 

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