交流群:462197261站长百科站长论坛热门标签收藏本站北冥有鱼 互联网前沿资源第一站 助力全行业互联网+
点击这里给我发消息
  • 当前位置:
  • Python基于Tensor FLow的图像处理操作详解

    北冥有鱼 教程大全 2020-01-15 ,,,

    本文实例讲述了Python基于Tensor FLow的图像处理操作。分享给大家供大家参考,具体如下:

    在对图像进行深度学习时,有时可能图片的数量不足,或者希望网络进行更多的学习,这时可以对现有的图片数据进行处理使其变成一张新的图片,在此基础上进行学习,从而提高网络识别的准确率。

    1、图像解码显示

    利用matplot库可以方便简洁地在jupyter内对图片进行绘制与输出,首先通过tf.gfile打开图片文件,并利用函数tf.image.decode_jpeg将jpeg图片解码为三位矩阵,之后便可以通过matplot绘制与显示图片信息了

    import matplotlib.pyplot as plt
    import tensorflow as tf
    import numpy as np
     
    #读取图像文件
    image_raw=tf.gfile.GFile('D:\Temp\MachineLearning\data\cat.jpeg','rb').read()
     
    with tf.Session() as sess:
      #对jpeg图像解码得到图像的三位矩阵数据
      image_data=tf.image.decode_jpeg(image_raw)
      print(image_data.eval())
      plt.imshow(image_data.eval())
      plt.show()

    可以看到打印的图片三维矩阵信息和显示的图片:

                                

    2、图像缩放

    tensorflow还自带了许多图像处理函数,比如resize_image对图片进行大小的缩放。其中第一个参数代表图片数据源,第二个数组代表缩放后的大小,第三个method代表采用的缩放方法,默认0是双线性插值法,1代表最近邻插值法,2代表双立方插值法,3代表像素区域插值法。

      #对图片大小进行缩放
      image_resize=tf.image.resize_images(image_data,[500,500],method=0)
      #tensorflow处理后的图片是float32格式的,需要转化为uint8才能正确输出
      image_resize=np.asarray(image_resize.eval(),dtype='uint8')
      plt.imshow(image_resize)
      plt.show()

    3、图像裁切

    函数tf.image.resize_image_with_crop_or_pad可以在保证图片原始比例的条件下对图片进行裁切或填充。

    函数tf.image.random_crop是随机对图片进行选取裁剪,而不是以中心。

      #图片裁剪
      image_crop=tf.image.resize_image_with_crop_or_pad(image_data,500,500)
      plt.imshow(image_crop.eval())
      plt.show()
      #随机裁剪
      img_random=tf.image.random_crop(image_data,[300,300,3])
      plt.imshow(img_random.eval())
      plt.show()

                                  

    resize_image_with_crop_or_pad第一个参数是图片资源,后两个参数是裁切后的图片大小,当原始图片大于目标值时将裁去两边多余部分,当图片小于目标值时将用黑色填充,例如上图左右被裁剪,上下用黑色填充。

    random_crop第一个参数是图片资源,第二个参数是一个三位张量,代表目标图像大小。

    4、图像翻转

    通过函数实现图片的上下、左右翻转,在模型训练时,可以将原本的样本图片进行反转,作为新的特征值进行输入供模型训练。

      #上下翻转
      img_down=tf.image.flip_up_down(image_data)
      plt.imshow(img_down.eval())
      plt.show()
      
      #左右翻转
      img_left=tf.image.flip_left_right(image_data)
      plt.imshow(img_left.eval())
      plt.show()

    5、调整对比度、明度、饱和度

    通过tf.image.adjust_contrast可以对图像对比度进行调整,当参数大于1代表加深,小于1代表减淡

    tf.image.random_contrast可以在指定范围内随即调整对比度

    类似的还有adjust_brightness、adjust_saturation、adjust_hue对明度、饱和度、色相进行调整

      #加深对比度
      img_deep=tf.image.adjust_contrast(image_data,2)
      plt.imshow(img_deep.eval())
      plt.show()
      #降低对比度
      img_fade=tf.image.adjust_contrast(image_data,0.5)
      plt.imshow(img_fade.eval())
      plt.show()
      #随机对比度
      img_contrast=tf.image.random_contrast(image_data,0.5,2)
      plt.imshow(img_contrast.eval())
      plt.show()

    6、对VGG网络的输入图片进行处理

    Vgg网络训练中传入的图片参数x_img是以batch_size为单位的四维数据,例如传入20张32×32的3通道图片,其数据为[20,32,32,3]。但是tensorflow的图片处理函数只可以处理三维的单张图片。因此需要首先通过split()函数将20张图片拆分成单张[1,32,32,3],再通过reshape()函数转化为三维数据[32,32,3],之后再调用图片处理函数对图片进行处理,将处理后的图片恢复成四维,然后放在数组res_arr中,拼接成原来的一组20×32×32×3的数据。

    # 将一批batch_size张图片在第一维上切分为单张图片
    img_arr=tf.split(x_img,batch_size,axis=0)
    res_arr=[]
    # 遍历每个图片对其进行处理
    for img in img_arr:
      # 将单张四维的图片[1,32,32,3]处理成三维[32,32,3]
      img=tf.reshape(img,[32,32,3])
      # 对单张图片进行图像增强
      img_flip=tf.image.random_flip_left_right(img)   # 翻转图片
      img_bright=tf.image.random_brightness(img_flip,max_delta=63)  # 随机调整亮度
      img_contrast=tf.image.random_contrast(img_bright,lower=0.2, upper=1.8) # 调整对比度
      # 将增强后的图片再变回原来的四维格式
      img=tf.reshape(img_contrast,[1,32,32,3])
      # 将每个处理后的图片放在一个数组
      res_arr.append(img)
    # 将处理后的单个图片重新拼接在一起  
    img_aug=tf.concat(res_arr,axis=0)

    更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

    希望本文所述对大家Python程序设计有所帮助。


    广而告之:
    热门推荐:
    laravel5.4生成验证码的代码

    本篇博客介绍使用gregwar/captcha实现验证码的具体操作步骤,以及可能遇到的问题和解决办法。 操作步骤: 1.在laravel5.4项目根目录下找到 composer.json 这个文件, 添加 "gregwar/captcha": "dev-master" 和 "Gregwar\\Captcha\\": "vendor/Captcha/" 到composer.json文件中···

    html+javascript实现可拖动可提交的弹出层对话框效果

    复制代码 代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>JAVASCRIPT弹出层</title···

    WordPress数据库的基本构造及各表结构

    WordPress使用MySQL数据库。作为一个开发者,我们有必要掌握WordPress数据库的基本构造,并在自己的插件或主题中使用他们。 截至WordPress3.0,WordPress一共有以下11个表。这里加上了默认的表前缀 wp_ 。 wp_commentmeta:存储评论的元数据 wp_comments:存储评论 wp_···

    Discuz批量替换帖子内容的方法(使用SQL更新数据库)

    今天一个朋友的Discuz X2论坛需要批量替换帖子的内容,帖子数量上万,一开始是通过设置词语过滤,发现无效果,只能通过数据库批量替换了,具体方法请接着往下看。 Discuz X2论坛后台提供数据库SQL语句操作的功能,但是默认情况下出于安全考虑,该功能是被关闭的,所以得先修改···

    Js四则运算函数代码

    复制代码 代码如下: //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。 //调用:accDiv(arg1,arg2) //返回值:arg1除以arg2的精确结果 function accDiv(arg1,arg2){ var t···

    hotwords 热门关键词

    标签名称:hotwords 功能说明:热门关键词 适用范围:全局使用 基本语法: {dede:hotwords /} 参数说明: num:关键词数目 subday:天数 maxlength:关键词最大长度 底层模板字段: 该标签不支持字段调用   用法示例: 模板标签: {dede:h···

    jquery分页插件jquery.pagination.js使用方法解析

    这一款js分页使用起来很爽,自己经常用,做项目时总是要翻以前的项目看,不方便,这里就把他写出来方便自己以后粘帖,也希望能分享给大家。 参数说明 插件代码 js代码: /** * This jQuery plugin displays pagination links inside the selected elements. * * @author ···

    Vue下的国际化处理方法

    1:首先安装 Vue-i8n npm install vue-i18n --save 注:-save-dev是指将包信息添加到devDependencies,表示你开发时依赖的包裹。 -save是指将包信息添加到dependencies,表示你发布时依赖的包裹。 2:在main.js中配置信息 import VueI18n from 'vue-i18n' import {getCookie} ···

    dedecms万能SQL标签使用方法大全

    注意:dede_archives这是系统默认的数据库表,如果你修改过表前缀dede_,请自行更改表名。在以下示例的标签中,有一部分只写出了SQL语句,具体的完整标签写法请参考:织梦SQL标签调用方法 共有文章:** 篇 {dede:sql sql="select count(ID) as c from dede_arc···

    php 在字符串指定位置插入新字符的简单实现

    php 在字符串指定位置插入新字符的简单实现 因为项目用到DataTable表格加载后台数据,要连表查询虚拟机选中的策略状态,所以想到先把策略表内容取出来,组成一个'<select><option value="1"></option>[n个option]</select>'字符串,在遍历虚拟机列表时···