一、带着问题去学习?
1.1 如何获取图片像素,并对其修改?
1.2 如何获取图片属性?图片又有哪些属性?
1.3 如何获取区域图片?
1.4 如何对图片通道进行分割和合并?
1.5 如何对图片进行填充和延展?
二、
2.1 图片像素获取和修改
1 import cv2 2 import numpy as np 3 img = cv2.imread('F:/team.jpg') 4 px = img[100, 100] #图片为二维数组,100*100表示横纵坐标,聚焦到一个点 5 print(px) # [157 166 200] 返回的是该点BGR各个值所组成的数组 6 7 blue = img[100, 100, 0] # 第三个值0代表BGR通道中的B 8 print(blue) #157
9 #获取图片像素的另一种方式: item
10 img.item(100, 100, 0)
11
12 #更改像素的值
13 img.itemset((100, 100, 0) 100)
2.2 获取图片属性
1 img.shape #返回(长,宽,通道) 2 img.size #返回图片总像素数值 3 img.dtype #返回图片数据类型
*注: 这里需要注意dtype属性,很多在OpenCV中发生的错误,都是因为数据类型错误,因此,Debug时,可以多检测它
2.3 获取区域图片
因为图片为二维数组,因此使用slice去划分区域
1 part = img[30:80, 30:80] 2 img[100:150, 100:150] = part
2.4 图片通道分割和合并
两个API cv2.split() 和 cv2.merge()
1 b, g, r = cv2.split(img) 2 img = cv2.merge((b, g, r)) 3 4 b = img[:, :, 0] 5 img[:, : ,2] = 0
*注:cv2.split()是一个非常耗时的操作
2.5 图片延展
cv2. copyMakeBorder()
1 import cv2 2 import numpy as np 3 from matplotlib import pyplot as plt 4 BLUE = [255,0,0] 5 img1 = cv2.imread('F:/team.jpg') 6 7 replicate = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REPLICATE) 8 reflect = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT) 9 reflect101 = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_REFLECT_101) 10 wrap = cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_WRAP) 11 constant= cv2.copyMakeBorder(img1,30,30,30,30,cv2.BORDER_CONSTANT,value=BLUE) 12 13 plt.subplot(231),plt.imshow(img1,'gray'),plt.title('ORIGINAL') 14 plt.subplot(232),plt.imshow(replicate,'gray'),plt.title('REPLICATE') 15 plt.subplot(233),plt.imshow(reflect,'gray'),plt.title('REFLECT') 16 plt.subplot(234),plt.imshow(reflect101,'gray'),plt.title('REFLECT_101') 17 plt.subplot(235),plt.imshow(wrap,'gray'),plt.title('WRAP') 18 plt.subplot(236),plt.imshow(constant,'gray'),plt.title('CONSTANT') 19 plt.show()