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)) #

    

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

    下面介绍操作通道:将指定通道(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

OpenCV3 for python3 学习笔记2的更多相关文章

  1. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像2

    3.5.Canny边缘检测 OpenCV提供了Canny边缘检测函数来识别边缘.它有5个步骤:使用高斯滤波器对图像进行去噪.计算梯度.在边缘上使用最大抑制(NMS).在检测到的边缘上使用双阀值去除 假 ...

  2. OpenCV3 for python3 学习笔记3-----用OpenCV3处理图像一

    本文的内容都与图像处理有关,这时需要修改图像,比如要使用具有艺术性的滤镜.外插(extrapolate)某些部分.分割.粘贴或其他需要的操作. 1.不同色彩空间的的转换 OpenCV有数百种关于在不同 ...

  3. OpenCV3 for python3 学习笔记1

    1.读/写图像文件 OpenCV的imread()函数和imwrite()函数能支持各种静态图像文件格式.不同系统支持的文件格式不一样,但都支持BMP格式,通常还应该支持PNG.JPEG和TIFF格式 ...

  4. Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html

    Python3学习笔记(urllib模块的使用)   1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None,  ...

  5. Python3学习笔记 - 准备环境

    前言 最近乘着项目不忙想赶一波时髦学习一下Python3.由于正好学习了Docker,并深深迷上了Docker,所以必须趁热打铁的用它来创建我们的Python3的开发测试环境.Python3的中文教程 ...

  6. python3学习笔记(7)_listComprehensions-列表生成式

    #python3 学习笔记17/07/11 # !/usr/bin/env python3 # -*- conding:utf-8 -*- #通过列表生成式可以生成格式各样的list,这种list 一 ...

  7. python3学习笔记(6)_iteration

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #类似 其他语言的for循环,但是比for抽象程度更高 # f ...

  8. python3学习笔记(5)_slice

    #python3 学习笔记17/07/10 # !/usr/bin/env python3 # -*- coding:utf-8 -*- #切片slice 大大简化 对于指定索引的操作 fruits ...

  9. Python3学习笔记01-环境安装和运行环境

    最近在学习Python3,想写一些自己的学习笔记.方便自己以后看,主要学习的资料来自菜鸟教程的Python3教程和廖雪峰官方网站的Python教程. 1.下载 1)打开https://www.pyth ...

随机推荐

  1. VIM 报错

    syntax error: unexpected end of file if 没配对 在最后加 fi 试试 环境变量用不了 export PATH=/usr/bin:/usr/sbin:/bin:/ ...

  2. 性能测试二十九:Dubbo框架测试脚本编写

    测试脚本编写 新建一个folder命名为lib,用于存放依赖包 把以下jar全部拷进lib下,并build path 找开发要 真正要测试的以jar包形式存在的代码的类, 打开看一下 放到lib并bu ...

  3. Java Timer, TimerTask, Timer.Schedule

    schedule的意思(时间表.进度表) timer.schedule(new TimerTask(){ void run()},0, 60*60*1000);timer.schedule(new M ...

  4. hdu 2066 多起点 多终点

    多起点 多终点 无向图 结点的个数要自己求 Sample Input6 2 3 //边数 起点数 终点数1 3 5 //u v w1 4 72 8 123 8 44 9 129 10 21 2 //起 ...

  5. python学习之基本数据类型

    python的基本数据类型有数字.字符串.列表.字典.元祖.布尔值 一.数字 1.1.字符转换为数字 实例: a=" b=int(a) print(b+) 运行结果: 可以用type查看数据 ...

  6. BZOJ1040 [ZJOI2008]骑士 基环树林(环套树) 树形动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题意概括 有n个人,每一个人有一个最恨的人. 并且,每一个人有一个权值. 一个人不可以和他最恨的人同时被选中. 现在请你求出在 ...

  7. HDU - 1712 - ACboy needs your help 【分组背包】

    <题目链接> 题目大意:有n个课程,现在花M天来学习这些课程,学习每个课程花的天数所得到的价值不同,求M天怎么分配学习才能得到的价值最大.(这些课程得到的价值和所花天数的关系由矩阵给出) ...

  8. js类型判断-丰富加好用

    一, 自己有时候写一些东西,要做类型判断,还有测试的时候,对于原生的和jQuery中的类型判断,实在不敢恭维,所以就写了一个好用的类型判断,一般情况都够用的. function test(type) ...

  9. 我们为什么要学习 Spring Boot

    现在貌似大家都知道 Spring Boot 很火了,做 Java 的不知道 Spring Boot 的都已经 Out 了,但是又有多少人是跟风学习的呢?今天我们就来说一下为什么要学习 Spring B ...

  10. Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1)

    Xamarin Android组件篇教程RecylerView动画组件RecylerViewAnimators(1) RecyclerView是比ListView和GridView更为强大的布局视图, ...