卷积函数的使用——使用卷积提取图片的轮廓

使用卷积提取图片的轮廓

简介:
       使用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()

结果:
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值