开发者社区> night李> 正文

python-opencv学习笔记(二)

简介:
+关注继续查看

图像与原始字节之间的转换:
从概念上,一个字节能表示0到255的整数,通常一个像素每个通道由一个字节表示。
一个OpenCV图像是.array类型的二维或者三维数组。8位的灰度图像是一个含有字节值得二维数组。一个24位的BGR图像是一个三维数组,也包含了字节值,可以使用表达式访问这些值,如image[0,0]或者image[0,0,0]。第一个值表示y坐标,第二个值表示x坐标,第三个值为颜色通道。还可以使用image.item((0,0))或image.setitem((0,0),128)来访问像素和对像素进行操作。
若一幅图像的每个通道为8位,则可以将其显式转换为标准的移位Python bytearray格式:

byteArray=bytearray(image)

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

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

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

import cv2
import numpy as np
import os

randomByteArray=bytearray(os.urandom(120000))
flatNumpyArray=np.array(randomByteArray)

grayImage=flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)

bgrImage=flatNumpyArray.reshape(100,400,3)
cv2.imwrite('RandomColor.png',bgrImage)

结果产生灰度图:
RandomGray
和彩色图像:
RandomColor
使用numpy.random.randint(0,256,120000).reshape(300,400)也可以并更加高效地生成Numpy数组。
使用numpy.array访问图像数据:
y.array结构针对数组操作有很好地优化,允许(bulk)操作。.array操作再OpenCV图像处理中会很方便使用,如对BGR图像的某一像素点进行操作,转换为白色像素点:

import cv2
import numpy as np
img=cv2.imread('time.jpg')
img[0,0]=[255,255,255]
cv2.imshow('1',img)
cv2.waitKey()

用numpy.array函数来转换数组比普通的Python数组转换要快得多。
方法:

import cv2
import numpy as np
img=cv2.imread('time.jpg')
print(img.item(150,120,0))
img.itemset((150,120,0),255)
print(img.item((150,120,0)))

使用numpy.array的原因:numpy.array处理这类问题进过很好地优化;通过Numpy的方法代码可读性更强。
下面是对通道的操作,指定某一通道的所有值置为0:

import cv2
import numpy as np
img=cv2.imread('time.jpg')
img[:,:,1]=0
cv2.imshow('1',img)
cv2.waitKey()

注意:通过循环操作来处理Python数组的效率非常低,尽量避免;使用数组索引可以高效地操作像素,像素操作是一个高代价的低效操作,特别是在处理视频图像时,可用索引来解决这个问题。
通过NumPy数组的索引访问原始图像:设置感兴趣区域(Region Of Interest ,ROI):

import cv2
import numpy as np
img=cv2.imread('time.jpg')
my_roi=img[0:100,0:100]
img[300:400,300:400]=my_roi
cv2.imshow('1',img)
cv2.waitKey()

要确保这两个区域大小相同。
numpy.array获取图像的属性:

import cv2
import numpy as np
img=cv2.imread('time.jpg')
print(img.shape)
print(img.size)
print(img.dtype)

结果:

(1080, 1920, 3)
6220800
uint8

其中三个属性为:
Shape:NumPy返回包含宽度,高度和通道数的数组,在调试图像类型调试时有用,如果图像是单色或灰度的,将不包含通道值。
Size:该属性是指图像像素的大小
Dtype:该属性会得到图像的数据类型(通常为一个无符号整数型的变量和该类型占的位数,比如uint8类型)
timg

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《Master Opencv...读书笔记》非刚性人脸跟踪 II
    上一篇博文中,我们了解了系统的功能和模块,明确了需要采集哪些类型的样本点及利用类的序列化的保存方式。这次将介绍几何约束模块,通过统计形态分析法(Statistical Shape Analysis, SSA),利用样本点建立对形状的描述,然后对描述的形状建立点分布模型,并从中学习统计参数,完成对形状的建模。
1171 0
《Mastering opencv....读书笔记》基于标记的虚拟现实
   虚拟现实技术一直比较火,应用领域也非常广。本次为大家讲解虚拟现实的一个入门级例子,如果对以下内容感兴趣: 初音: http://jandan.net/2012/07/09/augmented-reality-girlfriend.html 动画纹身: http://jandan.net/2011/07/10/animated-tattoo.html       本次讲解将是上述实现的技术基础。
1277 0
Linux学习 -->解决Ubuntu系统上 No command 'crond' found
前两天,准备在Ubuntu服务器上,定时执行Gitlab备份的命令,如下所示 编辑 vi /etc/crontab 文件,添加如下定时脚本 # edited by ouyang 2017-8-11 添加定时任务,每天凌晨两点,执行gitlab备份 0 2 * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1 然而发现,凌晨2点并没有执行备份操作。
1581 0
OpenEDX MOOC平台搭建笔记
openedx平台搭建过程整理一下,以作记录 想在校内搭建一个MOOC慕课平台,经比较,选择开源的openedx系统,开始安装之旅,本想会很顺利,想不到一个星期才搞掂,主要原因还是网速和哪堵墙。
5046 0
+关注
night李
对机器视觉 图像处理有一定的兴趣 要做一条有梦想的咸鱼
225
文章
4
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载