zoukankan      html  css  js  c++  java
  • OpenCV3 for python3 学习笔记2

      1、安装

        如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python只要执行如下命令行即可:

        pip install opencv-python

         如果你还想使用OpenCV Python的扩展模块,执行如下命令行即可:

        pip install opencv-contrib-python

         如果你已经安装了OpenCV以前的3.x版本只需要执行对应的升级安装命令行如下(假设你已经安装opencv-python 3.x)

        pip install –upgrade opencv-python

         如果在安装的时候遇到python命令不识别或者pip命令行不识别,请执行如下的命令行实现安装:

        python –m pip install opencv-python
        或者
        python –m pip install opencv-contrib-python

       2、图像与原始字节之间的转换

        从概念上讲,一个字节能表示0到255的整数。目前,对于多有的实时图像应用而言,虽然有其他的表示形式,但一个像素通常由每个通道的一个字节表示。

        一个OpenCV图像是.array类型的二维或三维数组。8位的灰度图像是一个含有字节值的二维数组。一个24位的BGR图像是一个三维数组,它也包含了字节值。

      可使用表达式访问这些值,如image[0,0]或image[0,0,0]。第一个值代表像素的y坐标啊或行,0表示顶部;第二个值是像素的x坐标或列,0表示最左边;

        第三个值(如果可用的话)表示颜色通道。如,对于一个左上角有白色像素的8位灰度图像而言,image[0,0]的值为255. 对于一个左上角有蓝色像素的24位BGR图像而言,image[0,0]是[255,0,0]。

        可以用另外一个表示,如image[0,0]或image[0,0]=128,还可表示成image.item((0,0))或image.setitem((0,0),128)。对于单像素操作,第二种表示方式更有效。

        若一幅图像的每个通道为8位,则可将其显示转换为标准的一维Python bytearray格式:byteArray = bytearray(image)

        反之,bytearray含有恰当顺序的字节,可以通过显示转换和重构,得到numpy.array形式的图像:

        garyImage = numpy.array(garyByteArray ).reshape(height, width)

        bgrImage = numpy.array(bgrByteArray ).reshape(height, width, 3)

        下面介绍将含有随机字节的bytearray转换为灰度图像和BGR图像:

    import cv2
    import numpy as np
    import os
    
    # 创建一个120000个随机字节的数组
    randomByteArray = bytearray(os.urandom(120000))  #os.urandom(n) 返回n个随机byte值的string,作为加密使用
    flatNumpyArray = np.array(randomByteArray)
    
    # 将数组转换为400 x 300的灰度图像
    garyImage = flatNumpyArray.reshape(300, 400)
    cv2.imwrite('randomGary.png', garyImage)
    
    # 将数组转换为400 x 300的彩色图像
    bgrImage = flatNumpyArray.reshape(100, 400, 3)
    cv2.imwrite('randomColor.png', bgrImage)

        运行该程序,将会在程序所在目录中生成两张灰度图像(如下所示)。尺寸分别为400 x 100,400 x 400

       

        使用Python标准的os.urandom()函数可随机生成原始字节,随后会把该字节转换为NumPy数组。需要注意的是,诸如numpy.random.randint(0, 256, 120000).reshape(400, 300)

      语句也能直接(并且更高效地)随机生成NumPy数组。使用os.urandom()函数的原因是该语句有助于展示原始字节的转换。

      3、 使用numpy.array访问图像数据

        加载OpenCV图像最简单的方式是使用imread()函数,该函数会返回一幅图像,这幅图像是一个数组(根据imread()函数输入参数的不同,该图像可能是二维数组,也可能是三维数组)。

        y.array结构针对数组操作有很好的优化,它允许某些块(bulk)操作,这些操作在通常的Python中不可用这些特定的.array操作在OpenCV的图像处理中会很方便。利用numpy.array

      函数来转换数组比用普通的Python数组转换要快得多。

        waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值为-1(表示没有键被按下)

    img = cv2.imread('flower.png')
    img[0,0] = [255, 255, 255]
    cv2.imshow('flower', img)
    cv2.waitKey()

        

        

        在图像左上方会出现一个白点。

        假设想要改变一个特定像素的蓝色值,numpy.array提供了item()方法。该函数有3个参数:x(或左)位置,y(或顶部)位置以及(x,y)位置的数组索引(注意,

      在BGR图像中,某一位置的数据是按B,G,R的顺序保存的三元数组),该函数能返回索引函数的值。另一个方法是通过itemset()函数可设置指定像素在指定通道的值(

      itemset()有两个参数:一个三元组(x,y和索引)和要设定的值)。如下例子将坐标(150,120)的当前蓝色值127变为255

      

    img = cv2.imread('flower.png')
    print(img.item(150, 120, 0))  # 206 打印当前坐标点的蓝色值
    img.itemset((150, 120, 0), 255)
    print(img.item(150, 120, 0)) #255

        

        建议使用内置的滤波器和方法来处理整个图像,上述方法只适合于处理特定的小区域。

        下面介绍操作通道:将指定通道(B,G,R)的所有值置为0.(注:通过循环来处理Python数组的效率非常低,应该尽量避免这样的操作。使用数组索引可以高效地操作像素。

        像素操作是一个高代价的低效操作,特别是在视频数据处理时,会发现要等很久才能得到结果。可用索引(indexing)来解决该问题)

        以下代码可将图像所有的G(绿色)值设为0

        

        通过NumPy数组的索引访问原始像素,还可设定感兴趣区域(Region Of Interest, ROI)。一旦设定了该区域,就可以执行许多操作,例如,将该区域与变量绑定,

      然后设定第二个区域,并将第一个区域的值分配给第二个区域(将图像的一部分拷贝到该图像的另一个位置):

        

        

        此外,还可使用numpy.array来获得图像其他属性。

        shape:NumPy返回包含宽度、高度和通道数(如果图像是彩色的)数组,这在调试图像类型时很有用;如果图像是单色或灰度的,将不包含通道值;

        size:该属性是指图像像素的大小;

        datatype:该属性会得到图像的数据类型(通常为一个无符号整数类型的变量和该类型占的位数,比如unit8类型)

    img = cv2.imread('flower.png')
    print(img.shape)
    print(img.size)
    print(img.dtype)

        运行结果:

        (332, 332, 3)

        330672
        uint8

     参考:https://www.cnblogs.com/xiaotongtt/p/6601951.html

  • 相关阅读:
    现代C++学习笔记之二入门篇2,数据转换
    现代C++学习笔记之二入门篇1
    现代C++学习笔记之一资料篇(C++ 11)
    OSG3.2+Qt5.2.1+VS2012+OSGEarth 2.5编译问题记录
    无法解析的外部符号 _WinMain@16(原)
    qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用(转)
    一些webGL地球的网址
    Windows7下使用sphinx生成开源文档(原)
    VC解决方案,项目,开发一段时间启动调试很慢,半天才开始链接
    SQL笔记
  • 原文地址:https://www.cnblogs.com/shaosks/p/10384700.html
Copyright © 2011-2022 走看看