黑白边界检测
设置宽度方向的卷积核为[1,0,−1],此卷积核会将宽度方向间隔为1的两个像素点的数值相减。当卷积核在图片上滑动时,如果它所覆盖的像素点位于亮度相同的区域,则左右间隔为1的两个像素点数值的差为0。只有当卷积核覆盖的像素点有的处于光亮区域,有的处在黑暗区域时,左右间隔为1的两个点像素值的差才不为0。
import matplotlib.pyplot as plt
import numpy as np
import paddle
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
%matplotlib inline
#创建一个数组,采用【1,0,-1】的模式,为的是比较三个相邻数据中两边是否有区别,若同色则无色素差,异色则有色素差
w=np.array([1,0,-1],dtype='float32')
#将数组调整纬度,调整为[cout, cin, kh, kw],即【输入图片的通道数,输出图片通道数,高度,宽度】
w=w.reshape([1,1,1,3])
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[1, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
img=np.ones([50,50],dtype='float32')
img[:,30:]=0
x=img.reshape([1,1,50,50])
x=paddle.to_tensor(x)
y=conv(x)
out=y.numpy()
f=plt.subplot(121)
f.set_title('input image',fontsize=15)
plt.imshow(img,cmap='gray')
f=plt.subplot(122)
f.set_title('output featuremap',fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
结果:
对图片进行描边处理:
使用合适的卷积核(3*3卷积核的中间值是8,周围一圈的值是8个-1)对其进行操作,用来检测物体的外形轮廓,观察输出特征图跟原图之间的对应关系
import matplotlib.pyplot as plt
from PIL import Image
import paddle
import numpy as np
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
img = Image.open('./work/images/section1/th.jpg')
#因为图片为彩色,含有RGB三个通道,所以我们创造一个三维的卷积核,
w=np.array([[-1,-1,-1],[-1,8,-1],[-1,-1,-1]],dtype='float32')/8
#因为图片为彩色,含有RGB三个通道,因此输入通道数为3,因为创造的卷积核为高宽都为3,输出通道数为1,所以为【1,3,3,3】
w = w.reshape([1, 1, 3, 3])
w=np.repeat(w,3,axis=1)
conv = Conv2D(in_channels=3, out_channels=1, kernel_size=[3, 3],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
x=np.array(img).astype('float32')
#因为图片读入时,形状是【H,W,3】,而应该的形状为【3,H,W】,所以我们将纬度进行调整
x=np.transpose(x,(2,0,1))
#将纬度调整为【N,C,H,W】
x = x.reshape(1, 3, img.height, img.width)
x = paddle.to_tensor(x)
#进行卷积运算
y = conv(x)
# 将输出tensor转化为numpy.ndarray
out=y.numpy()
plt.figure(figsize=(20, 10))
f = plt.subplot(121)
f.set_title('input image', fontsize=15)
plt.imshow(img)
f = plt.subplot(122)
f.set_title('output feature map', fontsize=15)
plt.imshow(out.squeeze(), cmap='gray')
plt.show()
结果:
对图片进行模糊化处理:
采用(5*5的卷积核中每个值均为1)是用当前像素跟它邻域内的像素取平均,这样可以使图像上噪声比较大的点变得更平滑
import paddle
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
from paddle.nn import Conv2D
from paddle.nn.initializer import Assign
#打开图片
img = Image.open('./work/images/section1/th.jpg').convert('L')
#将图片转化为数组
img = np.array(img)
#创建一个5*5的卷积核中每个值均为1
w = np.ones([1, 1, 5, 5], dtype = 'float32')/25
conv = Conv2D(in_channels=1, out_channels=1, kernel_size=[5, 5],
weight_attr=paddle.ParamAttr(
initializer=Assign(value=w)))
x = img.astype('float32')
x = x.reshape(1,1,img.shape[0], img.shape[1])
x = paddle.to_tensor(x)
#对图像数组进行卷积处理
y = conv(x)
out = y.numpy()
#将图片表示出来
plt.figure(figsize=(20, 12))
f = plt.subplot(121)
f.set_title('input image')
plt.imshow(img, cmap='gray')
f = plt.subplot(122)
f.set_title('output feature map')
out = out.squeeze()
plt.imshow(out, cmap='gray')
plt.show()