前言
没什么重要的,就是想测试一下tensorflow
的投影变换函数tf.contrib.image.transform
中每个参数的含义
国际惯例,参考文档
官方文档
描述
调用方法与默认参数:
tf.contrib.image.transform(images,transforms,interpolation='NEAREST',output_shape=None,name=None
)
输入解释:
-
images: 输入图像的占位符,通常三种输入(图像数量,高,宽,通道),(高,宽,通道),(高,宽)
-
transforms:投影变换矩阵,维数为8的向量,可以是(1,8)或(N,8),假设是(a1,a2,a3,b1,b2,b3,c1,c2)(a_1,a_2,a_3,b_1,b_2,b_3,c_1,c_2)(a1,a2,a3,b1,b2,b3,c1,c2),执行的操作就是将(x,y)投影到(x’,y’)
[a1a2a3b1b2b3]×[xy1]×1k=[x′y′]w.t.l=c1x+c2y+1\begin{bmatrix} a_1&a_2&a_3\\ b_1&b_2&b_3 \end{bmatrix}\times \begin{bmatrix} x\\y\\1 \end{bmatrix}\times \frac{1}{k}=\begin{bmatrix} x'\\y' \end{bmatrix}\\ w.t.\quad l=c_1x+c_2y+1 [a1b1a2b2a3b3]×⎣⎡xy1⎦⎤×k1=[x′y′]w.t.l=c1x+c2y+1
通俗点就是:
[x′,y′]=[(a1x+a2y+a3)/k,(b1x+b2y+b3)/k][x', y'] = [(a_1 x + a_2 y + a_3) / k, (b_1 x + b_2 y + b_3) / k] [x′,y′]=[(a1x+a2y+a3)/k,(b1x+b2y+b3)/k]
通过矩阵的形式更能看出来是坐标变换。 -
interpolation:插值方法,近邻插值
NEAREST
,双线性插值BILINEAR
-
output_shape:输出大小,默认是输入大小
代码
基本代码:
import numpy as np
import tensorflow as tf
import cv2#创建装图像的容器
input=tf.placeholder(dtype=np.uint8,shape=[640,1024,3]) #高,宽,通道
#创建操作
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,0,0,0])#读取图像
img=cv2.imread('test_img.jpg')#执行操作
with tf.Session() as sess:trans_img=sess.run(trans_op,feed_dict={input:img})cv2.imshow('img',trans_img)
cv2.waitKey()
cv2.destroyAllWindows()
可以得到原图为:
修改a1a_1a1
trans_op=tf.contrib.image.transform(input,[2,0,0,0,1,0,0,0])
修改a2a_2a2
trans_op=tf.contrib.image.transform(input,[1,0.5,0,0,1,0,0,0])
修改a3a_3a3
trans_op=tf.contrib.image.transform(input,[1,0,100,0,1,0,0,0])
修改b1b_1b1
trans_op=tf.contrib.image.transform(input,[1,0,0,0.5,1,0,0,0])
修改b2b_2b2
trans_op=tf.contrib.image.transform(input,[1,0,0,0,2,0,0,0])
修改b3b_3b3
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,100,0,0])
调整c1c_1c1
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,0,0.0005,0])
调整c2c_2c2
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,0,0,0.0005])
总结
前六个参数按顺序,讲道理应该是:左缩放,左拉扯,左移,上拉扯,上缩放,上移
后两个参数不清楚名称是什么,感觉扭曲了一下,而且值要很小
代码就不分享了,上面已经贴出完整的了。