瀏覽代碼

Update filter example

Martin Thoma 8 年之前
父節點
當前提交
a2fee03a8a
共有 3 個文件被更改,包括 174 次插入19 次删除
  1. 二進制
      tikz/convolution-linear/convolution-linear.png
  2. 154 19
      tikz/convolution-linear/convolution-linear.tex
  3. 20 0
      tikz/convolution-linear/filter.py

二進制
tikz/convolution-linear/convolution-linear.png


+ 154 - 19
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$};
-
-    \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);
-
-    \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 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}$};
+
+    % 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=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}

+ 20 - 0
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)