没什么重要的,就是想测试一下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),假设是 ( a 1 , a 2 , a 3 , b 1 , b 2 , b 3 , c 1 , c 2 ) (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’)
[ a 1 a 2 a 3 b 1 b 2 b 3 ] × [ x y 1 ] × 1 k = [ x ′ y ′ ] w . t . l = c 1 x + c 2 y + 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 ′ ] = [ ( a 1 x + a 2 y + a 3 ) / k , ( b 1 x + b 2 y + b 3 ) / 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()
可以得到原图为:
修改 a 1 a_1 a1
trans_op=tf.contrib.image.transform(input,[2,0,0,0,1,0,0,0])
修改 a 2 a_2 a2
trans_op=tf.contrib.image.transform(input,[1,0.5,0,0,1,0,0,0])
修改 a 3 a_3 a3
trans_op=tf.contrib.image.transform(input,[1,0,100,0,1,0,0,0])
修改 b 1 b_1 b1
trans_op=tf.contrib.image.transform(input,[1,0,0,0.5,1,0,0,0])
修改 b 2 b_2 b2
trans_op=tf.contrib.image.transform(input,[1,0,0,0,2,0,0,0])
修改 b 3 b_3 b3
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,100,0,0])
调整 c 1 c_1 c1
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,0,0.0005,0])
调整 c 2 c_2 c2
trans_op=tf.contrib.image.transform(input,[1,0,0,0,1,0,0,0.0005])
前六个参数按顺序,讲道理应该是:左缩放,左拉扯,左移,上拉扯,上缩放,上移
后两个参数不清楚名称是什么,感觉扭曲了一下,而且值要很小
代码就不分享了,上面已经贴出完整的了。