From 4db1350ce2df762ac91cc51b7917aa01893ece92 Mon Sep 17 00:00:00 2001 From: Sebastian Schwarz <Sebastian_Vincent.Schwarz@cs.Reutlingen-University.DE> Date: Mon, 16 May 2022 16:16:22 +0200 Subject: [PATCH] convolve added + writeToFile fixed --- Bildfaltung/ClampingBorderBehavior.py | 7 ++- Bildfaltung/Image.py | 54 +++++++++++++++--- Bildfaltung/KernelFactory.py | 11 +++- Bildfaltung/ZeroPaddingBorderBehavior.py | 2 + .../ClampingBorderBehavior.cpython-310.pyc | Bin 830 -> 904 bytes Bildfaltung/__pycache__/Image.cpython-310.pyc | Bin 1910 -> 3029 bytes .../__pycache__/KernelFactory.cpython-310.pyc | Bin 1361 -> 1416 bytes .../ZeroPaddingBorderBehavior.cpython-310.pyc | Bin 593 -> 617 bytes Bildfaltung/main.py | 33 +++++++---- 9 files changed, 83 insertions(+), 24 deletions(-) diff --git a/Bildfaltung/ClampingBorderBehavior.py b/Bildfaltung/ClampingBorderBehavior.py index bf23ee2..62635ed 100644 --- a/Bildfaltung/ClampingBorderBehavior.py +++ b/Bildfaltung/ClampingBorderBehavior.py @@ -12,10 +12,15 @@ def clamp(num, min_value, max_value): class ClampingBorderBehavior(BorderBehavior): + def getPixelValue(self, i, j, image): try: - return image[i][j] + if i < 0 or j < 0: + clamped_i = clamp(i, 0, image.shape[1] - 1) + clamped_j = clamp(j, 0, image.shape[0] - 1) + else: + return image[i][j] except IndexError: clamped_i = clamp(i, 0, image.shape[1]-1) clamped_j = clamp(j, 0, image.shape[0]-1) diff --git a/Bildfaltung/Image.py b/Bildfaltung/Image.py index 29666e4..08331d7 100644 --- a/Bildfaltung/Image.py +++ b/Bildfaltung/Image.py @@ -1,9 +1,21 @@ from numpy import array - class Image: + + def __init__(self): + self.__imageData = None + + def get_imageData(self): + return self.__imageData + + def set_imageData(self, value): + self.__imageData = value + return self.__imageData + + + def readFromFile(self, filename): try: f = open(filename, "r") @@ -51,16 +63,23 @@ class Image: for j in range(width): temp.append(elem[i * width + j]) img.append(temp) - return (array(img)) + Image.set_imageData(self, array(img)) + + return self.__imageData - def writeToFile(self, arr, filename): + def writeToFile(self, filename): + + try: + f = open(filename, "w+") + except IOError: + print("Cannot open file") + exit() - f = open(filename, "w+") maxVal = 255 width = 0 height = 0 - for row in arr: + for row in self.__imageData: height = height + 1 width = len(row) @@ -70,10 +89,29 @@ class Image: for i in range(height): for j in range(width): - f.write(str(arr[i][j]) + ' ') + f.write(str(self.__imageData[i][j]) + ' ') f.write('\n') + def get_filtered_pixel(self, i, j, imageData, kernel, borderBehavior): + kernel_half = int((len(kernel) - 1) / 2) + final_pixel_value = 0 + + for k in range(-kernel_half, kernel_half + 1): + for l in range(-kernel_half, kernel_half + 1): + kernel_factor = kernel[k + kernel_half][l + kernel_half] + current_pixel = borderBehavior.getPixelValue(i + k, j + l, self.__imageData) + current_pixel = int(current_pixel) + final_pixel_value += current_pixel * kernel_factor + return int(final_pixel_value) + + def convolve(self, kernel, borderBehavior): + + rows = len(self.__imageData) + cols = len(self.__imageData[0]) + + for i in range(cols): + for j in range(rows): + self.__imageData[i][j] = Image.get_filtered_pixel(self, i, j, self.__imageData, kernel, borderBehavior) + return self.__imageData - def convolve(kernel, borderBehavior): - pass \ No newline at end of file diff --git a/Bildfaltung/KernelFactory.py b/Bildfaltung/KernelFactory.py index 0901e12..ba95fcf 100644 --- a/Bildfaltung/KernelFactory.py +++ b/Bildfaltung/KernelFactory.py @@ -16,9 +16,14 @@ class KernelFactory: @staticmethod def createBoxFilter(size): - value = 1/(size*size) - boxFilter = [[value for x in range(size)] for y in range(size)] + if size % 2 != 0: + value = 1/(size*size) + boxFilter = [[value for x in range(size)] for y in range(size)] + + return boxFilter + + else: + return("Invalid boxfilter size!") - return boxFilter diff --git a/Bildfaltung/ZeroPaddingBorderBehavior.py b/Bildfaltung/ZeroPaddingBorderBehavior.py index 48b7aeb..ffad143 100644 --- a/Bildfaltung/ZeroPaddingBorderBehavior.py +++ b/Bildfaltung/ZeroPaddingBorderBehavior.py @@ -8,6 +8,8 @@ Bildes, wie in Abbildung 2 oben dargestellt, den Wert 0 zurückgibt class ZeroPaddingBorderBehavior(BorderBehavior): def getPixelValue(self, i, j, image): + if i < 0 or j < 0: + return 0 try: return image[i][j] except IndexError: diff --git a/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc b/Bildfaltung/__pycache__/ClampingBorderBehavior.cpython-310.pyc index 43a303511bdcafa64288b3725d9c70978953e005..3e2af1ba63f1049df8c3fe6266fba80de1cab06d 100644 GIT binary patch delta 366 zcmdnT*1^t~&&$ij00fi#nv&d@C-QCMkK)WttcWj5%qdM>$xy^T@p2p^=VT+s%=$S% zWmOtAj46!S48@!^Odz^Qp@ab>Qp23Zn8GB<kisOv(9B%R0u%+xgGCwPqO5uBHOw_Y zehpA%I72WH=gG4$lrUAgGctf6ezSm9Ouo&it6szjbjU5%;*7+C)LUGhc`2zCu0=)p zMVf54Sc+3~(rz(k-eSzUHCdlY)`T6Xv<OUafHd)@r<Md{R;1>HfxIUG6e<=25==}2 zjAD!ujC@Qi|9F@uS1?8UA~eEv7l8tb7o>*;NN_OlFoQ+>G?|N-fC6A=fkhw|B23_z ItiUV>09_|a#sB~S delta 291 zcmeBR-^a$6&&$ij00afrl}VGCCh~3Lzr~rGSP@^Am{Xd%lA(xW;^jC-uE|D>nGR7v zWmW7o%r%UX3^h!W4B-sH3@i*K43%n(3?Nv-Si_jYSi_vflme7ZVUl2IX0BxciZVe& zC(APFs^8-B%u7kFa4jmzFDe4re2cX>Be5V=lkFBuacWN5Eym1Sj9F2W3z=kfIDpbc zV1g5*kT*TGBp|aQH75+@Hh!Q`F&~g%V&Y@uVVr!3DcTpI0j{fv8>oaAq?QFpa4_&N bfkpf@nTwc!0$?YAMIaU-OyHcH#ViK^&96IH diff --git a/Bildfaltung/__pycache__/Image.cpython-310.pyc b/Bildfaltung/__pycache__/Image.cpython-310.pyc index 18dfef5b00460505f83972e439800460fa9536cb..a639824500f52eb117399f062d533a2342b6b91c 100644 GIT binary patch literal 3029 zcmZ`*TW=f36`t8UmrI&bm`XwlmyXk-Oi(vS3ZxC3B8}Y`E?`B7k{TscFl)|AT4}jU z&MqyB7@|O!$JP)11=3UDA5fq#eJs$QQ0!|S3L*c%$n86`)Ya`0JacB|+~(Y7vPQ#a z`2POj^GE+}F!m))E`BB^@8h3e2M|o~gbjI*b9RpjLzrJMVa|=7A*@Z-wNF69y1cYQ zDZ|47%`SchChy~)-vx+Rj|&D)E{rc&&lIMxFj~SE4n|wJ!o%o@n(#5YqAmiAo@j_B z#+tYWjjhtYKMZ%G0f)rXk8o0T2mhQ-CzxV=z)kjyuRr7EQeQLm`!Vs}4T}(qRvsnW z&zP)%;rZKl-rf2%k7T~J8I4BC*2dvrH<ZH-ne9b`BH#KTPQ-SY6q9skOUt@7IxIa1 zOyi>8cS$i>;PYv-+CJTS!B8?*8|na2Y!60C3#haSkR)wU1?VtkV<#%kEvF@|%i+_P zDqWZM2V}?TNBEg%0!$Pq&s<g8HKd2l(taE!ljsHg`9=N68J3g54nMcx62&D8TA(D^ z`pEyr;iql^D+He#Gvgskmn>HB!&T1cR~W)j*a2qFG5-Tg`2iAcW-27hK9he{#*uZ* zW|p#qxyFROZ^+ljuVB|%VVcUp%BHf8Y*5)#Pa&=Ljr_gevCsKKHhv0i&f&*r+Ppau z8#3Kv(!S6+etN(lu?9(dm82sN(ww5E9MU@HGgsq|#=Z14ZJi;XVpVGfMQs|WnlSfm zIm77h^ZZYh4QWH$@Ru_i>SRN8((07?k9OG1hgCkb)>U0=52is;SHYYsS9xuQGyQEL zuchVv<4hiC&d);rD*}ac-erHhIcq?26LVM38?$SwdDKvWYACnO)U_41#*V=~{+IHx z-Xy$e9$izcXeocrj}e*iKao94D8<Hl$>sFrJJ}==oir;tG73d!J5Hi^JCd^e!~}TG zZ=TSkXKcJR{qg-285WDq#=Qrc@<!*O%+j3>$}%2w(#h~qByXKi#-4l!F#XAk3}-9x zlPKxvguOLg`>m9j?8NCpMkm|ujEErbE|*p|iqg{kXj2oF_DIHQQCiWHxF|g`I*HS$ zwDUs7qq6y%9BrV8vvff{NV1%EM+wMH%}G3^nLwy5!*nMqop1ydLeha{lK>q-QiXS0 zRcU$Tm^2(lCEqUXK{g>1NO8~8hhLuz(UIaQR2{^k*e#viDBjsEN@o~8`F)r`^>C+j z^m%g_pG3ow$33fvhNF`2U9H)GZ2VAW!w;eMCD@Ta0x)=!2i(Wc_|~#K?qOyC($C;6 z%m~BoH=Y$>*2Ih`Rsk`7=Y3_ZRkXCCDZdRY3-~Iymbqh0m#da^QT?TUK;8DNAN&WC zEB%17nIEp4WwUWLo2eTJYi8kZBNHv;wLf!E=QcWkUD(P&^;zQ^s2@i-l);1*uCnG_ zxGM~pJ?AS-cq=;B7rQ2Q7b^w2hOUnvqRu_ygO1kBTTnu$a@UyhsQO8wu9!`&&(rt= zx_P>_^{H|2#<X=OOsP6333blPHcqVzL@v|$&5gJG=e$#Lzgv?pW2JQOf25O7t`Oxa z0ZJv=0YG}lxQI#<=_+qv0Zimid6U3v1YRfbQvzLp(v;bOyhYQW6QBTGxLoR5+$S03 z$vtf4#Aq0lCslkc#MeS}Y33W(5#_)L_;u`C-%OXPXkU;qAWKg_x^d`6)6M_SKnes` z2ZFESHSr3yQnXaK*-%cMp}it7a|7=F+01)k?bR9DtMU|DJ=~9GOd}elePrTVL-3TL zYJdpPu{o>bnn7zt19eqh`EB+No4Mob<2KgO{tzH*T?ar?dFXg_ZAp(F?Pu-V9$mc~ z)JIT(xEOUo2bI6iJld<pr>~0A*^guzC1vwbCPgGah<3xraVC59YQ4W3CfmKG?KlmS zzV1(bUC<@pFL}~yEU31_K>?=5U?OFd78T{yz%A3QkET*YG7=TZXD~je>}n%oZKKWG zs7nu3Y<%t6)7A6G!ezDrwXM^S!bMLE9kLz}xQp#^IMS>z!S$_YAv{%OtfA@*h5A9* zmT^m(N0wp=bx3>&jB#9HHiG8dX5$}>TeO1!80)8Q??6$N<CM}>AH5B%>sHSGC9VDn zpl2bQ^PV-xlKlTCwKvGp$64|?O2Cp+L-r}7k+-j+i=j&`9%-j!>s_B7bJU*u{nGFE zhnbipga`fpcoHVnj;xazl+;y|f0M9x2#~GvJp$+Dr7?1)J`TN@^6D|<nfm8=zwp+A kK<}=1&7O_xZ**AQ92AlNC93ppSEl`%?o|B@3)r&xJvGXsBme*a delta 795 zcmZWn&2G~`5Z+m@?TzEOrBz5nQR$%xSe1%Yamfh@P!X312~Lqvo79FzO=2=OiHPjx z;3ug30&s)_7j7U9JOmd%1_ut6DzW4KP++b3_VdinH#@ugqxQ>jf=b0=YHViM`!0{2 z1K2p8Hk!|vD|7wHu=~p2=M+C5i)xn29x4mJd_Lkw0IS)lc2ADKMNVv`kUbV3VIlh| z4sA+w7jqH%gO}M<-xD7gHnU}DE!*gKy&VjOJN<!glGa{!qVEbDBxJirb*?Gj#i0Gs znxf_>MIsh+4^p0J9#4d)CAu;rhDYp$m6);Ni5g3c2x2pZL?2gT?H%{@_W+Doq{Vs) zo>60p87b75XV%!2s7PUc;fe$;QNpW<R9q!0zL1p8g&>x77MJSmOprvz_lt67!CM}q zlWfoUbQ4Qz>j(tY%}jf`ZJoe+4wkDU^@vpkxjw~yH1~5Yj1aFYk89zInmSq+5$m+> z2EjVP8o@0ExrV_MH|V!P(7c4(6fKje|2&}MZYf7di53??pH!a(7GHxUu(=I4!JdOS zon0%gf9p!>Ur&K<m%1sgMJQ7A3hkn{%R9!Qk0XE3ae4uIK0fddx|4o@|87n02ct<a znD}ia5t68Y*^+Zs`!ePl*-E+5yQ9LmMR1qkPnQLwR*_zgt}LWyDw*VR+pZSgwyWj( U=*{r;Tck3D?>~v`Yq<{MH|w{ZHvj+t diff --git a/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc b/Bildfaltung/__pycache__/KernelFactory.cpython-310.pyc index 66ad584ce838b1fa84b7a5fbd9875f888ed4136a..eeb46e94b76f8390fa1b55b2d6ec33056a2dc2c3 100644 GIT binary patch delta 239 zcmcb})xph|&&$ij00h06)kzA>8~Ii+d0GIu9SkXqVhkxv*~~>!Da;)}z6gUfLnmW9 zLpx&{QwmE8YYRsSP_&uR1&C`IYZ!wWQrLnSG}--LG6D4$F$0OoPnni8icaoj4pHF- za&IwKu4KB!Qk+?pTEq)d!wMqUKm;F<5S`4*VryO{?wMDXn3I{Jkd$AMmYGwMTBHEd zp;*KZRHMmMBn+gYIDwLGU`dD}LX#6%<ODz-;bG!olwf3GVqvb5oh-;AJ9#;a1Ea{~ H7c7|opT0EM delta 203 zcmeC+zR1Ow&&$ij00inRl}X!~Hu9}t($@fTQy4oKIv7M4q!~IH+Zoy!)0k42QkYvf zN`Ruxj4nW2%UHu0%%I8QH~Bx)az>HK%b7z|KqlQ{tX#=-i={ZTDz%6Q$S-0A5o{oW z7f6UqmS?ebE8+t(HJOTpfK(J`QhtS7W==_J5k##ZNG(XiE&k-9)WnihCzw1)rWho{ U!z97T!Zdk5OFX0SWO>$10DnR&y#N3J diff --git a/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc b/Bildfaltung/__pycache__/ZeroPaddingBorderBehavior.cpython-310.pyc index 36c1eb5b7789b3435a960975f3d6ae3990801e06..99cb2365be530d6e66b2e94ac7e09bbf5cd168d7 100644 GIT binary patch delta 84 zcmcb}@{)x&pO=@50SGqwG$rks$a_@J0?4UhOkvDsDCVeP0?|cWDU87kRqQp)HH?xB iHB6EW;S9kHEDR+KmC_U6%;n$%>JVULVVvB{cmx1aP7@&j delta 60 zcmaFKa*>5MpO=@50SMaoDwDb<@*b5^0dlI?YnW>oB^hd%BpJdPf*DvCN*F2yCo#@t L0jZt5l<^1vm4yuv diff --git a/Bildfaltung/main.py b/Bildfaltung/main.py index 61e12d0..f5e1e52 100644 --- a/Bildfaltung/main.py +++ b/Bildfaltung/main.py @@ -1,26 +1,35 @@ -from ClampingBorderBehavior import ClampingBorderBehavior from Image import Image -import numpy as np from KernelFactory import KernelFactory from ZeroPaddingBorderBehavior import ZeroPaddingBorderBehavior +from ClampingBorderBehavior import ClampingBorderBehavior + +'''RELATIVE PFADE!''' path = "E:/Downloads/test.pgm" path1 = "E:/Downloads/test1.pgm" -array = np.random.randint(256, size=(4, 4)) +path2 ="E:/Downloads/test2.pgm" +#array = np.random.randint(256, size=(4, 4)) -def clamp(num, min_value, max_value): - num = max(min(num, max_value), min_value) - return num if __name__ == '__main__': - print(array) - #img = Image() - #img.writeToFile(array, path1) - #print(img.readFromFile(path1)) - test = ClampingBorderBehavior() - print(test.getPixelValue(1, 4, array)) + + img = Image() + print(img.readFromFile(path1)) + img.writeToFile(path2) + clamping = ClampingBorderBehavior() + zero = ZeroPaddingBorderBehavior() + kernel = KernelFactory.createHorizontalPrewittKernel() + img.readFromFile(path1) + print(img.convolve(kernel, clamping)) + + + + + + + -- GitLab