本文實例講述了Python實現使用卷積提取圖片輪廓功能。分享給大家供大家參考,具體如下:
一、實例描述
將彩色的圖片生成帶邊緣化信息的圖片。
本例中先載入一個圖片,然后使用一個“3通道輸入,1通道輸出的3*3卷積核”(即sobel算子),最后使用卷積函數輸出生成的結果。
二、代碼
'''''載入圖片并顯示首先將圖片放到代碼的同級目錄下,通過imread載入,然后將其顯示并打印出來'''import matplotlib.pyplot as plt # plt 用于顯示圖片import matplotlib.image as mpimg # mpimg 用于讀取圖片import numpy as npimport tensorflow as tfmyimg = 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 mao=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到更新的版本(不報錯可直接跳過到下一標題)。
|
新聞熱點
疑難解答