Project IA Deep Learning - Convolution Img 2D

Philippe Jadoul - 02 june 2023

A comprehensive exemple for a 2D convolution and image filtering

(The first step to understand Convolutional Neural Networks (CNNs)).

In [44]:
import sys
import os

Import my_fonctions

In [45]:
sys.path.append("/home/ia-serveur/ia/my_lib_functions")
#sys.path.append("/home/ia/ia/my_lib_functions")
from my_functions import *
first_function()
This is the first function
In [46]:
#Function no_print_warning
no_print_warning()
In [47]:
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
In [48]:
#Path Folder Images
path_img = "./img/"
In [49]:
#Function Load Image
#return np_img - nb Channel c

def load_image(img):
    input_img = Image.open(img)
    
    plt.figure()
    plt.title("Input Image")
    plt.imshow(input_img)
    plt.show()
    
    # Normalize img
    np_img = np.array(input_img) /255.0
    
    c = np_img.shape[2]

    return np_img,c
In [50]:
#Function Plot Img R-G-B
def plot_rgb(img_r,img_g,img_b,c):
    m = img_r.shape[0]
    n = img_r.shape[1]
    img_red_show = np.zeros((m,n,c), 'uint8')
    img_red_show[:,:,0] = img_r * 255.0
    img_green_show = np.zeros((m,n,c), 'uint8')
    img_green_show[:,:,1] = img_g * 255.0
    img_blue_show = np.zeros((m,n,c), 'uint8')
    img_blue_show[:,:,2] = img_b * 255.0
    
    plt.figure(figsize=(15,15))
    plt.subplot(1, 3, 1)
    plt.title("Read Channel")
    plt.imshow(img_red_show)

    plt.subplot(1, 3, 2)
    plt.title("Green Channel")
    plt.imshow(img_green_show)

    plt.subplot(1, 3, 3)
    plt.title("Blue Channel")
    plt.imshow(img_blue_show)

    plt.show()
In [51]:
#Function Rebuilt RGB Image from Channel
def rebuilt_rgb(img_r,img_g,img_b,c): 
    m = img_r.shape[0]
    n = img_r.shape[1]
    
    rgbArray = np.zeros((m,n,c),'uint8')
    rgbArray[:,:,0] = img_r * 255.0
    rgbArray[:,:,1] = img_g * 255.0
    rgbArray[:,:,2] = img_b * 255.0
    
    plt.figure(figsize=(15,15))
    plt.subplot(1, 2, 1)
    plt.title("Input Image")
    plt.imshow(in_img)
    
    plt.subplot(1, 2, 2)
    plt.title("Convolutional RGB Image")
    plt.imshow(rgbArray)
    plt.show()
    
    abstract(in_img)
    abstract(rgbArray)

Load Image

In [52]:
in_img,C = load_image(path_img + "test_image.jpg")

Infos Image

In [53]:
print("Shape Image",in_img.shape)
print("Type",in_img.dtype)
abstract(in_img)
Shape Image (576, 768, 3)
Type float64

Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb
In [54]:
#Select Image R-G-B
img_red = in_img[:,:,0]
img_green = in_img[:,:,1]
img_blue = in_img[:,:,2]
In [55]:
def convolve2d(image_c, kernel_c, padding):
    # pad
    pad = kernel_c.shape[0] - 1 
    # Flip the kernel
    kernel_c = np.flipud(np.fliplr(kernel_c))
    
    if padding == True:  
        output = np.zeros(shape=((image_c.shape[0])+(2*pad)-(kernel_c.shape[0])+1,
                            (image_c.shape[1])+(2*pad)-(kernel_c.shape[0])+1))
        image_padded = np.zeros((image_c.shape[0] + 2*pad, image_c.shape[1] + 2*pad))
        for y in range(image_c.shape[0]):
            for x in range(image_c.shape[1]):
                image_padded[y+pad][x+pad]=image_c[y][x]
        
        image_to_cv = image_padded       
    else:   
        output = np.zeros(shape=((image_c.shape[0])-(kernel.shape[0])+1,
                            (image_c.shape[1])-(kernel.shape[0])+1))
        image_to_cv = image_c
         
    #Convolution
    for y in range(image_to_cv.shape[0]-kernel_c.shape[0]+1):
        for x in range(image_to_cv.shape[1]-kernel_c.shape[0]+1):
            output[y, x] = (kernel_c * image_to_cv[y:y+kernel_c.shape[0],x:x+kernel_c.shape[0]]).sum()
    
    return output

Filter Identity - No Padding

Kernel [0,0,0], [0,1,0], [0,0,0]

In [56]:
kernel = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
cv_red = convolve2d(img_red,kernel,padding=False)
cv_green = convolve2d(img_green,kernel,padding=False)
cv_blue = convolve2d(img_blue,kernel,padding=False)

Plot Identity RGB Channel

In [57]:
plot_rgb(cv_red,cv_green,cv_blue,C) 

Plot Rebuilt Identity Image From RGB Channel

In [58]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(574, 766, 3) Type=uint8 Nb_Bytes=1 Mb

Filter Sharpen - With Padding

Kernel [0, -1, 0], [-1, 5, -1], [0, -1, 0]

In [59]:
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Sharpened Image From RGB Channel

In [60]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(578, 770, 3) Type=uint8 Nb_Bytes=1 Mb

Filter Edge detection - With Padding

Kernel [-1,-1,-1], [-1,8,-1], [-1,-1,-1]

In [61]:
kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Edge Detection Image From RGB Channel

In [62]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(578, 770, 3) Type=uint8 Nb_Bytes=1 Mb

Filter Box blur - With Padding

Kernel ([1,1,1], [1,1,1], [1,1,1]) * (1/9)

In [63]:
kernel = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
kernel = kernel * (1/9)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Box Blur Image From RGB Channel

In [64]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(578, 770, 3) Type=uint8 Nb_Bytes=1 Mb

Filter Gaussian Blur (Sigma=0.8) - With Padding

Kernel(3x3) ([1,2,1], [2,4,4], [1,2,1]) * (1/16)

In [65]:
kernel = np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]])
kernel = kernel * (1/16)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Gaussian Blur (Sigma=0.8) Image From RGB Channel

In [66]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(578, 770, 3) Type=uint8 Nb_Bytes=1 Mb

Filter Gaussian Blur (Sigma=1) - With Padding

Kernel(5x5) ([1,4,6,4,3],[4,18,30,18,4],[6,30,48,30,6],[4,18,30,18,4],[1,4,6,4,1]) * (1/300)

In [67]:
kernel = np.array([[1,4,6,4,3],[4,18,30,18,4],[6,30,48,30,6],[4,18,30,18,4],[1,4,6,4,1]]) 
kernel = kernel * (1/300)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Gaussian Blur (Sigma=1) Image From RGB Channel

In [68]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(576, 768, 3) Type=float64 Nb_Bytes=10 Mb

Abstract: Class=ndarray Shape=(580, 772, 3) Type=uint8 Nb_Bytes=1 Mb

Load Image

In [69]:
in_img,C = load_image(path_img + "Lenna_image.png")
img_red = in_img[:,:,0]
img_green = in_img[:,:,1]
img_blue = in_img[:,:,2]

Filter Identity - No Padding

Kernel [0,0,0], [0,1,0], [0,0,0]

In [70]:
kernel = np.array([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
cv_red = convolve2d(img_red,kernel,padding=False)
cv_green = convolve2d(img_green,kernel,padding=False)
cv_blue = convolve2d(img_blue,kernel,padding=False)

Plot Identity RGB Channel

In [71]:
plot_rgb(cv_red,cv_green,cv_blue,C) 

Plot Rebuilt Identity Image From RGB Channel

In [72]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(510, 510, 3) Type=uint8 Nb_Bytes=780 Kb

Filter Sharpen - With Padding

Kernel [0, -1, 0], [-1, 5, -1], [0, -1, 0]

In [73]:
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Sharpened Image From RGB Channel

In [74]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C)
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(514, 514, 3) Type=uint8 Nb_Bytes=792 Kb

Filter Edge detection - With Padding

Kernel [-1,-1,-1], [-1,8,-1], [-1,-1,-1]

In [75]:
kernel = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Edge Detection Image From RGB Channel

In [76]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(514, 514, 3) Type=uint8 Nb_Bytes=792 Kb

Filter Box blur - With Padding

Kernel ([1,1,1], [1,1,1], [1,1,1]) * (1/9)

In [77]:
kernel = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]])
kernel = kernel * (1/9)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Box Blur Image From RGB Channel

In [78]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(514, 514, 3) Type=uint8 Nb_Bytes=792 Kb

Filter Gaussian Blur (Sigma=0.8) - With Padding

Kernel(3x3) ([1,2,1], [2,4,4], [1,2,1]) * (1/16)

In [79]:
kernel = np.array([[1, 2, 1], [2, 4, 2], [1, 2, 1]])
kernel = kernel * (1/16)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Gaussian Blur (Sigma=0.8) Image From RGB Channel

In [80]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(514, 514, 3) Type=uint8 Nb_Bytes=792 Kb

Filter Gaussian Blur (Sigma=1) - With Padding

Kernel(5x5) ([1,4,6,4,3],[4,18,30,18,4],[6,30,48,30,6],[4,18,30,18,4],[1,4,6,4,1]) * (1/300)

In [81]:
kernel = np.array([[1,4,6,4,3],[4,18,30,18,4],[6,30,48,30,6],[4,18,30,18,4],[1,4,6,4,1]]) 
kernel = kernel * (1/300)
cv_red = convolve2d(img_red,kernel,padding=True)
cv_green = convolve2d(img_green,kernel,padding=True)
cv_blue = convolve2d(img_blue,kernel,padding=True)

Plot Rebuilt Gaussian Blur (Sigma=1) Image From RGB Channel

In [82]:
rebuilt_rgb(cv_red,cv_green,cv_blue,C) 
Abstract: Class=ndarray Shape=(512, 512, 3) Type=float64 Nb_Bytes=6 Mb

Abstract: Class=ndarray Shape=(516, 516, 3) Type=uint8 Nb_Bytes=798 Kb
In [ ]: