OpenCV3 Python应用-1

前段时间学校布置课程设计,选了个用教室图片检测出勤人数的题目.学了几天相应的基本操作


基本I/O脚本

1.读写图像文件

 1 import  cv2
 2 import numpy as np
 3 
 4 img = np.zeros((3,3),dtype=np.uint8)
 5 print(img)         #每个像素由八位整数表示,即每个像素值的范围2~255
 6 img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)  #使用cv2.cvtColor函数将图像转换成BGR格式
 7 print(img)        #每个像素由一个三元数组表示,每个整型向量表示一个B,R,G通道
 8 
 9 img=np.zeros((3,3),dtype=np.uint8)
10 print(img.shape)  #通过shape属性查看图像的结构,返回行和列,若是有一个以上的通道,还会返回通道数
11 #上面返回的是(3,3),若是BGR格式返回(3,3,3)

2.将jpg格式转换成png格式另存

1 import cv2
2 image=cv2.imread('test.jpg')
3 cv2.imwrite('test.png',image)

注意:通常情况下OPencv函数都在cv2模块内,可能有其他基于cv2.cv模块,这些都是传统模块
python模块被称为cv2并不是针对OpenCV 2.x.x版本,而是因为该模块引入了更好的API接口

默认情况下,即使图像为灰度格式,imread()函数也会返回BGR格式图像
BGR与RGB所表示的色彩空间相同,但字节顺序相反

3.将png文件作为灰度图像,然后又将其保存为灰度的png图像
1 import cv2gray_image=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
2 cv2.imwrite('test_gray.png',gray_image)
若是想使用其他文件夹中的图像可使用绝对路径
windows: C:\user\appdate\test.jpg
Unix: /home/joe/picture/test.jpg

imreade ()函数会删除alpha通道的信息(透明度).imwrite()函数要求图像为BGR格式或灰度格式
并且每个通道要有一定的位,输出格式要支持这些通道

4.图像与字节转换

一个字节表示0-255整数
一个像素通常由每个通道的一个字节表示
一个OpenCV图像是.array类型的二维或三维数组
8位的灰度图像是一个含有字节值的二维数组,一个24位BGR图像是一个三维数组,如:image[0,0]或image[0,0,0]
第一个值表示y坐标或行,0表示顶部,第二个值是像素的x或列,0表示左边,第三个值表示颜色通道

 1 # byteArray = bytearray(image)    
 2 #将图像显式转换为标准的一维python bytearray格式
 3 
 4 # grayImage=numpy.array(grayByteArray).reshape(height,width)
 5 # bgrImage=numpy.array(bgrByteArray).reshape(height,width,3)
 6 #相反,bytearray可以通过显式转换和重构,得到numpy.array形式的图像
 7 
 8 import cv2
 9 import numpy
10 import os
11 
12 #生成一个120000的随机字节组成的数组
13 random_byte_Array=bytearray(os.urandom(120000))
14 flat_Numpy_Array=numpy.array(random_byte_Array)
15 
16 #将这数组转换生成400*300的灰度图
17 gray_image=flat_Numpy_Array.reshape(300,400)
18 cv2.imwrite('RandomGray.png',gray_image)
19 
20 #将这数组转换生成400*100的彩色图
21 bgrImage=flat_Numpy_Array.reshape(100,400,3)
22 cv2.imwrite('RandomColor.png',bgrImage)
23 
24 #注:使用os.urandom()函数可随机生成原始字节,随后将其转换成Numpy数组
25 # numpy.random.randint(0,256,120000).reshape(300,400)也可以生成Numpy数组(更高效)
26 #但os.urandom()有助于原始字节的转换

5.使用numpy.array访问图像数据


 1 # import cv2
 2 # import numpy as np
 3 # img = cv2.imread('test.png')
 4 
 5 #*********像素点转换
 6 # img[0,0] = [255,255,255]      #将图像在(0,0)处的像素转化为白像素
 7 # cv2.imshow('new test',img)    #显示图像
 8 # cv2.waitKey()                 #图像停留
 9 
10 #********item()像素点转换
11 # print(img.item(150,120,2))  #打印当前位置像素中B的值
12 # # item()方法三个参数:x(左),y(上),(x,y)位置的数组索引取值为0-B,1-G,2-R
13 # img.itemset((150,120,0),255) #替换当前位置像素中B的值为255
14 # print(img.item(150,120,0)
15 
16 #********索引像素点转换
17 #通过循环来处理python数组效率非常低,一般采用数组索引高效的操作像素
18 # img = cv2.imread('test.png')
19 # img[:,:,1]=0                    #将图像所有绿色G的值换成0
20 # cv2.imshow('new',img)
21 # cv2.imwrite('test_noG.png',img)
22 # cv2.waitKey()
23 
24 #********截图
25 import cv2
26 import numpy as np
27 img = cv2.imread('test.png')
28 test_copy = img[0:100,0:100]              #将图像[0:100,0:100]范围的图像部分截取
29 img[100:200,100:200] = test_copy          #将截取的图像放到图像[100:200,100:200]上,需要保证区域大小一样
30 cv2.imwrite('test2.png',img)
31 # cv2.imwrite('test_copy.png',test_copy)  #也可以将截取的部分新建一张图
32 # cv2.imshow('new',img)
33 # cv2.waitKey()
34 
35 # import cv2
36 # import numpy as np
37 # img = cv2.imread('test.png')
38 # print(img.shape)        #打印宽度,高度,通道数     (400, 600, 3)
39 # print(img.size)         #打印像素数值             720000
40 # print(img.dtype)        #打印图像数据类型         uint8

 



posted @ 2019-01-02 20:46  Pinocchio0-0  阅读(333)  评论(0编辑  收藏  举报