1.1 图片属性
- img.shape:获取图像的形状(元组),彩色图返回一个包含行数(高度)、列数(宽度)和通道数的元组,灰度图只返回行数和列数。
- img.dtype:获取图像数据类型。
- img.size:获取图像总像素数(高度 * 列数 * 通道数)。
1.2 获取和修改像素点
- img[100, 90]:获取行坐标为100,列坐标为90的像素点的值。
- img[100, 90, 0]:只获取该像素点blue通道的值。
- img[100, 90] = [255, 255, 255],改变这一像素点的值。
- 另一种性能更好的方法:
获取:img.item(100,90,0)
修改:img.itemset((100,100,0),255),这种方式只能B,G,R逐一修改。
1.3 区域截取
img[100:200, 115:188],前面的参数设定横坐标(纵向的范围),后面的参数设定列坐标(横向的范围)。
1.4 通道分割与合并
-
分割并合成一个图像
import cv2 img = cv2.imread('img/04.jpg') b, g, r = cv2.split(img) img = cv2.merge((b, g, r))
-
使用索引值提取单通道(性能好):
b = img[:, :, 0] g = img[:, :, 1] r = img[:, :, 2]
1.5 颜色转换和追踪
1. cv2.cvtColor(p1,p2)
用来进行颜色模型转换,p1是要转换的图片,p2是转换模式, COLOR_BGR2GRAY
表示BGR→Gray。
- 可用下面的代码显示所有的转换模式:
patters = [i for i in dir(cv2) if i.startswith("COLOR_")]
print(patters)
-
使用HSV模型进行特定颜色追踪
-
HSV](https://baike.baidu.com/item/HSV/547122)是一个常用于颜色识别的模型,相比BGR更易区分颜色,转换模式用
COLOR_BGR2HSV
表示。 -
OpenCV中色调H范围为[0,179],饱和度S是[0,255],明度V是[0,255]。虽然H的理论数值是0°~360°,但8位图像像素点的最大值是255,所以OpenCV中除以了2,某些软件可能使用不同的尺度表示,所以同其他软件混用时,记得归一化。
-
实例:只显示蓝色物体
-
import cv2
import numpy as np
img = cv2.imread('img/04.jpg')
#获取HSV值的上下限范围
blue = np.uint8([[[255,0,0]]])
hsv_blue = cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
print(hsv_blue) #[120,255,255]
# 规定蓝色范围
lower_blue = np.array([100,110,110])
upper_blue = np.array([130,255,255])
# 从BGP转换为HSV
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
cv2.imwrite('img/hsv.jpg', hsv)
# inRange():介于lower/upper之间的为白色,其余黑色
mask = cv2.inRange(hsv,lower_blue,upper_blue)
cv2.imwrite('img/mask.jpg', mask)
# 只保留图中蓝色部分
res = cv2.bitwise_and(img,img,mask=mask)
cv2.imwrite('img/res.jpg', res)
1.6 图像几何变换
- 缩放图片
res1 = cv2.resize(img,(132,150)) #按照指定宽度、高度缩放图片
res2 = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR) #x,y轴放大一倍
- 镜像翻转图片
res1 = cv2.flip(img,0) # =0垂直翻转(沿x轴)
res2 = cv2.flip(img,1) # >0水平翻转(沿y轴)
res3 = cv2.flip(img,-1) # <0水平垂直翻转
- 平移图片
rows,cols = img.shape[:2]
#定义平移矩阵,需要是numpy的float32类型
M = np.float32([[1,0,100],[0,1,50]])# x轴平移100,y轴平移50
res = cv2.warpAffine(img,M,(cols,rows))
- 旋转图片
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.5)
res1 = cv2.warpAffine(img,M,(cols,rows))
M = cv2.getRotationMatrix2D((cols/2,rows/2),-45,0.5)
res2 = cv2.warpAffine(img,M,(cols,rows))