diff --git a/tikz/convolution-linear/convolution-linear.png b/tikz/convolution-linear/convolution-linear.png index d54b124..b22ea9d 100644 Binary files a/tikz/convolution-linear/convolution-linear.png and b/tikz/convolution-linear/convolution-linear.png differ diff --git a/tikz/convolution-linear/convolution-linear.tex b/tikz/convolution-linear/convolution-linear.tex index 53b393c..cd84c1a 100644 --- a/tikz/convolution-linear/convolution-linear.tex +++ b/tikz/convolution-linear/convolution-linear.tex @@ -9,19 +9,20 @@ \newcommand{\filtery}{2.2} \newcommand{\filteroffset}{1} +\newcommand{\filterxres}{12} + \newcommand{\imagesize}{7} \newcommand{\imagex}{0} \newcommand{\imagey}{0} \newcommand{\imageoffset}{2} -\newcommand{\outx}{13} +\newcommand{\outx}{16} \newcommand{\outy}{0} \newcommand{\outoffset}{2} \newcommand{\percx}{1} \newcommand{\percy}{2} \begin{tikzpicture} -% ,circle,thick,draw=black,fill=black,minimum width=4pt,minimum height=4pt \tikzstyle{point}=[draw=none,inner sep=0pt] @@ -45,7 +46,7 @@ \outy+\percy+1+\percx*\outoffset/\imagesize+1*\outoffset/\imagesize+1+1*\outoffset/\imagesize) {}; \node (o4)[point] at (\outx+\percx+1, \outy+\percy+2+\percx*\outoffset/\imagesize+1*\outoffset/\imagesize) {}; - \draw[fill=black] (o1.center) -- (o2.center) -- (o3.center) -- (o4.center) -- (o1.center); + \draw[fill=gray] (o1.center) -- (o2.center) -- (o3.center) -- (o4.center) -- (o1.center); % draw image \foreach \x in {0,...,\imagesize} @@ -61,6 +62,13 @@ \draw (\filterx, \filtery+\x) -- (\filterx+\filtersize, \filtery+\x+\filteroffset); } + % draw filter result + \foreach \x in {0,...,\filtersize} + { + \draw (\filterxres+\x, \filtery+\x*\filteroffset/\filtersize) -- (\filterxres+\x, \filtery+\filtersize+\x*\filteroffset/\filtersize); + \draw (\filterxres, \filtery+\x) -- (\filterxres+\filtersize, \filtery+\x+\filteroffset); + } + % draw out \foreach \x in {0,...,\imagesize} { @@ -68,21 +76,148 @@ \draw (\outx, \outy+\x) -- (\outx+\imagesize, \outy+\x+\outoffset); } - \node at (\imagex + \imagesize/2,\imagey + \imagesize + 2) {$I \in \mathbb{R}^{\imagesize \times \imagesize}$}; - \node at (\filterx + \filtersize/2,\filtery + \filtersize + 2) {$F \in \mathbb{R}^{\filtersize \times \filtersize}$}; - \node at (\outx + \imagesize/2,\outy + \imagesize + 2) {$I' \in \mathbb{R}^{\imagesize \times \imagesize}$}; - \node[draw,circle] (sumsymb) at (\filterx + \filtersize+1,\filtery + \filtersize/2 + \filteroffset-0.5) {$\sum$}; + \node at (\imagex + \imagesize/2,\imagey + \imagesize + 2) {\Huge $I \in \mathbb{R}^{\imagesize \times \imagesize}$}; + \node[text width=4cm, align=center] at (\filterx + \filtersize/2,\filtery + \filtersize - 4) {\large Filter kernel\\$F \in \mathbb{R}^{\filtersize \times \filtersize}$}; + \node[text width=4cm, align=center] at (\filterx + 4 + \filtersize/2,\filtery + \filtersize - 4) {\large Result of point-wise multiplication}; + \node at (\outx + \imagesize/2,\outy + \imagesize + 2) {\Huge $I' \in \mathbb{R}^{\imagesize \times \imagesize}$}; - \draw[dashed] (1.5, 2.9) -- (10.5, 2.9) -- (sumsymb.center); - \draw[dashed] (1.5, 2.9+\filtersize-1) -- (10.5, 2.9+\filtersize-1) -- (sumsymb.center); - \draw[dashed] (1.5+\filtersize-1, 2.9+\filtersize-1+2*\filteroffset/3) -- (10.5+\filtersize-1, 2.9+\filtersize-1+2*\filteroffset/3) -- (sumsymb.center); - \draw[dashed] (1.5+\filtersize-1, 2.9+2*\filteroffset/3) -- (10.5+\filtersize-1, 2.9+2*\filteroffset/3) -- (sumsymb.center); - \draw[dashed] (sumsymb.center) -- (15, 4); + % Start image (left to right, top to bottom) + \node[draw=none] at (0.5, 6.6) {\large 104}; + \node[draw=none] at (1.5, 6.9) {\large 116}; + \node[draw=none] at (2.5, 7.2) {\large 116}; + \node[draw=none] at (3.5, 7.5) {\large 112}; + \node[draw=none] at (4.5, 7.8) {\large 58}; + \node[draw=none] at (5.5, 8.1) {\large 47}; + \node[draw=none] at (6.5, 8.4) {\large 47};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - \node[draw,circle,fill=white] at (5.5, 2.9) {$+$}; - \node[draw,circle,fill=white] at (5.5+\filtersize-1, 2.9+2*\filteroffset/3) {$+$}; - \node[draw,circle,fill=white] at (5.5+\filtersize-1, 2.9+2*\filteroffset/3+\filtersize-1) {$+$}; - \node[draw,circle,fill=white] at (5.5, 2.9+\filtersize-1) {$+$}; - \node[draw,circle,fill=white] at (sumsymb.center) {$\sum$}; + \node[draw=none] at (0.5, 5.6) {\large 109}; + \node[draw=none] at (1.5, 5.9) {\large 97}; + \node[draw=none] at (2.5, 6.2) {\large 114}; + \node[draw=none] at (3.5, 6.5) {\large 116}; + \node[draw=none] at (4.5, 6.8) {\large 105}; + \node[draw=none] at (5.5, 7.1) {\large 110}; + \node[draw=none] at (6.5, 7.4) {\large 45};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \node[draw=none] at (0.5, 4.6) {\large 116}; + \node[draw=none] at (1.5, 4.9) {\large 104}; + \node[draw=none] at (2.5, 5.2) {\large 111}; + \node[draw=none] at (3.5, 5.5) {\large 109}; + \node[draw=none] at (4.5, 5.8) {\large 97}; + \node[draw=none] at (5.5, 6.1) {\large 46}; + \node[draw=none] at (6.5, 6.4) {\large 100};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \node[draw=none] at (0.5, 3.6) {\large 101}; + \node[draw=none] at (1.5, 3.9) {\large 47}; + \node[draw=none] at (2.5, 4.2) {\large 109}; + \node[draw=none] at (3.5, 4.5) {\large 97}; + \node[draw=none] at (4.5, 4.8) {\large 115}; + \node[draw=none] at (5.5, 5.1) {\large 116}; + \node[draw=none] at (6.5, 5.4) {\large 101};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \node[draw=none] at (0.5, 2.6) {\large 114}; + \node[draw=none] at (1.5, 2.9) {\large 47}; + \node[draw=none] at (2.5, 3.2) {\large 99}; + \node[draw=none] at (3.5, 3.5) {\large 97}; + \node[draw=none] at (4.5, 3.8) {\large 116}; + \node[draw=none] at (5.5, 4.1) {\large 99}; + \node[draw=none] at (6.5, 4.4) {\large 97};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \node[draw=none] at (0.5, 1.6) {\large 116}; + \node[draw=none] at (1.5, 1.9) {\large 99}; + \node[draw=none] at (2.5, 2.2) {\large 97}; + \node[draw=none] at (3.5, 2.5) {\large 116}; + \node[draw=none] at (4.5, 2.8) {\large 46}; + \node[draw=none] at (5.5, 3.1) {\large 112}; + \node[draw=none] at (6.5, 3.4) {\large 104};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + \node[draw=none] at (0.5, 0.6) {\large 112}; + \node[draw=none] at (1.5, 0.9) {\large 63}; + \node[draw=none] at (2.5, 1.2) {\large 118}; + \node[draw=none] at (3.5, 1.5) {\large 61}; + \node[draw=none] at (4.5, 1.8) {\large 49}; + \node[draw=none] at (5.5, 2.1) {\large 46}; + \node[draw=none] at (6.5, 2.4) {\large 48};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + % Filter + \node[draw=none] at ( 8.5, 4.8) {\large 9}; + \node[draw=none] at ( 9.5, 5.1) {\large -3}; + \node[draw=none] at (10.5, 5.4) {\large -1};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \node[draw=none] at ( 8.5, 3.8) {\large -6}; + \node[draw=none] at ( 9.5, 4.1) {\large 5}; + \node[draw=none] at (10.5, 4.4) {\large 3};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \node[draw=none] at ( 8.5, 2.8) {\large 2}; + \node[draw=none] at ( 9.5, 3.1) {\large -8}; + \node[draw=none] at (10.5, 3.4) {\large 0};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + % Result + \node[draw=none] at (12.5, 4.8) {\large 936}; + \node[draw=none] at (13.5, 5.1) {\large -333}; + \node[draw=none] at (14.5, 5.4) {\large -109};%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \node[draw=none] at (12.5, 3.8) {\large -282}; + \node[draw=none] at (13.5, 4.1) {\large 545}; + \node[draw=none] at (14.5, 4.4) {\large 291};%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + \node[draw=none] at (12.5, 2.8) {\large 94}; + \node[draw=none] at (13.5, 3.1) {\large -792}; + \node[draw=none] at (14.5, 3.4) {\large 0};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + % Result image (left to right, top to bottom) + % [[ -4 -254 -498 -662 -849 -642 -187] + \node[draw=none] at (16.5, 6.6) {\large -4}; + \node[draw=none] at (17.5, 6.9) {\large -254}; + \node[draw=none] at (18.5, 7.2) {\large -498}; + \node[draw=none] at (19.5, 7.5) {\large -662}; + \node[draw=none] at (20.5, 7.8) {\large -849}; + \node[draw=none] at (21.5, 8.1) {\large -642}; + \node[draw=none] at (22.5, 8.4) {\large 187};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [-520 45 240 211 388 215 -861] + \node[draw=none] at (16.5, 5.6) {\large-520}; + \node[draw=none] at (17.5, 5.9) {\large 45}; + \node[draw=none] at (18.5, 6.2) {\large 240}; + \node[draw=none] at (19.5, 6.5) {\large 211}; + \node[draw=none] at (20.5, 6.8) {\large 388}; + \node[draw=none] at (21.5, 7.1) {\large 215}; + \node[draw=none] at (22.5, 7.4) {\large-861};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [-340 559 -105 185 -138 -180 503] + \node[draw=none] at (16.5, 4.6) {\large -340}; + \node[draw=none] at (17.5, 4.9) {\large 559}; + \node[draw=none] at (18.5, 5.2) {\large -105}; + \node[draw=none] at (19.5, 5.5) {\large 185}; + \node[draw=none] at (20.5, 5.8) {\large -138}; + \node[draw=none] at (21.5, 6.1) {\large -180}; + \node[draw=none] at (22.5, 6.4) {\large 503};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [-718 429 350 173 251 268 -655] + \node[draw=none] at (16.5, 3.6) {\large -718}; + \node[draw=none] at (17.5, 3.9) {\large 429}; + \node[draw=none] at (18.5, 4.2) {\large 350}; + \node[draw=none] at (19.5, 4.5) {\large 173}; + \node[draw=none] at (20.5, 4.8) {\large 251}; + \node[draw=none] at (21.5, 5.1) {\large 268}; + \node[draw=none] at (22.5, 5.4) {\large -655};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [-567 -53 -75 80 571 -128 24] + \node[draw=none] at (16.5, 2.6) {\large -567}; + \node[draw=none] at (17.5, 2.9) {\large -53}; + \node[draw=none] at (18.5, 3.2) {\large -75}; + \node[draw=none] at (19.5, 3.5) {\large 80}; + \node[draw=none] at (20.5, 3.8) {\large 571}; + \node[draw=none] at (21.5, 4.1) {\large -128}; + \node[draw=none] at (22.5, 4.4) {\large 24};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [-408 596 -550 368 26 976 156] + \node[draw=none] at (16.5, 1.6) {\large -408}; + \node[draw=none] at (17.5, 1.9) {\large 596}; + \node[draw=none] at (18.5, 2.2) {\large -550}; + \node[draw=none] at (19.5, 2.5) {\large 368}; + \node[draw=none] at (20.5, 2.8) {\large 26}; + \node[draw=none] at (21.5, 3.1) {\large 976}; + \node[draw=none] at (22.5, 3.4) {\large 156};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % [ 302 647 879 223 811 54 660]] + \node[draw=none] at (16.5, 0.6) {\large 302}; + \node[draw=none] at (17.5, 0.9) {\large 647}; + \node[draw=none] at (18.5, 1.2) {\large 879}; + \node[draw=none] at (19.5, 1.5) {\large 223}; + \node[draw=none] at (20.5, 1.8) {\large 811}; + \node[draw=none] at (21.5, 2.1) {\large 54}; + \node[draw=none] at (22.5, 2.4) {\large 660};%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \end{tikzpicture} \end{document} diff --git a/tikz/convolution-linear/filter.py b/tikz/convolution-linear/filter.py new file mode 100644 index 0000000..f2245f2 --- /dev/null +++ b/tikz/convolution-linear/filter.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python + +import scipy.signal +import numpy as np + +image = [[104, 116, 116, 112, 58, 47, 47], + [109, 97, 114, 116, 105, 110, 45], + [116, 104, 111, 109, 97, 46, 100], + [101, 47, 109, 97, 115, 116, 101], + [114, 47, 99, 97, 116, 99, 97], + [116, 99, 97, 116, 46, 112, 104], + [112, 63, 118, 61, 49, 46, 48]] + +filter_kernel = [[9, -3, -1], + [-6, 5, 3], + [2, -8, 0]] +filter_kernel = np.array(filter_kernel) +res = scipy.signal.convolve2d(image, filter_kernel[::-1, ::-1], + mode='same', boundary='fill', fillvalue=0) +print(res)