首先放出原图:
1、处理标注框
import tensorflow as tf
import cv2
# 这里定义一个tensorflow读取的图片格式转换为opencv读取的图片格式的函数
# 请注意:
# 在tensorflow中,一个像素点的颜色顺序是R,G,B。
# 在opencv中,一个像素点的颜色顺序是B,G,R。
# 因此,我们循环遍历每一个像素点,将第0位的颜色和第2位的颜色数值换一下即可。
# 第一个参数name:将要显示的窗口名称。
# 第二个参数image:储存图片信息的一个tensor。
def cv2Show(name="", image=None):
# 获取矩阵信息
np = image.eval()
# 获取行数列数
row, col = len(np),len(np[1])
# 两重循环遍历
for i in range(row):
for j in range(col):
# 交换数值
tmp = np[i][j][0]
np[i][j][0] = np[i][j][2]
np[i][j][2] = tmp
# 显示图片
cv2.imshow(name,np)
pass
# tensorflow会话
with tf.Session() as sess:
# 以二进制的方式读取图片。
image_raw_data = tf.gfile.FastGFile("bus.jpg", "rb").read()
# 按照jpeg的格式解码图片。
image_data = tf.image.decode_jpeg(image_raw_data)
# 显示原图片。
cv2Show("Read by Tensorflow+Dispalyed by Opencv",image_data)
# tf.image.draw_bounding_boxes函数要求图像矩阵中的数字为实数,
# 所以需要先将图像矩阵转化为实数类型(float32,float16)。
image_data = tf.image.convert_image_dtype(image_data, tf.float32)
# tf.image.draw_bounding_boxes函数的输入是一个batch的数据,
# 也就是多张图像组成的四维矩阵,多以需要将解码之后的图像矩阵加一维。
batched = tf.expand_dims(image_data, 0)
# 给出每一张图像的标注框,一个标注框有四个数字,分别是[y_min,x_min,y_max,x_max].
# 注意,这是一个三维数组!
# 给出的数字都是表示图像的相对位置,上述的数字的范围均是[0,1]。
# 例如在180x267图像中,[0.35,0.47,0.5,0.56]代表了(63,125)到(90,150)的图像。
boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7],[0.35,0.47,0.5,0.56]]])
# 使用函数加标注框。
result = tf.image.draw_bounding_boxes(batched, boxes)
# 显示图像。这里只显示第一张图片,因为我们只输入了一张图像。
cv2Show("result", result[0])
cv2.waitKey()
程序运行结果如下:
2、随机截取图像
import tensorflow as tf
import cv2
# 这里定义一个tensorflow读取的图片格式转换为opencv读取的图片格式的函数
# 请注意:
# 在tensorflow中,一个像素点的颜色顺序是R,G,B。
# 在opencv中,一个像素点的颜色顺序是B,G,R。
# 因此,我们循环遍历每一个像素点,将第0位的颜色和第2位的颜色数值换一下即可。
# 第一个参数name:将要显示的窗口名称。
# 第二个参数image:储存图片信息的一个tensor。
def cv2Show(name="", image=None):
# 获取矩阵信息
np = image.eval()
# 获取行数列数
row, col = len(np),len(np[1])
# 两重循环遍历
for i in range(row):
for j in range(col):
# 交换数值
tmp = np[i][j][0]
np[i][j][0] = np[i][j][2]
np[i][j][2] = tmp
# 显示图片
cv2.imshow(name,np)
pass
# tensorflow会话
with tf.Session() as sess:
# 以二进制的方式读取图片。
image_raw_data = tf.gfile.FastGFile("bus.jpg", "rb").read()
# 按照jpeg的格式解码图片。
image_data = tf.image.decode_jpeg(image_raw_data)
# 显示原图片。
cv2Show("Read by Tensorflow+Dispalyed by Opencv",image_data)
image_data = tf.image.convert_image_dtype(image_data, tf.float32)
# tf.image.draw_bounding_boxes函数的输入是一个batch的数据,
# 也就是多张图像组成的四维矩阵,多以需要将解码之后的图像矩阵加一维。
batched = tf.expand_dims(image_data, 0)
# 给出每一张图像的标注框,一个标注框有四个数字,分别是[y_min,x_min,y_max,x_max].
# 注意,这是一个三维数组!
# 给出的数字都是表示图像的相对位置,上述的数字的范围均是[0,1]。
# 例如在180x267图像中,[0.35,0.47,0.5,0.56]代表了(63,125)到(90,150)的图像。
boxes = tf.constant([[[0.05, 0.05, 0.9, 0.7],[0.35,0.47,0.5,0.56]]])
# 可以通过提供标注框的方式来告诉随机截取图像的算法哪些部分是“有信息量”的。
begin, size, bbox_for_draw = tf.image.sample_distorted_bounding_box(tf.shape(image_data), bounding_boxes=boxes)
# 通过标注框可视化随机截取的图像。
image_with_box = tf.image.draw_bounding_boxes(batched,bbox_for_draw)
# 随机截取出来的图像,因为算法带有随机成分,所以每次得到的结果会有所不同。
distorted_image = tf.slice(image_data,begin=begin,size=size)
# 显示截取的图像。
cv2Show("result", distorted_image)
cv2.waitKey()
程序运行结果如下: