How to convolve two 2-dimensional matrices in python with scipy?

Published: August 10, 2021

Examples of how to convolve two 2-dimensional matrices in python with scipy :

Create a 2D kernel with numpy

Lets first create a simple 2D kernel with numpy

````import numpy as np`
`import matplotlib.pyplot as plt`
`import matplotlib as mpl`
`import seaborn as sns; sns.set()`

`K = np.zeros((10,10))`

`K[:,:] = 1`

`K[:,0:5] = -1.`

`print(K)`

`plt.imshow(K)`

`plt.colorbar()`

`    plt.title("Kernel 01")`

`plt.savefig("kernel_01.png", bbox_inches='tight', dpi=100)`

`plt.show()`
```

gives

````[[-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]`
` [-1. -1. -1. -1. -1.  1.  1.  1.  1.  1.]]`
```

and

Create a fake image with numpy

Now lets create a very simple 2D matrix (or image) with numpy

````img = np.zeros((100,100))`

`img[0:50,0:40] = 1.`
`img[50:100,0:60] = 1.`

`print(img)`

`plt.imshow(img)`

`plt.colorbar()`

`plt.savefig("img_01.png", bbox_inches='tight', dpi=100)`

`plt.show()`
```

gives

Convolve two 2-dimensional arrays

To convolve the above image with a kernel. a solution is to use scipy.signal.convolve2d:

````from scipy import signal`

`f1 = signal.convolve2d(img, K, boundary='symm', mode='same')`

`plt.imshow(f1)`

`plt.colorbar()`

`plt.savefig("img_01_kernel_01_convolve2d.png", bbox_inches='tight', dpi=100)`

`plt.show()`
```

gives

Note that here the convolution values are positives.

Another example

Warning: during a convolution the kernel is inverted (see discussion here for example scipy convolve2d outputs wrong values).

Another example of kernel:

````K = np.zeros((10,10))`

`K[:,:] = -1`
`K[:,0:5] = 1.`

`print(K)`

`plt.imshow(K)`

`plt.colorbar()`

`plt.title("Kernel 02")`

`plt.savefig("kernel_02.png", bbox_inches='tight', dpi=100)`

`plt.show()`
```

gives here

2d convolution:

````f1 = signal.convolve2d(img, K, boundary='symm', mode='same')`

`plt.imshow(f1)`

`plt.colorbar()`

`plt.title("2D Convolution")`

`plt.savefig("img_01_kernel_02_convolve2d.png", bbox_inches='tight', dpi=100)`

`plt.show()`
```

returns then

Note that now the values are negatives!

Image

of