前段时间学校布置课程设计,选了个用教室图片检测出勤人数的题目.学了几天相应的基本操作
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)
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
原文:https://www.cnblogs.com/xzb0-0/p/10211190.html