From a2fee03a8a06738ca71cf6a1fc21ef9f8dbe5b6a Mon Sep 17 00:00:00 2001 From: Martin Thoma Date: Thu, 12 Jan 2017 14:57:41 +0100 Subject: [PATCH] Update filter example --- .../convolution-linear/convolution-linear.png | Bin 18054 -> 28312 bytes .../convolution-linear/convolution-linear.tex | 169 ++++++++++++++++-- tikz/convolution-linear/filter.py | 20 +++ 3 files changed, 172 insertions(+), 17 deletions(-) create mode 100644 tikz/convolution-linear/filter.py diff --git a/tikz/convolution-linear/convolution-linear.png b/tikz/convolution-linear/convolution-linear.png index d54b124664f607641942904f64efd66db05c5c2f..b22ea9d2bafe7fb07e7532881ae2c92f8eaf45b7 100644 GIT binary patch literal 28312 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 literal 18054 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 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)