Python使用Sobel卷积核提取图片轮廓详解
本文介绍利用Python和TensorFlow通过Sobel卷积核提取图片轮廓的方法。核心步骤包括载入彩色图像,构建3通道输入、1通道输出的3x3卷积核,执行卷积运算后对结果进行归一化处理(映射至[0,1]区间并乘以255),最终输出带有边缘信息的灰度图像。文中还包含环境配置及pip更新建议。
本文通过具体示例展示如何在Python中利用卷积操作提取图片轮廓,供读者参考学习。
一、实例描述
目标是将输入的彩色图像转换为包含边缘信息的图像。
实现流程首先载入一张图片,随后定义一个“3通道输入、1通道输出”的3x3卷积核(即Sobel算子),最后调用卷积函数生成处理后的结果图像。
二、代码
'''''
载入图片并显示
首先将图片放到代码的同级目录下,通过imread载入,然后将其显示并打印出来
'''
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np
import tensorflow as tf
myimg = mpimg.imread('2.jpg') # 读取和代码处于同一目录下的图片
#myimg = mpimg.imread('img.jpg') # 读取和代码处于同一目录下的图片
plt.imshow(myimg) # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
print(myimg.shape)
'''''
上面这段代码输出(960, 720, 3),可以看到,载入图片的维度是960*720大小,3个通道
'''
'''''
这里需要手动将sobel算子填入卷积核里。使用tf.constant函数可以将常量直接初始化到Variable中,因为是3个通道,所以sobel卷积核的每个元素都扩成了3个。
注意:sobel算子处理过的图片并不保证每个像素都在0~255之间,所以要做一次归一化操作(即将每个值减去最小的结果,再除以最大值与最小值的差),让生成的值都在[0,1]之间,然后在乘以255
'''
#full=np.reshape(myimg,[1,3264,2448,3])
full=np.reshape(myimg,[1,960,720,3])
#inputfull = tf.Variable(tf.constant(1.0,shape = [1, 3264, 2448, 3]))
inputfull = tf.Variable(tf.constant(1.0,shape = [1, 960, 720, 3]))
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]))
#步长为1*1,padding为SAME表明是同卷积的操作。
op = tf.nn.conv2d(inputfull, filter, strides=[1, 1, 1, 1], padding='SAME') #3个通道输入,生成1个feature ma
o=tf.cast( ((op-tf.reduce_min(op))/(tf.reduce_max(op)-tf.reduce_min(op)) ) *255 ,tf.uint8)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer() )
t,f=sess.run([o,filter],feed_dict={ inputfull:full})
#print(f)
#t=np.reshape(t,[3264,2448])
t=np.reshape(t,[960,720])
plt.imshow(t,cmap='Greys_r') # 显示图片
plt.axis('off') # 不显示坐标轴
plt.show()
三、运行结果

四、说明
经过Sobel卷积操作后,成功提取出包含轮廓特征的图像。
接下来查看处理后的图片属性。

注:本例使用了tensorflow模块,若未安装可通过pip命令进行安装:
pip install tensorflow
若遇到红字报错,提示需更新pip至较新版本(若无报错可跳过此步直接阅读下一标题)。

将pip更新至最新版本的操作如下:
python -m pip install --upgrade pip
PS:截至目前,TensorFlow尚不支持Python 3.6版本,建议使用兼容性较好的Python 3.5版本。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》
希望本文所述对大家Python程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









