开发者社区> 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

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

相关文章
Windows中Python与OpenCV C++之间Mat传递
Windows中Python与OpenCV C++之间Mat传递
175 0
OpenCV将两幅图像拼在一起(Python)
OpenCV将两幅图像拼在一起(Python)
84 0
Python计算细胞核与细胞质的面积比opencv或pil实验
Python计算细胞核与细胞质的面积比opencv或pil实验
92 0
python机器学习入门之opencv的使用(超详细,必看)
python机器学习入门之opencv的使用(超详细,必看)
131 0
python机器学习入门之opencv的安装与环境配置(超详细,避坑必看,包括没代码提示的解决)
python机器学习入门之opencv的安装与环境配置(超详细,避坑必看,包括没代码提示的解决)
168 0
使用Python的OpenCV初学者的5大不可避免的方法
## 介绍: 作为初学者,当您开始使用OpenCV时,有必要了解一些几乎每次都会在opencv项目中使用的方法。下面列出的是OpenCV中最常用的五种方法(请记住OpenCV作为cv2导入)
84 0
opencv 傅里叶变换(python)
opencv 傅里叶变换(python)
164 0
opencv 视频处理(python)
opencv 视频处理(python)
312 0
opencv 形态学操作(python)
opencv 形态学操作(python)
115 0
opencv 图像平滑处理(python)
opencv 图像平滑处理(python)
136 0
opencv 阈值处理(python)
opencv 阈值处理(python)
194 0
opencv 图像分割与提取(python)
opencv 图像分割与提取(python)
374 0
opencv K均值聚类(python)
opencv K均值聚类(python)
106 0
+关注
night李
对机器视觉 图像处理有一定的兴趣 要做一条有梦想的咸鱼
文章
问答
视频
相关电子书
更多
双剑合璧-Python和大数据计算平台的结合
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多