使用卷积提取图片的轮廓
简介:
使用sobel算子,将彩色图片生成带有边缘化信息的图片。本例先载入一张图片,然后使用一个“3通道输入,1通道输出的3x3卷积核”(也就是sobel算子),因为是彩色(三通道)图片,所以使用是三通道。
1.首先载入图片:‘
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
mying=plt.imread('lena.jpg')
plt.imshow(mying)
plt.axis('off') #不加横纵坐标轴
plt.show()
print(mying.shape)
结果;
从结果上看,载入的图片的大小是256x256,通道是3.
2.定义占位符,卷积核,卷积op
- 首先利用np.reshape()函数将图片转为一维数组,长度为4,因为tf.conv2d()函数input要求是一维长度是4,含义如下:
[训练时一个batch的图片数量,图片高度,图片宽度,图像通道数] - 用占位符定义一个tf变量(形状必须也图片一致),以便后面将转为数组的图片放进去,转为tf.conv2d需要的张量(input是一个张量)
- 定义卷积核,形状要求是[3,3,3,1],即卷积核大小3x3,输入通道3,输出通道1.
- 调用卷积函数tf.conv2d,步长设置为[1,1,1,1],其中卷积核移动步长为1x1,其他的1,首位是样本上的步长,尾部的是通道上步长,通常都默认为1.
-由于sobel算子处理过的图片不能保证每一个像素都在0-255之间,对于区间外的像素点会导致灰度图无法显示,所以要将特征图归一化,归一化后都能保证每一个像素点都在[0,1]之间,然后再乘以255,就能保证像素点在0-256之间了。
归一化的公式:x=(x-min)/(max-min)
full=np.reshape(mying,[1,256,256,3]) # 将图片转换指定形状的数组
inputfull=tf.Variable(tf.constant(1.0,shape=[1,256,256,3])) #定义了一个指定形状的变量,并用1初始化
filter=tf.Variable(tf.constant([[-1.0,-1.0,-1.0],[0,0,0],[1.0,1.0,1.0],
[-2.0,-2.0,-2.0],[0,0,0],[2.0,2.0,2.0],
[-1.0,-1.0,-1.0],[0,0,0],[1.0,1.0,1.0]],
shape=[3,3,3,1]))
op=tf.nn.conv2d(inputfull,filter,strides=[1,1,1,1],padding='SAME')
o=tf.cast(((op-tf.reduce_min(op))/(tf.reduce_max(op)-tf.reduce_min(op)))*255,tf.uint8)
3.运行卷积操作并显示
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
t,f=sess.run([o,filter],feed_dict={inputfull:full})#t:归一化后的特征图 f:滤波器
t=np.reshape(t,[256,256]) #因为特征图是四维的,要显示出来就要转为二维的图像
print(t)
plt.imshow(t,'Greys_r')#显示灰度图像
plt.axis('off')
plt.show()
结果: