对于垂直和水平特征过滤器的理解
1、首先是sobel算子,用于检测图像的轮廓
开始使用的是垂直特征检测的过滤器,可以识别图像轮廓
后来使用了水平特征检测的过滤器,也可以识别图像轮廓
import tensorflow as tf
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
myimg = mpimg.imread("images/te.jpg")
plt.imshow(myimg)
plt.axis("off")
plt.show()
print(myimg.shape)
full = np.reshape(myimg,[1,566,500,3])
inputfull = tf.Variable(tf.constant(1.0,shape=[1,566,500,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]))
filter = tf.Variable(tf.constant([[-1.0,-1.0,-1.0],[-2.0,-2.0,-2.0],[-1.0,-1.0,-1.0],[0,0,0],[0,0,0],
[0,0,0],[1.0,1.0,1.0],[2.0,2.0,2.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)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
t,f = sess.run([o,filter],feed_dict={inputfull:full})
t = np.reshape(t,[566,500])
plt.imshow(t,cmap="Greys_r")
plt.axis("off")
plt.show()
2、个人理解
可能是因为对于大的图片来说,垂直特征过滤器和水平特征过滤器能起到类似作用,因为对于颜色变化的区域,很少是非常垂直或者平行的,都存在斜角,并且像素点的显示是矩形,也就是会有在水平和垂直方向都有颜色的变化(下降幅度不同),能检测出对应特征,但可以发现对相应的特征检测更明显
对应的图片如下:
-
原图
-
垂直检测过滤器
-
水平检测过滤器
-
原图局部区域放大
3、总结
-
首先可以发现垂直特征检测和水平特征检测虽然都得到了人物的大致轮廓,但是轮廓的细节是存在不同的,即对于原图中色彩变化是很水平或者垂直的,则必须要在相应的特征检测器中才能识别出。
-
从原图放大的细节来看,只要不是绝对水平或者垂直的色彩变化,都是想两个方向(水平和垂直)共同变化的,只是变化的幅度不同(即色差不同)。考虑到像素点在屏幕上的显示是一个个小方块,呈矩形状,而过滤器就是以像素点为单位组成的方块,便能对两个方向的色差变化做出识别(卷积操作)。而对于绝对水平的区域,垂直过滤器自然无法识别出特征(无法通过卷积得到分界线)。