From a036e8781574888130ecbe2002237bcccbde0d83 Mon Sep 17 00:00:00 2001 From: omsontakke1 Date: Sun, 5 Apr 2026 16:27:54 +0530 Subject: [PATCH] task 1 solution --- task1/convolution.hpp | 32 ++++++++++++++++++++ task1/include/convolution.hpp | 32 ++++++++++++++++++++ task1/sol1.cpp | 54 ++++++++++++++++++++++++++++++++++ task1/sol2 | Bin 0 -> 40616 bytes task1/sol2.cpp | 51 ++++++++++++++++++++++++++++++++ 5 files changed, 169 insertions(+) create mode 100644 task1/convolution.hpp create mode 100644 task1/include/convolution.hpp create mode 100644 task1/sol1.cpp create mode 100755 task1/sol2 create mode 100644 task1/sol2.cpp diff --git a/task1/convolution.hpp b/task1/convolution.hpp new file mode 100644 index 0000000..0b506e5 --- /dev/null +++ b/task1/convolution.hpp @@ -0,0 +1,32 @@ +/* +MIT License + +Copyright (c) 2023 Society of Robotics and Automation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ +#ifndef CONVOLUTION_HPP +#define CONVOLUTION_HPP + +#include + +cv::Mat convolve(cv::Mat, cv::Mat); // Declaring which function to be accessed while linking the two cpp files + +#endif + diff --git a/task1/include/convolution.hpp b/task1/include/convolution.hpp new file mode 100644 index 0000000..0b506e5 --- /dev/null +++ b/task1/include/convolution.hpp @@ -0,0 +1,32 @@ +/* +MIT License + +Copyright (c) 2023 Society of Robotics and Automation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ +#ifndef CONVOLUTION_HPP +#define CONVOLUTION_HPP + +#include + +cv::Mat convolve(cv::Mat, cv::Mat); // Declaring which function to be accessed while linking the two cpp files + +#endif + diff --git a/task1/sol1.cpp b/task1/sol1.cpp new file mode 100644 index 0000000..c7f1714 --- /dev/null +++ b/task1/sol1.cpp @@ -0,0 +1,54 @@ + +#include +#include +#include +#include +#include +#include "convolution.hpp" + + +using namespace std; +cv::Mat convolve(cv::Mat, cv::Mat); +int main() +{ + cv::Mat img = cv::imread("./assets/hogwarts.png", cv::IMREAD_GRAYSCALE); + if (img.empty()) { + cerr << "Could not load image at ./assets/hogwarts.png\n"; + return -1; + } + cv::resize(img, img, cv::Size(img.cols*0.5, img.rows*0.5)); + + // The two kernels — do not change these + cv::Mat K1 = (cv::Mat_(3, 3) << + 1, 2, 1, + 0, 0, 0, + -1, -2, -1 + ); + + cv::Mat K2 = (cv::Mat_(3, 3) << + 1, 0, -1, + 2, 0, -2, + 1, 0, -1 + ); + cv::Mat gaussian_v1 = (cv::Mat_(3, 1) << 1., 0. , 1.); + cv::Mat gaussian_h1 = (cv::Mat_(1, 3) << 1., 2. ,1.); + cv::Mat gaussian_h2 = (cv::Mat_(1, 3) << 1., 0. , 1.); + cv::Mat gaussian_v2 = (cv::Mat_(3, 1) << 1., 2. ,1.); + + cv::Mat intermediate1 = convolve(img, gaussian_v1); // Convolve Vertically + cv::Mat output1 = convolve(intermediate1, gaussian_h1); + cv::Mat intermediate2 = convolve(output1, gaussian_v2); + cv::Mat img_f; // Convolve Vertically + img_f= convolve(intermediate2, gaussian_h2); + + + img.convertTo(img_f, CV_64FC1); + + cv::namedWindow("Output by Naive Seperable Convolution", cv::WINDOW_NORMAL); + cv::imshow("Output by Naive Seperable Convolution",img_f); + cv::waitKey(0); + // TODO: apply K1 and K2 to img_f with as few multiplications per pixel as possible. + // Print the number of multiplications your approach uses per pixel. + + return 0; +} \ No newline at end of file diff --git a/task1/sol2 b/task1/sol2 new file mode 100755 index 0000000000000000000000000000000000000000..c63f624bb3b47a7d164296d90e1c7b8b94441e4b GIT binary patch literal 40616 zcmeHwdw5jU)%VF|Fe;FspaBsF1&b9zCL|EFXt)ecluJqy#p^K449V2VOq`iuP|#Sw zn#NePVr^?J+S>B9zKU&askIWsmta4v(ApN;s%WL16s$2-n^tSS-`acabM~Cf!GiDm z$M-xrc{1y)wf0_nt+m&_oP93)R_~&Pxj8w8I`WK*48jghmXs=HY`u?90IG~iV+4NP z##zQN;Q4|k`Bf5tD~|)YnXrKAd4QC!m`<|5@seyPs5B%<`J9gXizP=vqe$YE&qb$h z`oZBAzb1VCQxaED&nL>O;q*3m>TpR{P|rucNnbDd>61)JKReZ zg+oDA-e-|d_(ifm_LtphEaUQ=>Y_o^rbiTohNeX$v6j|pt(7yU%`7iT z#!JdX*_6$Vf2zJqmed=lmM)^P8;#sHi7R=;8_j%5zqWeT4_>|Vn&-cNfj@u|LAX+8=NdOV)8m4Rd= z=uf5+kyt}@ur}rK1RDbhe<~4(q>|M^Z*2fSUT@81!P?pWh~clUTkH>o6XAwPG8InL zEuJ5Z$HH}imC>-__ct`fV~`a{r2H_0l4egRJmB%f0!`u26_HpdextDE*wunULe|Vk zQ?l{6rAR+|{M9kjjVyQ8jc~(dVYrnDstPJn@l+sc*4@lRI2pMq%+--0CR+`m&MIn= z-d`Q@dP5;)0tLjZL^v7_B*Rj)SzNfOIkmfxZ|EWhJwPk*IWoAu05=%+9DAAsoWNkc_OjSc< zAQexPC&S_E5s#6TTt`kxq9Vbu$GT^Rzt$g&H?Q$iOGtWaf)xC-M7un8X|w!jFM(75 zVo2X(7vS+gLNL%A2u2VDO+pB@N!58Ahr}|HNIp%p1XI#qf8yY)O+}N{gS#;AGSFtojxG+P!-1yiV4dGv zTj7W8*=$qV9lLU~$+ajUh3=pUl_mU>2&Wno@f&4H$J+INf_k0-Ws>2PKN^lTq#8MP zj=7WdltN4>l5CF4j!Bplj)lw$Kc1i_)uQoWASxRNRV6BEw%;#21y%z_B{5=|RdlS5 z!@xKmM{-tLcmPJAErJBTCPkcr70lALdGTY z=lf@rlp2>Ts-8FBUsf`s+&nESsW8vWjrq%$&z)E8_ms?##O2G8ue_wpqobJEtY_z8kWykYpy#UG_2ya2z11~uod zIoU8yFxG)a2T8q}`BlJwboYIj!4?=BnbtBcaw1(RZ(@9OBr<}o+8@yJU&K6;_v^>6 z$ILa~_zu%<=>H04nt8?(jHk}K2WPoP7k=qb>pF}YUFS-AFR%9~`sP`Z-fyF~ar%Nb z$yezWzVB8^hf$clTE_v6uGYwidr+gFWhFP#8hxfl@73t~Jh)$@vx*{DQJc(6)7#1N zRQ#%WHJoSATwWcGx5zV0vr$*p(X7$oVDo6z=(r>^k2Z~tskV9Cq0y;qb!^h;D% zU(Zexr-^)D&l4t26ZpQKhfJI%?tMLXn>bC_`+9COahi1Y_1s|MG(qp{379xd%=>yi zYvME^@9UXs;xrNO>+zU4O~CtlCYm@+y!(1anK(_j`+9OroF>|RJ@0&^?4=1d>^E_m zSi^o3rwKLeH*uOs!+sN|2{i0Cahf>8eiNq&Gwe5Unkd756Q>C>>^E_m7{h)OrwK9a zH*vafg#9K?7mTpq#A%`o`%RoC$gtnU&l31M|5o<91^&8;(*zmzn>bxa!hRE{i8Aar zahf2*eiNq)N!V}VbioPxO`Imqu;0XK!VLROoF>Y!-^6Kx4Es%-CdRPe#A!kd`xTDp ze&rg9?gfU3Z{Uls&cwYoe2xvTu;J5e_+%S?rVSrs!$;U~mks~-Rhjy|XT#sJ;fHMa zD>nQ$Hv9z}{@*tI=QjLF8~$H5{1F@e4I94MhIiWVjW&Fp4R5jGO*TAi!>_gB^)`I5 z4fopcIX1k)hEKEMlWq8!Hhhc?A7R5?HvHdL+Unnizop}zx2oIsU*~Io!?*s;-kLhE zr_1xauXD~X&tA5_X7{JYU}*R;onvS?ao}L# zS#6YV7el1qPt4AWUl2I&BVT*3Z|C1G_U-J?^X2UJ?f)n>8Un&BpkUzOD$&kVei}d8 z<~)KTjh6H4ee35eLrTNfeke8E*D+@mko1)w4h*D2=!|!}sM>R`MP9Rf%HMM%m~>K) ze6_yYjvT-M6Y_QBPo|E-*X~Vwx_q4*n?D#B@U?fR*Pz||IyVcn)7$3j9MOOd#Mk~y zVs1j;i?m&owsUdYQxKq751~KwQ3fPCBxIN(cZ=jQ7r5UAcSBd|9C&e(5WO2`KUhwZ zy3;p-`7b{PRdu`ke7IzQy zECpLC{x}8^SS1x_#ePfWZO3S3F=~*(*De^fl0hPToli=4Y$X0qX*?&DPy^#p-YQ>V zteZrANm?ysbf=dH0j3kaAW=6=qo*m1XXuBrO_4s8C3FftmB1c<5u-2H&NDP|pd2;G z@r+EYVq;PwmgjiWGi0A8cP|eH)Z;Bh=VC zK|1Byz7_*GaarCH3(Yk2Vo?XuA)SK^{WGQ=%1~ua19F&3Uqy&=!D2#GvMNH9IWq`R z&N)|4HkJ_Og5f|i4V_06X=s~e=uM*jWmu;$bI}Y9Tj*0%pjo4rV+O;f_&P=y7@rYg zgG$LAW=65EtR|f zW!242OujUge_)}qZj__GB`Zw?VaJHYC^n1APhzGBU1tfds7F)f3RC4#y2=vuJTV6iTQhAG|a^Rnqm#?;TB$XFgXl7u{$x!((nCN9uc`5omczM6zW_tNW$}d#@ zKDcCwP5(<8d1RDL7Dl>nD$2Cs z$r^!)p=7S?`l%6DxA*(n_X~xn##2&BDY83VD+=PGyVG|{RQaevqJu4ZUsS?o(JnG9 z>ON5_PSufN(Z3{vP1P*gOpJ~Z_u^XP_$+$(T~U^@=r&Q1Y0*;>RTc#$I@qE~(jr4D zE|ZHodJh+=@Ue)f42z}+QJY2N$pM_}Xcy(^81d}H{~bjWx9XfY2j-0&JEggw8(56#tm?Yoo-_xBA996rG$njK?vFI)sE zkmrRwD}nOT3oa27%1guGrJkz?%YP6pPM5EIbvx)i=MPRFb4Y(VrT-HqXr?A|gt*8d z{kfF>>x0vebV&a`Lb|7RaQat4&!+!wN`La;^p82DzmL-I!tBD--yD+0z`uGC%B64p z4c93bXJjcAqYCEexX9AlW4lCE#xkHi!?I>PJu@TAQ5pY9LGl6u+)`4N_$pXhi7ZED z?4peKX3h9WW=58yGJXNv!`E5GDf&-{zR;qprrPs%rmt$)Av@m^Em~zSrR-Kz%TO5s zf5HS6fgi~%ssJh{XjK=8&$LYsg17M??X1aYRK(2x@yrk*yyThUumPO zHa-`0Zl2%4X|}5s9fV~U$@8C-qO`x|FnKN-jB=ij`}V%|9w34eGLN^$t?E@vs{V}wzjB!-G}Wh{p;6#nA39MZR;@Q!;(fBF8qH{O}2EW zCyKgv-Q$y{b-JDqjNP~jiV0eG`Y{OJ^!zR*6*EEf`)EW)`pcLYUTZSoTsNGXhVf~v zZ}e|R5(6s^BPF3b{WjXz;Smb!KAa&IIs4mN-u1QDlYst?`ghxl=!Cj!Uwci#rfYYJ zb$w+Rr5F75T}5Pwo4Q@37mFk2B=U(P;XhjG{?YJsYQ)Y5%ul`??oVph)jgC}IAV;ODo z03u+07uLNj-$EkQpr|w-S6&q~E9&sR3&jc_f7X|?$Figrj#v&yY(;C_qBjd#8SC(F zMSX1Xi68*zPJckN*^YXoo>w5)-Bq|05tY8x*Ih-oA1DCm+-;tBh!w(dQk)3*`yd8E zc>=vVqTI8gt8l~PDm${Ev^9Sn7+Bw%v!SbH3EJWgBK@`p3Ut=*0FG{A1g(4&>H$_mRf20X0SRZefP|Ax#3x8NDNndNYl{*gB&u$fNT=j=R3Wah zLL;)uA}p5MH~ZOytzJ{*gYy65fK7y4ETC{8@2nt4pa8Ai+uG}0%eUU!o3q>dHbS`m0LdUFJH2oF+IQ0; z)Rz!GG8}&^m>u;r=EylL#+0mlKZaP7jAo8NDF4{cb9o8clz96*@q}KxLS{ zlx)rIvQIR-WAu^jHThaPYQ;X7wui=4^xhc*oM_3{?m-D)cc zN$9ahq0D{03%z^neRrx5^O?J8Sqh17dsBoCg&Z;qt1m~}!2oy=q=UZo{e`RN;3f)T z2lN{$TmM9_4}jDr5?5Y=gURVJy`=VD6BUUm0U9#u0dp<;p^Ba(|4zvM6>w@p*;_ahGwRohc(~z z{lj1_@=R8FIyOsb!in>RlVt8tX6^}k?t0{=Y#lZE7-ZUf9YWE$Vy=kwRpb7S{ZKBbLKDMXAyRb0x0*_gwf`@~q0-oi3$SxenoI8frSUC8gBb!!6u? zm4_aE6{%%29tCIFxFyh6n~#~!7-r@A15V9cW`gh2@|+a=6cVKCDT8g!<{afMFhPr5 zHMXHiqKD{C-ywwILQHSA{q04_Vvd`~8t;=}ye;0>QO(QB>N!0#Vwb_ZkBj$LtlTeW zMqr7a8}TmdN>=a3g#9{_D(>o_OMfl>>K_%_oqmJPrMic&=M(Z4wH${adqU_nrdiy6 zIC_x%hE8U32h9zU>kbuX!fD8b173|_1HJUO5OM1%&fkkPYy=F@tRICKnoV8{bQ9vJe# zkOzi5Fyw)c@c_N4tqwYy*fi}T@d1)4=Lz!kmSkdjBo>Uegu>J1EAQnD%cj%2>eHJ7 zsgg)6TGH6uY}mivVSd(5zPt^ICDQ{*e54>by)oW^4^O0$CC#x0(C5cnq9J!Io^nUy zfsi}W6le&$11Wdb^d}kenNPs1wf{eUHa+X0sV9ss-rkiLsof`xHfwA=)^0`OeiPHF@6 z0`39)9AFyo0AK<1?gyL#IG%2k0WJV+1T4T^!cBmsfZG690PX|)B482h{1sp+U@mTy zH3RwpHv!%PxDD_*+;}|z_&30Qz+y~pxGk|S?F9B`=d;_ox@Iyd) zisW2O_VI}TqXy6o_y%3v0S?DyS|eZ;;2nS?aUH)6@NB?+fOOz-KXK&Tw9Lq9Ey_7# z_z4A@P9PRsGXeJ{#JT^J*a7LF{wwD9B`3)+l}$6fI0 z8I#TiRpiGz2uAaZ@C6b0Ah{|0H-f&8^7BDu-HHFdVcF&)qIpLa-JUyt#IP191eExX z;(s_|iC%v&`715{UXY8ypRMzoE&dVE%fSDP&QDtW;jnuN__(KK$zN#kr-FYG_!RqQ z`EiTC2>i>zKTGFdZtv8p^_W6Ae?}h=z`2eJFQV9B2Z{=c!lkRbkCZkM@DA_2)?0Dc1beZ*IFeyf!~1pe2KQvL?;3$eb_ zO8HIsvSE_^Z-f6ue;Z0`dgiXM z?az{7<$o9aao~^B`Jc7;qcIkZ2H(jK<={_n;FG_nqCTd8 ze>Y6XpP|`7?XN9Y6h!q(-)6iAW2;j+4}kvw_%n1pKPUC1a_&Vr+rWQ;>h%NsD1T8o zPh0g$Pa9s2u^3NL|IBf{lWRPhE5aST-8lcNQD#U9LS7jE7ve=j<;wwhwbXU2Gf~=Gry^pM9*pZ7d$oavdo) zzFFY9e}eH`LG=@3jR#M3Juuez)rqdQ3C2H8tbTp0vHv93-m%8UlU?aEjqjaYefKzH z!*JJ!V~sD2a6LE9`1%OfqvMQMN4j1cXKX8S-G7Gh`BPl`&oK6%>iXh%hCDFjfgukJd0@x`Lmv45&I9VZ#Ogc5>bt{gLE(2;kf1~1@7VAWbW=g&f69i_ zH-441&XA4s3xqT}gHBou2xI919nE8{$}j`(|`tX-gcv%s+|oy(|FFIf|p0A>Jv;I5?Y8bBiQnwN4zB zSX-lm?$^-4?laUkZdWiv(W}Jbnx(g!9nWeSs(f+p1M-x8c-K(ahvb6v5#w9%Jp?-N zjGy2uJ#ouR;8U582RjAM>dH+2lfP@T3oCU?dKJSOhAS90Gi+nHiQyK8+Zc8++{f@B z!(N8QL_-`!4BZS%8CEf@VYq@}Gs8B9n;33kxQ$^K!+i`7GVEojHj^njTk7FvSjw=9 zVGY9-44WCYG2Fy(3&U*;yBO|cc#vT)Ls{yv{}!}m=E0}qFK|z(U)d5%wYWVVdl;4V>tzp93n6YW(KlOX{V!Nu2bfqaOb`XsxPW5k&k@IFlUJe=7PNILR?i zGy5q;|1M6l>Ay{+Kg00Y%H1L8rx*n_Qi9Uw6{eqPqkq8klWg>}kTC~4C7o=e)4SV5 zAI@~u?pHB=1=CgkvX1GEHu`4J$q)52rJmy67EWJcdNB0cD*=F0RJ&ywlIy#Sof zXSy1PRDbVO?^hsw4tmv1S4lbgZ#F-NMf$O3|E$vAEa>P}ZT-^*(4noN_90a1>8t-| z!`^G=Ns74Vf>U~7VPft$qo_^NmEZor>ANn;EXK_*(&yl0iL2(+LvnIQ znd7tM8phiW@-Ie!Wz+vF4)pJUPIf(5DJ3&7x*gKL>_DgIPqLLuw?4A%2S(4SWJ_NM zI_a~C>#>v#rsr3(rN5ce-~JhyP~2n3>0L~($8jP8ixr9*;~$WF7APX_c_qB$?xFww{v>cF19(O z@8q`%#P z{;~u8uPncj<75i!Ndp_{KhG-(%0DGcKf?W?cqRu)7J;5k|1hWD#(txF+;q@qin67D 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 +#include +#include +#include +#include + + +using namespace std; + +int main() +{ + cv::Mat img = cv::imread("./assets/hogwarts.png", cv::IMREAD_GRAYSCALE); + if (img.empty()) { + cerr << "Could not load image at ./assets/hogwarts.png\n"; + return -1; + } + cv::resize(img, img, cv::Size(img.cols*0.5, img.rows*0.5)); + + // The two kernels — do not change these + cv::Mat K1 = (cv::Mat_(3, 3) << + 1, 2, 1, + 0, 0, 0, + -1, -2, -1 + ); + + cv::Mat K2 = (cv::Mat_(3, 3) << + 1, 0, -1, + 2, 0, -2, + 1, 0, -1 + ); + cv::Mat gaussian_v1 = (cv::Mat_(3, 1) << 1., 0. , 1.); + cv::Mat gaussian_h1 = (cv::Mat_(1, 3) << 1., 2. ,1.); + cv::Mat gaussian_h2 = (cv::Mat_(1, 3) << 1., 0. , 1.); + cv::Mat gaussian_v2 = (cv::Mat_(3, 1) << 1., 2. ,1.); + cv::Mat inter1; + cv::Mat output1; + cv::Mat inter2; + cv::Mat intermediate1 + + + + // using the built-in function + cv::filter2D(img, inter1, -1,gaussian_v1 , cv::Point(-1, -1), 0.0, cv::BorderTypes::BORDER_REPLICATE); + cv::filter2D(inter1, output1, -1,gaussian_h1 , cv::Point(-1, -1), 0.0, cv::BorderTypes::BORDER_REPLICATE); + cv::filter2D(output1, inter2, -1,gaussian_v2 , cv::Point(-1, -1), 0.0, cv::BorderTypes::BORDER_REPLICATE); + cv::filter2D(img, inter2, -1,gaussian_h2 , cv::Point(-1, -1), 0.0, cv::BorderTypes::BORDER_REPLICATE); + img.convertTo(img_f, CV_64FC1); + cv::imshow("filter 2D output", img_f); + cv::waitKey(0); + return 0; +} \ No newline at end of file