From b3345821ebd58c484e88d7e600a6b5a49eb67dc3 Mon Sep 17 00:00:00 2001 From: AlexanderWangY Date: Wed, 27 Mar 2024 11:34:17 -0400 Subject: [PATCH 1/3] finished histogram equlization layers + cmap for grayscale --- VisionStack.py | 23 ++++++++++------ layers/HistogramEquivalizationLayer.py | 25 ++++++++++++++++++ .../BinThresholdingLayer.cpython-38.pyc | Bin 1954 -> 1966 bytes layers/__pycache__/CustomLayer.cpython-38.pyc | Bin 2094 -> 2106 bytes .../__pycache__/GaussianLayer.cpython-38.pyc | Bin 1022 -> 1034 bytes .../__pycache__/GrayscaleLayer.cpython-38.pyc | Bin 803 -> 815 bytes ...istogramEquivalizationLayer.cpython-38.pyc | Bin 0 -> 1554 bytes .../HoughTransformLayer.cpython-38.pyc | Bin 1845 -> 1857 bytes layers/__pycache__/Layer.cpython-38.pyc | Bin 2518 -> 2530 bytes .../ObjectDetectionLayer.cpython-38.pyc | Bin 5368 -> 5901 bytes .../RGBMagnificationLayer.cpython-38.pyc | Bin 2212 -> 2224 bytes layers/__pycache__/ResizeLayer.cpython-38.pyc | Bin 1053 -> 1065 bytes .../UnderwaterEnhancementLayer.cpython-38.pyc | Bin 3884 -> 3896 bytes 13 files changed, 40 insertions(+), 8 deletions(-) create mode 100644 layers/HistogramEquivalizationLayer.py create mode 100644 layers/__pycache__/HistogramEquivalizationLayer.cpython-38.pyc diff --git a/VisionStack.py b/VisionStack.py index 2d935e7..188350a 100644 --- a/VisionStack.py +++ b/VisionStack.py @@ -4,7 +4,7 @@ print(os.getcwd()) sys.path.append(os.getcwd() + "/layers") -from layers import ResizeLayer, GaussianLayer, GrayscaleLayer, BinThresholdingLayer, HoughTransformLayer, RGBMagnificationLayer, UnderwaterEnhancementLayer, CustomLayer, ObjectDetectionLayer +from layers import ResizeLayer, GaussianLayer, GrayscaleLayer, BinThresholdingLayer, HoughTransformLayer, RGBMagnificationLayer, UnderwaterEnhancementLayer, CustomLayer, HistogramEquivalizationLayer from layers.Layer import Layer from typing import List, Tuple from datetime import datetime @@ -60,12 +60,17 @@ def run(self, in_image, verbose = False): row_index = i // NUM_COLS col_index = i % NUM_COLS + if len(processed_image.shape) == 3: + cmap_v = None + elif len(processed_image.shape) == 2: + cmap_v = "gray" + if num_rows == 1: - axes[col_index].imshow(processed_image) + axes[col_index].imshow(processed_image, cmap=cmap_v) axes[col_index].set_title(layer.name) else: - axes[row_index, col_index].imshow(processed_image) - axes[row_index, col_index].set_title(layer.name) + axes[row_index, col_index].imshow(processed_image, cmap=cmap_v) + axes[row_index, col_index].set_title(layer.name) if num_rows == 1: axes[col_index].axis('off') else: @@ -86,7 +91,7 @@ def visualize(self): stack = VisionStack([ResizeLayer.ResizeLayer((0,0), 960, 608), # GaussianLayer.GaussianLayer(SIZE, (5,5), 10) ], SIZE) - img = Image.open(os.path.join(os.path.dirname(__file__), 'imgs/sample.png')) + img = Image.open(os.path.join(os.path.dirname(__file__), 'imgs/EXAMPLE_img1.jpg')) CLASSES = [ "buoy_abydos_serpenscaput", "buoy_abydos_taurus", @@ -110,11 +115,13 @@ def funcToMyLayer(img, args): # stack.push(CustomLayer.CustomLayer(SIZE, SIZE, "myLayer", funcToMyLayer, [])) stack.push(UnderwaterEnhancementLayer.UnderWaterImageEnhancementLayer(SIZE)) - # stack.push(GrayscaleLayer.GrayscaleLayer(SIZE)) - # stack.push(BinThresholdingLayer.BinThresholdingLayer(SIZE, 150, 255)) + stack.push(GrayscaleLayer.GrayscaleLayer(SIZE)) + stack.push(HistogramEquivalizationLayer.HistogramAdaptiveEqualizationLayer(SIZE)) + # stack.push(HistogramEquivalizationLayer.HistogramEqualizaionLayer(SIZE)) + stack.push(BinThresholdingLayer.BinThresholdingLayer(SIZE, 150, 255)) # stack.push(HoughTransformLayer.HoughTransformLayer(SIZE, 100, 20, 10, True)) # stack.push(GaussianLayer.GaussianLayer(SIZE, (5,5), 15)) - stack.push(ObjectDetectionLayer.ObjectDetectionLayer(SIZE,SIZE, "../ml/weights/robosub24.pt", 0.5, 0.5, CLASSES, COLORS, True)) + # stack.push(ObjectDetectionLayer.ObjectDetectionLayer(SIZE,SIZE, "../ml/weights/robosub24.pt", 0.5, 0.5, CLASSES, COLORS, True)) # print() # stack.visualize() stack.run(np.array(img), True) diff --git a/layers/HistogramEquivalizationLayer.py b/layers/HistogramEquivalizationLayer.py new file mode 100644 index 0000000..8fd03fa --- /dev/null +++ b/layers/HistogramEquivalizationLayer.py @@ -0,0 +1,25 @@ +import cv2 +from Layer import PreprocessLayer + +class HistogramEqualizaionLayer(PreprocessLayer): + + def __init__(self, size) -> None: + """ + Equalizes the pixels between pixel intesities based on the pixel histogram + """ + super().__init__(size, "histogram-equalization") + + + def process(self, image): + return (cv2.equalizeHist(image), None) + +class HistogramAdaptiveEqualizationLayer(PreprocessLayer): + def __init__(self, size) -> None: + """ + Adaptively equalizes the pixel histogram + """ + super().__init__(size, "adaptive-histogram-equalization") + + def process(self, image): + clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) + return (clahe.apply(image), None) diff --git a/layers/__pycache__/BinThresholdingLayer.cpython-38.pyc b/layers/__pycache__/BinThresholdingLayer.cpython-38.pyc index 513fe4e87bce3828299414e9e6808b87c5499446..4c02b59503b8ba5d5ff6abb07dee3ad86d1108c3 100644 GIT binary patch delta 59 zcmZ3)zmA_fl$V!_0SL@BST=GWWmfdj&&bbB)lbYxtw_vENiEV(&n(d`N-fAQ&Me6< N%1kZZ{FHewGXUOM6D0ru delta 47 zcmZ3-zlfhZl$V!_0SM+dF>K^M$}H-jpOK%Ns-KdWmzkQQ?~+=aU6Nn0`6KgQW&kZB B4$%Mr diff --git a/layers/__pycache__/CustomLayer.cpython-38.pyc b/layers/__pycache__/CustomLayer.cpython-38.pyc index 009a629fbacca016164b30888128bdf5008e5388..628fb661342e562211e2f1ec09ccfd99356eb2d8 100644 GIT binary patch delta 59 zcmZ1{uuFhDl$V!_0SL@BST=H>V^MV0&&bbB)lbYxtw_vENiEV(&n(d`N-fAQ&Me6< N%1kZZ{Eo$e835y}63qYr delta 47 zcmdlbuugzGl$V!_0SJOx7&daBV-Ypi&&bbB)lW&x%S_GDcS$YIF3B(0{ENkb82~3Z B4lV!y diff --git a/layers/__pycache__/GaussianLayer.cpython-38.pyc b/layers/__pycache__/GaussianLayer.cpython-38.pyc index 0f425fc55adbd1a20ed729f2c0060fc52e4d7990..f21db9d9823a9b3e0d7639a2f2e39ad9d408eab0 100644 GIT binary patch delta 59 zcmeyz-o?Qk%FD~e00ib5EE~Ck delta 47 zcmeC;_{Yv2%FD~e00gBi3>&$fm_#l0GxBp&^-~h_GE;N(T~dp)OY#dg=P}J;1OObu B4WIx3 diff --git a/layers/__pycache__/GrayscaleLayer.cpython-38.pyc b/layers/__pycache__/GrayscaleLayer.cpython-38.pyc index c2e9945bf09058276f89df03f8a08522d6a2b06c..ea38dde232bf52bb6994709588ad43aed2946621 100644 GIT binary patch delta 59 zcmZ3?ww{eUl$V!_0SL@BST=HJF)F(0XXNLm>L=!;RwU-7q!#I?XO`#|r55BDXO`p_ NWu_Ky?qZzD2mr}Q5-$J% delta 47 zcmZ3_wwR4Ol$V!_0SFeiFl^+`VidK~&&bbB)lW&x%S_GDcS$YIF3B(0JdJTCBLE&h B4dDO) diff --git a/layers/__pycache__/HistogramEquivalizationLayer.cpython-38.pyc b/layers/__pycache__/HistogramEquivalizationLayer.cpython-38.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b0f88f1f1be1b6163d41daee3709e40e232f20d GIT binary patch literal 1554 zcmbVMK~EDw6rP#gEd^UZG#ZSF)mt&p#FHV$KnTKtG$!a}W3pLxhIVw@t~1k08$4mc z$$#Jhj{K#)dgAWMlkd%Lw?!Z^zGPqb&CI^{z3+X~_tokg0eiFV9{ys4{KR0|TnIMc z(J#Sq!f8x={ADriFrQJfL%74;Z-l#oojAS&vByggmu&2Ex=-pem+&=d)@i!%R*6LQ zBBAwOI209Sr{~ZbXOPz!eVD7|mgg0^ zX4;~b$RiQ!+JP`%gy?2rO?HjY(nvUS5Ng3|z3$|2tvyCqq#Qjc)>cIh+W_w71xr2M zPlQU#K_I)*1OY6$TEvIo%58(6^ z0BQ`RhRlIBVf3jHBm25B&6yln*08*#Z7mt9GO$uYdMt15=-KoKS4dtP!@Nc@(z}H@ z=D`_D@Hve25b34OI!m2s@FK0`?F+0>X9{(hda@I?gu)Lqw}7iNxq_+?WWea?>FvPs z(-$SAvKw|p5TtWK(CP7hjPI2oK<2X@+p)TbWvV&7k%;3Um;zBjIEX}HYp5WNuFRHZ z>`DZ|75jftPx#*CVPfP!jKy7ysi`piHP&$v;oUCm^+JW?-0`qBp2C#IZ<6hkFo(0+ z9&7rleif=l&7!k(*%4aKP*QghST3pO#pK2?uC;ixw#MXdVY0{I4EYFGmox5sXJ6Sd zJ7dSRP@3Cp!4b5LI=e&=>Jhj)^Jk-2CVR3YjbAY`7CTDveYjzDM=ipM^iHHiXvEgu z=I(atg-H?*VGH%C@K3|{;1ag~7O9ocL)f;`AatINR{o*UT&wCnW}nD@qPS()KvbFH p=u%1HO5Mw#diLTfWY#LtZcgPXrjV9jW%_?jF&Pf4Oe<`$@&~BHd6xhH literal 0 HcmV?d00001 diff --git a/layers/__pycache__/HoughTransformLayer.cpython-38.pyc b/layers/__pycache__/HoughTransformLayer.cpython-38.pyc index 679796d990b6260bcc84c987a7daf244b9fff81c..2adbaa4cae91ab8381db5b8af70861ed545b0f98 100644 GIT binary patch delta 59 zcmdnWcaV=el$V!_0SL@BST=GCGAnxPXXNLm>L=!;RwU-7q!#I?XO`#|r55BDXO`p_ NWu_KyHe_aD0RY8F5hwrv delta 47 zcmX@ex0R1Ol$V!_0SH{CGHm1)WEQp8&&bbB)lW&x%S_GDcS$YIF3B(0Y|G5T0ss*@ B42%E( diff --git a/layers/__pycache__/Layer.cpython-38.pyc b/layers/__pycache__/Layer.cpython-38.pyc index e2c8c9e9d03f3097f92eb87c74f5fb768da1076a..d372052411d83a66ca92e4b5aa44e5e6db69b646 100644 GIT binary patch delta 59 zcmca6{79HPl$V!_0SL?{{n^NE&8TRrpOK%Ns-KvXT9KHSl3Jvno>`(>lvs!9y(=k0 z`fD-tCa{5=HeVCuk_4a*E#On@Lx5abw0}SlpuO?fTMp?dhX6&pd2gh(gCG*-$H&Jv z!#DGO@5irOn{)1qxtv4b_mlnRQuu=h?v^?G{QUB8&7beA`nNg*&lmH(et1y$qhZhw zhobKX>T&BtnHH$a3Un9al(U}#+DwhC7idfU%{o-v3rik=5inewuJ2SGUR4!7d*n&D z_eq<2q|LmHXL#mE)U!N(&uSZ9%Cqm0w&|rk2dhAcIW?@g+5z+C$6gLhAHvs=L|=0zXK2cepwfK~h*7dj9HSe=xcpE_(en z^?vH|lWDONk`O;aXdpBZ<`E77B$-Kgu-qB>irEM2bKnhj0T2o&N_XpX zQX)y5mFAdwv`Hc>%;6EOxG?e_+cY8`7UH6$8!#=^BatonJ5&@T*Wnx%;(8H&p1gAB zDv#2U6J?@ol#AT3B;B|?CUFH{6y+h7tW;&bNj@Z=A#)#+j}4p~)?`{bG9$A+Q(~gi z7_jOX?U|mndEA0b?YIHiHn+parp!sV$LeGZ%e?juOxOX*?UbnjgVNhe45-5w)SuHQ z>5Td^-82uw0V>NmPM=n%ow-xG6dZh$dhpI@mPGo-&R)-zxb>d-8-OO0ij%NS+U zq~`xPcbJK71OEyB8(4gEd(ER@Kxt`%cytEJCQZqv zHlO&T)WioBvw-g@Y4^-4x$S-qe26PWp~x$im478Cnm!o?O>Z)6T|JSg#;`b(w0LsY>& zh>KxWY+9(=d$q6oZn3Gp%DhfLP}j33Hn3e+a!_xe;U+dY^3{#=V}g7Jt1yP^Vo}>A zZI{6=dJO1fAf=iZ_vqegk|k{NibphOTD0vr0FzWD#v)>f-3 za_~U72uBc}LcrRHA0s^K{D)1id6cklsco+ILqEw}LYj>Pa7UmZJiJkV%*F&u=e%R@+28r`fXo431uF8DtUFt!myl)0l8NmopgHTy2Tiif>!GB2;GfUTx zYIXiksi|JK%PuNa7RE$M)mypxMr>-ev7{BFLU0fSD@?^eFR*x+jvW}FDOz_@KsXC@ zC#&@a<8$#uQ$S^~3NVZ5TIH}-Qw!@=LSexOSk(r>Nrz==-=*FLy=Fjj|3TVXc^v70 z;(U5Fv#mB!J}N}Ts1%i>N>qi!DzYGpvLws0BC9=2wIa%=2cU_vK}>LI<8|d`eErBz69i~p?!7P06D{E z)Gv_?uO9bOo1kQnfE`vn*q7dU6E=23a;;ivty<}YDd+m|^}QuPLKJZ1Qcava{gT1EgU%4-llCQ z?1%*nd>){k*(Nu-FQfYfgh#5>#@m+>eyz&I{h8mOIgu(P_$d?+{M-jm157@h+(5l` zKxH|Q-8CDgW7e2yxu8wEXbsRbYP4cBXia@we1As#7G_RFF*8Z|cj$NtK)qCI6&@us zeeZjvIr>2TqvY+lih-{nyo!L`CbXojqNE)bHE;}JY)hJJKc#&wTYT?S^=A2uRk02C ktop1xQxkZi35VnF-t-b{aD8obTU=1IvWIrm-paqe0g}WkZU6uP delta 1990 zcmZuyNpBoQ6t3!}x~FHlXY1K);{=5yo-AG<3&Ghj2@vc=ga~N}a)#-)Jzi$U)t$t# zs%4}^2nksV)PX}l>5(`P#3lcLbA*H<#DO`1#0iN55=b0C;Z=D7A$n9_zkc=V)vNcu zSF=9+N7cDv+ZKZ7$WM4?a^Ru!L@S&gnQJfkBVN7L^cP1a{9qw$clfYAo>wy1Q8Rc@ zA($w~0Zo-NeG)(5kMvP}54btVpXg@~JOh%CYS=?H#WOv{Q$N9;=IM9zn(7hHxPxk% zr(8zW#OhxDt6Si|q;dz(O;Hg^!vNTNOc2EPi!g!}0EQWwMvU<9$k@0JvdJ{SL}<+? z7Kf-fPI#qH+JD1UocLmNu#~kra{kWEY^d-=U*Ea zcbIelHlzCmlm%1-j0zY5;OEVQg)tBUVTLfI1Miec;UAb6*V3R9k;|z61R+E*W*Fj7 zm=Y_VltMMuVCY>mE522xGUYao2}EghaST}ltrjMj7F%6(8)L*!oMc)TdrAdGdYEEx z{&^dQ1E*3W5~kyf*kvs;7@Z zP%APcs%%U>P?}$<2sN)Mki49A0+;zEtHN8>F?^VRZVf*zQ%fLKGQV^ONY%6~LQicj z&CYwTPjzU! z;Rit#pR4NpDSIE@!zb;5yx2O>08E^5X#s@BhuI4M*nSru=VfQSwa-%|2j7ktzndMlXxvap7tTao&Ynf%4 zwt&E+x%{ZL54@?YEZDf_=`6cV$C5{w&72tpXliUw6uP4#bS%v>UG1tSH?2f{VV~4i zSRYU~vE_~_!Y$lQ2}#>WEi){6mJAxr_rvz@v4mu>JPfdSH&lPBifh(V+w&KvJN0mm z9)Su`4A9e?Eze(}NBQHdyZ?EiJ_fLwn`-Zz@I${5HruUW=VaaUs{CqDFJ5yYF6Nf)1luA+O$WStsCtHzh=#D z>u6S3o(1TUI-Omruk^;I`44uH-_P~uWWUK)>)&AO%lvU}-%KyrY=u7UP>7t?>}IQT zJ)HLZu-;q@YEJul`0sCPbGjbZ=>@UbD{>7FY%N4q2%jA zJ0;*EU(V+*h~{2~5s33|+^Yosa7@jFAzIyn1}D%lj^=8nmeU<<;uIdlMKPlmv8$Hx zkYXyU&p|I8;J@eVLseyp%988?m(aok@T!>&Uz~AzWm~$%m)&Y+JIt-9zHo=}m;8Iz z>$?o==o-tjX7ML=!;RwU-7q!#I?XO`#|r55BDXO`p_ NWu_Kyu4G!m2mr)J5)S|X delta 47 zcmZ3Zc^;Wv1rnyQCIpm*f|0Ze?1+2ml4g B4J7~o diff --git a/layers/__pycache__/UnderwaterEnhancementLayer.cpython-38.pyc b/layers/__pycache__/UnderwaterEnhancementLayer.cpython-38.pyc index 3074e462217a11f26122f51f449c32aa10037d89..4f55410ae4b35ec7bf6b95836464f7d04853e52a 100644 GIT binary patch delta 955 zcmZWo&ubGw6wc&VH`(l3f7IGo*Mgv~v`y1mqgHK$ttp5e1Q8+<*JNk|X*RyyNGphU z1rLr#Z=MQXq!<5|y?W}ccoae3H`@|h7v9JFHE+IeX7;P|-7z0qRzAUB<#PI)xsVcd zRZIPuALh)qh;ofav*QIpqp_X%^{BM&Z^)9@k(*w(C8@O54yQ=={Gc8B)Ruwr({m!f z^Cdki?vL_-damCMUiPJYE$JA?Q~+Q!odFmO(a=H1Nkr*zt0$vmw-;qRB5%vh(U_XZ zE}Q4DK!c>C%HX%b7UeU44p=`~|^b*{1LZ{OKlbTfpl z3Bt%^h*C{2j57R=H+o#e71AB#MKuy3T|s`Bia)OltTq68P_;r)J}XJ)??KNj`-hH+?4d|$tj&w4dM zIBO(+TZcttNVsO(Ezb!<+aAvS+$!$|UANqJ{Eq9D>u&fg3VLiWxk~iWr(}iPIU$;w zTHgUYPp_g+i{I7TtJCATFg8q3+G`2#6U=-6@VO)XYbW&p#c91K(@u3WDWbS zx&>s03PlwsFaBC$GG8m*ETOUtSO&V(#IPSHObSp*cAi#7``Q}mtRgF! zD)geTn`*n`IZ-F@4;0}Zq>#TLz*1u+n+U{8V66cz0WJfiq$;c#U9a^g=2c{_0j>k4 zOij2O?3aFesrGMXssWp~#F=O?=qB6O8Vb#^ciH+4%(gNy$sA@#k`T?4wQV<|=oc?8 zOpC~?o#lASc>55S@l+i7jg24cR*E)6gx&&V1@J`6iFiu Date: Wed, 27 Mar 2024 11:40:34 -0400 Subject: [PATCH 2/3] reverted image loaded --- VisionStack.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VisionStack.py b/VisionStack.py index 188350a..a847582 100644 --- a/VisionStack.py +++ b/VisionStack.py @@ -91,7 +91,7 @@ def visualize(self): stack = VisionStack([ResizeLayer.ResizeLayer((0,0), 960, 608), # GaussianLayer.GaussianLayer(SIZE, (5,5), 10) ], SIZE) - img = Image.open(os.path.join(os.path.dirname(__file__), 'imgs/EXAMPLE_img1.jpg')) + img = Image.open(os.path.join(os.path.dirname(__file__), 'imgs/sample.png')) CLASSES = [ "buoy_abydos_serpenscaput", "buoy_abydos_taurus", From 21fcafc7f7b979949da460c785406c71870b2320 Mon Sep 17 00:00:00 2001 From: AlexanderWangY Date: Thu, 28 Mar 2024 16:03:04 -0400 Subject: [PATCH 3/3] updated desription for histogram layer --- layers/HistogramEquivalizationLayer.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/layers/HistogramEquivalizationLayer.py b/layers/HistogramEquivalizationLayer.py index 8fd03fa..289fa6e 100644 --- a/layers/HistogramEquivalizationLayer.py +++ b/layers/HistogramEquivalizationLayer.py @@ -6,6 +6,8 @@ class HistogramEqualizaionLayer(PreprocessLayer): def __init__(self, size) -> None: """ Equalizes the pixels between pixel intesities based on the pixel histogram + + Requires Grayscale images to process """ super().__init__(size, "histogram-equalization") @@ -17,6 +19,8 @@ class HistogramAdaptiveEqualizationLayer(PreprocessLayer): def __init__(self, size) -> None: """ Adaptively equalizes the pixel histogram + + Requires Grayscale images to process """ super().__init__(size, "adaptive-histogram-equalization")