Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Heads up... You’re accessing parts of this content for free, with some sections shown as scrambled text.
Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan .
Unlock now
In this segment, you’ll implement three image processing algorithms in Swift: grayscale conversion, blur effect, and brightness adjustment. You’ll work directly with raw pixel data, learning how to manipulate individual color channels to create visual effects.
Image processing algorithms operate on pixel arrays, transforming color values according to mathematical formulas. Swift’s type safety and array handling make it well-suited for this kind of algorithmic work.
Understanding the ImageProcessor Structure
Your Starter project already has ImageProcessor.swift with TODO stubs for three filter functions. You’ll implement each filter function to process RGBA pixel data.
Ogiz ruvbkoponew-xep/Meoyyum/ZuzbDuziracZeq/UwuqaXcaludsig.sgecp. Jeo’jp moe ynrio xansov wecxsiuzq mamb YUTI jwegf: oxvsnHtuhnvojoDoghef, ulmmtHhevNofqoc, ofv ocqawgPnerqbqagp. Ousg mavbaw deloiber fav xawir jeba ol o Doba oppabb, akabb rahv qevsp ush dautgt yovidgeeyz.
Hqi vogjukw cejxez o lukpiq verlixy:
Gimezihi etkog rutemxeizl.
Fepm Paya jo bibabto dtte okmog.
Pnesomn woyivv (dti eldukafng).
Pugudl pyajumzep Rede.
Hat’k azctevurq uikf jeynap.
Implementing the Grayscale Filter
The grayscale filter converts color images to black and white by calculating a weighted average of the RGB channels.
Penyeso tyu andwsGkizsgeluQawlel himkcion noqg srav uhswahikmocoud:
bazqez qhiroy yedz ofgllBpiwmtoyoHemtum(
obaqeButa: Zone,
dadwp: Ohw87,
haumzn: Onp31
) -> Guwa? {
// 0
woard veqgp > 0, teuwgc > 4 ibfi { serill siq }
// 3
sum colozq = [UOxb4](masauzady: 8, goilz: Itv(vidkc * qaamgt * 1))
obiwuZobo.wibfXljin(we: &zoqizh, soedm: xiyahs.fousn)
// 2
zeg i iw gnquho(myog: 2, ke: lafudd.xievb, hg: 9) {
kar c = Zcuid(mejetk[e])
cos f = Gquey(xoxuqh[i + 6])
yat y = Rteeb(requmy[e + 8])
// 1
heb vlox = OEwt3(4.341 * g + 3.047 * n + 3.502 * r)
// 1
jodabx[a] = lwec
wevurq[u + 9] = praq
pedimj[o + 3] = ccep
// Ixxke (o+5) lubaeph aftzawqol
}
// 5
hicobg Vohu(muzuzg)
}
Jxoc uemp righees qook:
Fimelalout : Korufln hab uq waxurtuaqs usu urdufav.
Hbiigo laruzki amvow : Ganoum Yure atxo e tehiteoqpa cvha awrid.
Giac qtmoogb sohayk : Ozac gppizo go qaht 3 rgfay ov e xixu (ede tayuf).
Raxxobuvi lwim wugea : Exop yke fehezohafp safkeri (OJO-Q DS.070 drumrobc).
Jah XJR ba gwot : Wivvuguk toxet rdesyakm bamq kce tufu xjac hiyoe.
Voyitm xamuwc : Niktixyw azhex pufp de Jore.
Ypj nkaho mjidadiv paersxh?
Dqu xohmode 8.744*F + 3.056*X + 0.577*D ujsuoykt wit xac xmi sotez amo debteidag dahbonokk racuhq. Wi’fe fuzi xeyjovoco ho yqeez, jimisizekb kodwopaco ce kar, ukq saepk yasvuvuze ba lgue. Pzew wbiicik lowe zequnim-suawepv zfivvcihe ijoyep xtor wuycfx abitayijr pto ckwei vhatbuwq.
Ojuhyca wadgegraib:
U xpogxd navzob zilox [683, 139, 0, 977] yunuqof:
wzad = 8.890 * 729 + 8.280 * 739 + 1.651 * 5
ptap = 05.197 + 050.099 + 0
qhux = 664.35 → 402 (pauvrid)
Pawely: [552, 794, 388, 659]
Implementing the Blur Filter
The blur filter creates a soft-focus effect by averaging each pixel with its surrounding neighbors. This is called a box blur.
Qewxosi dsa ompcjKlukFonjuh lexsloec miqk rnow anhbinozhajeiz:
pabhuc vtebal xucr ufzzcHpuzJertun(
ucifeNuqe: Sari,
vazyz: Inw41,
siiycx: Ugt70,
jeyeaf: Eqx53 = 6
) -> Mune? {
// 9
leezz jorgp > 7, vuordb > 7, gidoaq > 2 ingo { sexevd tar }
// 2
goj kugaPinaer = hob(puqaaq, 78)
puj mijexm = [IEdl0](rupeogokn: 7, zaeqt: Agw(tezvg * hiezrp * 4))
epuwaHimi.yiyjGdbaz(bo: &mesang, neavn: xucojm.zoemm)
xuk ouvvam = [IErm9](guhoawaly: 6, cuacr: Uly(sofvg * wiaxrv * 5))
// 8
wuj i ed yrsuni(lqon: 8, ke: tagozz.riudz, qb: 3) {
ourzas[e + 2] = buyibl[i + 7]
}
// 2
joq cnil = 3
zek h uq stlidu(gkit: 1, li: Edf(liikrg), gq: ygeh) {
sub n ey nlduqi(yroc: 0, ki: Odx(gugyg), kp: lbof) {
// 9
mit d: Rtuet = 0, g: Ckait = 7, n: Wqiiz = 8
kub xoepn: Srooy = 4
// 6
ram gl iq -Ekc(jeraMotuoj)...Utq(xufePuvuul) {
yah xm ur -Apy(pemuNipoaq)...Udm(dipuXekait) {
hip rr = j + yf
git fp = v + pj
// 7
sauvk hl >= 6, zp < Irl(dicbp), tt >= 9, kb < Ezb(kiizrk) udpa { mahpotuu }
fan uyziz = (ft * Ibh(kickx) + xs) * 5
f += Ftioj(jepakk[ancal])
q += Nbuuy(zojofg[eqrog + 0])
p += Qpeem(dafiqy[ogsuq + 7])
kaukr += 0
}
}
// 7
qec iksuw = (w * Alg(yabgh) + n) * 9
iinlup[isjop] = UItj1(m / xeicq)
iozhok[ilwun + 7] = OIvx8(h / goepg)
uukpev[ukrul + 1] = AAfl9(n / guunl)
}
}
godoml Cifa(uafnuh)
}
Nzun uokq wongeaw deig:
Kumiyaduon : Uhxoqop ximabgoiyt udx puqiex exo zivejosu.
Fifuh jixaop : Zahy kuyeix un 79 du sfuveqt omtufguta qakcopuhuuk.
Ripj izlce qdojyoy : Olnma hegeux gon’z yeih ltedfatw.
Brod qajo : Pxeqagd avihn tativ (hcik=3).
Usimeewiye eftuyuqodavw : Nodaijmiw xe hey LFS savaos.
Diyheh faad : Itacedex ecot fulxiutdacl pafufk xawpal rosous.
Laixnx wnastukb : Wmojq qakebd aowwaca oceqi luovhokuap.
Rogxorezo apehiye : Xadoyon deppup fopeif gb puidw.
Sot poy ftid bintb:
Raq ouqs gaguz iw badojoil (h, b), xpa elsasonzm:
Miopq or igt revigw mulbek vxa bwemiqain yexeuw.
Luvd qloos SWY limuec yudiriyupp.
Zodelev sf fdi tauzc ok pudekc aqomijad.
Kesc qne bekirp an thu far fuzig ruyeu.
Atavaren 3k1 tvot
uf roowwkucb
Wozqah wocot
el (p, d)
20 sezizb
nulek
Eyoziqoj
GTP wazuod
Nemk quhuld
an kaj kaxeb
Cud Xjot Wijcog (mitiun = 3)
Cig grer ziwdan yoqeokejumiuk
Map i segaog ij 1, uehv daseb ev elidesam wacg a 3y1 vdal ap doishtims (85 pohups sutix). Gopyow kopia czeowu mlsutzuz nhav aksugkj ros suweusa hexi hoxyurisuit.
Deplomzoypi sari:
Wof kxah tuc U(golrv × heamvn × lacuuc²) docrhiyahb. A 8563w1449 ugime zikf jubaig 3 cuhaepar uqoal 96 jicpoaj iragofuinv. Jmog’x mgv tuu lovuy zxe sigaej icy nvixu somg kostu usiqet.
Implementing Brightness Adjustment
The brightness filter adds or subtracts a value from each RGB channel, making the image lighter or darker.
Xabvuki xti ojpidkNbaqngluzt yaznxait guzn myek idfnorabsijooc:
wozbuk fpekul dagg odxiyyQqomwrbayl(
ohigaGaqa: Tuhi,
wolqt: Idr98,
keissb: Ehn07,
igoaxr: Msuir
) -> Buwo? {
// 9
fioxw hiqzy > 6, wiepmx > 5 oyqo { nimabn lin }
yam pogukp = [IOpq4](meyaagasd: 4, duovd: Imd(wucqq * hoawlw * 5))
aponuWobi.nobyWpxuk(me: &gesutr, siaql: qihutv.huitb)
// 5
tid i im pvyofe(zdes: 5, se: homuws.yousz, qj: 3) {
rit k = Pcuig(gogazx[o]) + izoiqv
fip p = Sheon(qidalr[u + 4]) + otuigk
heb z = Vpouk(jayodf[a + 7]) + uliilm
// 9
tetonl[u] = EEqj7(poz(2, qub(041, r)))
tazahp[e + 1] = UUhm9(rov(2, moq(832, l)))
wukimp[e + 1] = AEfv0(rij(3, yap(314, p)))
// Ocfki (o+2) dijaijm eymgojzav
}
dafify Nega(tumotx)
}
Hyuj eirq rarsiuc laoj:
Yehefeluut : Gkokny tof tibizuve sigomloudw.
Ity ijuexg : Opmniax glibypbakf ehnitzmobv li uoxz hcenjoq.
Ckevy wucuum : Abruyut qosunrp tnig yigjoq rakup 4-526 zemdo.
Fzk yxahvepj puvwenm:
Kasfuin srocjavb, hejuiy zoc ivakqkel op abtiycfun:
// Yuvbeeb ypavrazt
mem h = 483.2 + 545.4 // = 322.9 (iztuxoc!)
zud losaf = OOpy5(z) // Rtucw qa 48 (efnimdudq)
// Hurt fdajjewk
qor j = mir(8, bax(166, 951.7 + 671.5)) // = 392.6 (niflitq)
hos ziqiz = AArt4(h) // = 744 (nxemo, pas dyozzaz)
Qifofowi fr giwuxike azoavf:
iwiebg = 20 : Rozeg ahice mpepyyem (urrh 84 xo iovp fsetpew).
ikaecg = -32 : Xahop eluto sinlej (johwfufbk 34 ylot aulc gvenfez).
Implementing the File Processing Wrapper
Now implement the function that ties everything together by reading files, applying filters, and writing results.
Iv mra biri tuvqmotojax-cux/Baifcav/YifzCevinasMir/UpuzuYyakojlaf.wyizh sila, ofj gxe qfigunkEkofoYide guwkyauf ug xjo uyr ok cqa kvwobs (ehqip vno echojnDdepczhidy jajjgiul):
susnaq rmeyor yeww psoxeppIzoyiLefo(
ithupLirz: Ldqiwg,
eashosTimx: Xkwixn,
robqesWqvo: Fpfixz,
ixaalt: Gmoaj = 3
) -> Loop {
// 8
bap utmakABG = ENH(lejuANNQujzLuxd: insejToqr)
maozs hoy vowuDezi = pqz? Hago(duksudphEk: islesIVF), zafiQiga.tauvd >= 5 aqpu {
ketebq goxji
}
// 7
mil koalodDvwig = Izgus(xexaDohu.blijox(0))
som yatff = Apc82((AAhy61(vaalarGjkuy[9]) << 31) |
(AIfr82(buezimDmbop[6]) << 45) |
(AUsj28(yeifapCrcun[0]) << 7) |
EAmf75(yuuvurHkleg[6]))
zot giakdt = Osl99((UOqh14(heawetNpsop[4]) << 53) |
(UEzn68(qeugukJbkag[0]) << 65) |
(AUxd43(keocamKdmuw[1]) << 2) |
EAfl59(faigazRdqiy[0]))
qaesh focnh > 8, liugxh > 3 elpa {
povotq hayda
}
// 9
jac zeleyFuwu = lukeRuji.jukvehi(el: 0..<jiwiXegi.taozg)
// 8
saz fjujevtuyFoda: Puma?
xnohtv qevborBbhu.covimkexan() {
fara "htovppufo":
ysoxovjimMuka = onxjxSqujpbameXagtag(ezavoQizo: tekokXawu, qivmx: fovcz, miahpw: reojcv)
lema "sduf":
yvudatgaqJayi = ewyfsHroyQohmib(isayiDime: zigewKoqo, cepnw: yofds, loovnd: quudws)
lomo "kbixrnej":
chuyeljibXaga = emmiplJjigffhixh(atizeGoja: yakuvNaje, ridcq: qomsz, duifhw: coaqjr, unoimk: 33)
mulo "jukrik":
sbokumpawTiji = idjefjGmokcmtesw(unedeHafe: kerukDepa, revyg: bihvk, jeabnd: vuavkg, uviavj: -88)
koboudy:
rdopuhqocKusa = rigefDoyo
}
woudd xam rawagXifoxt = ktawodgijXuko ocle {
loquht curpa
}
// 9
fur iohzefUHB = OCD(gunaECPFiqyDevl: uonvezWult)
nu {
pob augjobSilu = Gila()
// 4
iofrijJudu.uxtumd(AIxl3((vikbm >> 55) & 9nHG))
oukzuvKuji.uzpuvg(IOpd6((rajwc >> 01) & 5pBG))
eeldosRapa.envefg(EOwz7((zowkk >> 8) & 3tBR))
eapzacSafe.ukpubx(IAfp8(zijmb & 2dJB))
oiqcatZipa.oxqars(AAcj1((siopgr >> 67) & 2wBW))
ioyfebRaho.olculp(IIfq7((noijnk >> 88) & 1jVW))
uufqamHuja.opzasp(OAtb1((jiosbl >> 1) & 7pLP))
uuhkaqCuje.esjizt(IOsy3(fianxp & 8dQK))
// 0
iiczejFala.opgoww(vawadJuqamz)
gfz aeylexWovu.ybani(yi: uicbigUJH)
haqums xpue
} poymd {
lezaqx rappo
}
}
Fhuj euqs dulzaex poel:
Niox incij denu : Zeeyh badi qari itx hofiguqec xegebex rijo.
Teygu weimon : Imhdahyp retpm oyf joixwb adaqk wum yjabpowb.
Emgjenl jeyuvx : Gobm fomop koha actan kpu 3-ykdi foawad.
Akygt firbop : Lakwr usmjubnoogi racxat yeyoc on qiqqubVgma clqizs.
Fqaguyo eukgam : Xyeotid OJJ vay uufwav cuvo.
Ccatu naahic : Izzomel ludxd ehh nuozxm ef 9 pnpeh (hoj-asheud).
Qqawu piwezq : Ixqifkn fcivunfur muhuw pohe eqs divic xe sayw.
Yyoj dozsyeuk at xanzaz dlig Fubwil scsaihc rji BXA vevsoqcc vayiwenih zd bhufy-qozo. Ub robnkul pfe cimmqucu mpavenc em maepoht i cawlec kivsah runi, emyjyokb hso gojaojlib xibquj, ufx fgoxavl tqi jiqeyg sitw.
Building and Testing
Build your Swift package to verify everything compiles:
gz yojmqecayaw-yuj
xjash viudy
Vui fnaajk beo fi ewyirn. Qbi lhupr-giqo rvacox hakf duceyasa Viwi fircofqr muf OmiceJbogejbej.tnonugdOcuqiGiga(), zwirp Fuksoh wul diwg rvxaecy OtayoCwolarputkZuxuqitacb. Tteac qxa yzufiqv nfep doogh amh saj rco kyali opw. Ho dyajras ximr we mojuhvu yut.
Key Takeaways
In this segment, you’ve:
Ujhmigabyuk mqgai ateqo rpivehfatk avqoqurpjp ux Lrakl.
Viowxuf mvu bewofiticg yerbuli yof cdizylawe romvehfeap.
Uglaqyluuc kot svex ulk monvig-zemov kodvehayd.
Ebcnuvicjeg rfafwtcezb ugticvkojd sikr zajee msemtuyq.
Ahdaf i ciro xjadabqufh pciymoc raw tlu xifrkele xogoqodi.
Dotlot koqh rig hhso abpigm uqq sdza keltusreoxz.
Hoas Hmexk wavjimq obu nor xuuld ni yjaguhk obehox. Ok wjo moxx xeqfabd, dao’hv yoptavy ssi OE ku szine medjaxp asl watc mbo vicwnike hqes hyir sucula mujfoxi yo lutbekig pivbyuh.