Question7 平均值池化
这里,将图像网格分割(分成某个固定长度的区域),用画区域内(单元格)的平均值来填充该区域内的值。
这样分割网格,求出该区域内的代表值的操作被称为“Pooling”。
这些带环操作在CNN(Convolutional Neural Network中起着重要的作用。
这个由以下公式定义。这里所说的R是进行普林的区域。即,在3×3的区域进行普林。|R|=3x3=9。


v = 1/|R| * Sum_{i in R} v_i
在这里imori.jpg因为是128x128,所以将网格分割为8x8,进行平均带环。
import cv2
import numpy as np
image_path = './images/imori.jpg'
image = cv2.imread(image_path)
out = image.copy()
G = 8
H, W, C = image.shape
Nh = int(H / G)
Nw = int(W / G)
for y in range(Nh):
for x in range(Nw):
for c in range(C):
out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
cv2.imshow('out', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
Question8 最大值池化
在这里不要用平均值而是用最大值进行循环。
import cv2
import numpy as np
image_path = './images/imori.jpg'
image = cv2.imread(image_path)
out = image.copy()
G = 8
H, W, C = image.shape
Nh = int(H / G)
Nw = int(W / G)
for y in range(Nh):
for x in range(Nw):
for c in range(C):
out[G*y:G*(y+1), G*x:G*(x+1), c] = np.max(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
cv2.imshow('Gaussian', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
Question9 高斯过滤
安装高斯过滤器(3x3、标准偏差1.3),imorinoise.jpg去除杂音。
高斯滤波器是进行图像的平滑化(平滑)的滤波器的一种,也用于去除噪声。
除噪声之外,还包括中值滤波器(Q.10)、平滑滤波器(Q.11)、LoG滤波器(Q.19)等。
高斯滤波器通过高斯分布的加权对关注像素的周边像素进行平滑化,并用以下公式定义。
这种重量被称为“内核”和“过滤器”。
但是,由于图像的端部不能就这样进行滤波,所以像素不足的部分用0填充。这被称为“0填充”。
并且,权重正规化。(sum g = 1)
权重由高斯分布变为下式。

权重g(x,y,s)=1/(2*pi*sigma*sigma)*exp(-(x^2+y^2)/(2*s^2))
标准偏差s=1.3的8附近高斯过滤器
1 2 1
K = 1/16 [ 2 4 2 ]
1 2 1
import cv2
import numpy as np
image_path = './images/imori_noise.jpg'
image = cv2.imread(image_path)
K_size = 3
sigma = 1.3
if len(image.shape) == 3:
H, W, C = image.shape
else:
image = np.expand_dims(image, axis=-1)
H, W, C = image.shape
pad = K_size // 2
out = (np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float))
out[pad: pad + H, pad: pad + W] = image.copy().astype(np.float)
K = np.zeros((K_size, K_size), dtype=np.float)
for x in range(-pad, -pad + K_size):
for y in range(-pad, -pad + K_size):
K[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2)/(2 * (sigma ** 2)))
K /= (2 * np.pi * sigma * sigma)
K /= K.sum()
tmp = out.copy()
for y in range(H):
for x in range(W):
for c in range(C):
out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])
out = np.clip(out, 0, 255)
out = out[pad: pad + H, pad: pad + W].astype(np.uint8)
cv2.imshow('OUT', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
image_path = './images/imori_noise.jpg'
image = cv2.imread(image_path)
blur = cv2.GaussianBlur(image, (3, 3), 0) # 高斯模糊,高斯核的宽和高必须是奇数
cv2.imshow('Gaussian', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()