• 贵州省社科规划办与贵州日报社合作推出“文化贵州”专栏 2019-03-20
  • 就算不为了世界杯,俄罗斯也有那么多时髦好去处值得你飞去 2019-03-20
  • 山西体彩十一选五一前三直最大遗漏:opencv与numpy的图像基本操作

    山西体彩11选5直选遗漏 www.caxru.com  更新时间:2019年03月08日 10:34:38   作者:邹成卓   我要评论

    这篇文章主要介绍了opencv与numpy的图像基本操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    1. 像素基本操作

    1.1 读取、修改像素

    可以通过[行,列]坐标来访问像素点数据,对于多通道数据,返回一个数组,包含所有通道的值,对于单通道数据(如gray),返回指定坐标的值,也可以通过 [行,列,通道index] 来访问某坐标某通道的值。

    >>> import cv2
    >>> import numpy as np
    >>> img = cv2.imread('messi5.jpg')
    >>> px = img[100,100]
    >>> print( px )
    [157 166 200]
    # accessing only blue pixel
    >>> blue = img[100,100,0]
    >>> print( blue )
    157

    可以直接通过坐标修改像素值

    >>> img[100,100] = [255,255,255]
    >>> print( img[100,100] )
    [255 255 255]

    然而直接像上面这样去读取、修改每个像素的值,效率是比较低的,可以使用下面的方法,效率是更高的

    # accessing RED value
    >>> img.item(10,10,2)
    59
    # modifying RED value
    >>> img.itemset((10,10,2),100)
    >>> img.item(10,10,2)
    100

    1.2 读取图像属性

    读取图像尺寸,返回一个元组 (行,列,通道数)

    >>> print( img.shape )
    (342, 548, 3)

    读取像素大小, 行 通道数

    >>> print( img.size )
    562248

    像素数据类型

    >>> print( img.dtype )
    uint8

    1.3 图像ROI操作

    可以直接编辑像素区域,例如把图像左下角50*50的像素复制到左上角

    import cv2
    import numpy as np
    img = cv2.imread("test.jpg")
    print(img.shape)
    roiTest = img[475:525, 0:50]
    img[0:50, 0:50] = roiTest
    cv2.imshow("image",img)
    cv2.waitKey(0)

    1.4 分割、合并通道

    有些情况下需要对图像的某一通道数据进行操作,此时会用到分割、合并通道数据

    >>> b,g,r = cv2.split(img)
    >>> img = cv2.merge((b,g,r))

    或者

    b = img[:,:,0]

    假设想编辑红色通道的数据,全部设置为0,不需要这样分割后编辑, img[:,:,2] = 0 这样即可。cv2.split操作是一个很耗时的操作,可以用numpy索引替代的操作,尽量用numpy索引来做。

    1.4 生成图像边框

    使用 cv2.copyMakeBorder 函数可添加图像边框,支持多种边框算法

    void cv::copyMakeBorder ( 
    InputArray src, //原图
    //目标图(cpp版本中,若传入此数据且选BORDER_TRANSPARENT,则此数据被top/bottom/left/right切出来的roi部分不会被做任何修改,此图像大小=dst.rows+top+bottom,dst.cols+left+right)
    OutputArray dst, 
    int top, //top/left/bottom/right 四个方向上的边框像素
    int bottom,
    int left,
    int right,
    int borderType, //边框类型见下图
    const Scalar & value = Scalar() //边框类型为BORDER_CONSTANT时的边框像素
    ) 

    BLUE = [255, 0, 0]
     img1 = cv2.imread("test.jpg")
     replicate = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REPLICATE)
     reflect = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT)
     reflect101 = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_REFLECT_101)
     wrap = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_WRAP)
     constant = cv2.copyMakeBorder(img1, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value=BLUE)
     print(img1.shape, reflect.shape)
     plt.subplot(231), plt.imshow(img1, 'gray'), plt.title('ORIGINAL')
     plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('REPLICATE')
     plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('REFLECT')
     plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('REFLECT_101')
     plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('WRAP')
     plt.subplot(236), plt.imshow(constant, 'gray'), plt.title('CONSTANT')
     plt.show()

     

    上面的例子可以比较直观的看到各种border的效果,同时也能发现,python版的api与cpp版本的相比,默认初始化了一块原始图尺寸+各方向边框尺寸的图像内存,作为内置的dst参数。

    输出尺寸:(525, 700, 3) (725, 900, 3)

    2. 图像的基本算术操作

    2.1 图像相加

    图像相加,两个图像应该有相同的shape,或者图像和一个标量相加,或者图像和一个与其通道数相同的一维数组相加。

    opencv的相加与numpy相加时,在超出数据类型范围时的处理不同

    >>> x = np.uint8([250])
    >>> y = np.uint8([10])
    >>> print( cv2.add(x,y) ) # 250+10 = 260 => 255
    [[255]]
    >>> print( x+y )  # 250+10 = 260 % 256 = 4
    [4]

    cpp版本的api还支持mask等参数

    void cv::add ( 
    InputArray src1,
    InputArray src2,
    OutputArray dst,
    InputArray mask = noArray(),
    int dtype = -1 
    ) 

    2.2 图像混合

    opencv通过 cv::addWeighted 函数提供了将两个图像混合在一起的方法

    dst=α⋅img1+β⋅img2+γ

    img1 = cv2.imread('ml.png')
    img2 = cv2.imread('opencv-logo.png')
    dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
    cv2.imshow('dst',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    通过cv2.seamlessClone函数还能做更精细的图像局部融合。

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    相关文章

    • python中urllib.unquote乱码的原因与解决方法

      python中urllib.unquote乱码的原因与解决方法

      这篇文章主要给大家介绍了python中urllib.unquote乱码的原因与解决方法,文中介绍的非常详细,对大家具有一定的参考价值,需要的朋友可以参考学习,下面跟着小编一起来学习学习吧。
      2017-04-04
    • Python类的用法实例浅析

      Python类的用法实例浅析

      这篇文章主要介绍了Python类的用法,以实例形式简单分析了Python中类的定义、构造函数及使用技巧,需要的朋友可以参考下
      2015-05-05
    • Cython 三分钟入门教程

      Cython 三分钟入门教程

      根据一些我收到的反馈,大家似乎有点混淆——Cython是用来生成 C 扩展到而不是独立的程序的。所有的加速都是针对一个已经存在的 Python 应用的一个函数进行的。
      2009-09-09
    • python使用arp欺骗伪造网关的方法

      python使用arp欺骗伪造网关的方法

      这篇文章主要介绍了python使用arp欺骗伪造网关的方法,涉及Python伪造网关的相关技巧,需要的朋友可以参考下
      2015-04-04
    • Python读取properties配置文件操作示例

      Python读取properties配置文件操作示例

      这篇文章主要介绍了Python读取properties配置文件操作,结合实例形式分析了Python读取properties配置文件操作中增加对键值对支持与使用的相关技巧,需要的朋友可以参考下
      2018-03-03
    • Django中模型Model添加JSON类型字段的方法

      Django中模型Model添加JSON类型字段的方法

      这篇文章主要介绍了Django中模型Model添加JSON类型字段的方法,实例分析了Python的Django框架模型使用技巧,需要的朋友可以参考下
      2015-06-06
    • python 生成目录树及显示文件大小的代码

      python 生成目录树及显示文件大小的代码

      没啥技术含量,大家都说没用,只不过算法还有点意思。自己憋出来的,不知道是不是跟别人的一样。做递归得到子文件夹以及文件并不难,但是能够打印出树形,层次关系展示出来,有些难度。
      2009-07-07
    • python实战教程之自动扫雷

      python实战教程之自动扫雷

      用python实现扫雷,非常有意思,这篇文章主要给大家介绍了关于python实现自动扫雷的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
      2018-07-07
    • Python简单爬虫导出CSV文件的实例讲解

      Python简单爬虫导出CSV文件的实例讲解

      今天小编就为大家分享一篇Python简单爬虫导出CSV文件的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
      2018-07-07
    • Python自动化构建工具scons使用入门笔记

      Python自动化构建工具scons使用入门笔记

      这篇文章主要介绍了Python自动化构建工具scons使用入门笔记,本文讲解了安装scons、scons常用命令、scons使用示例等内容,需要的朋友可以参考下
      2015-03-03

    最新评论

  • 贵州省社科规划办与贵州日报社合作推出“文化贵州”专栏 2019-03-20
  • 就算不为了世界杯,俄罗斯也有那么多时髦好去处值得你飞去 2019-03-20