Task02:图像的基础操作、色彩空间
图像的基础操作:
import cv2 as cv
img = cv.imread("picture\me.jpg")
#像素的行和列的坐标获取他的像素值
print(img.item(10,10,2))
#修改像素值
img.itemset((10,10,2),100)
print(img.item(10,10,2))
#获取图像属性(行数,列数, 通道数)
print(img.shape)
#图像的像素数目
print(img.size)
#图像的数据类型
print(img.dtype)
截取选定区域:
import cv2 as cv
img = cv.imread("picture\me.jpg")
#截取选定区域
something = img[0:300, 70:350]
cv.imshow('something',something)
cv.waitKey(0)
Opencv中常用的颜色空间就三种BGR、HSV、灰度:
import cv2 as cv
img1 = cv.imread("picture\me.jpg")
img2 = cv.imread("picture\me.jpg")
#BGR↔Gray 的转换
hsv1 = cv.cvtColor(img1, cv.COLOR_BGRA2GRAY)
#BGR↔HSV 的转换
hsv2 = cv.cvtColor(img1, cv.COLOR_BGR2HSV)
cv.imshow("img1",hsv1)
cv.imshow("img2",hsv2)
cv.waitKey(0)
H(色彩/色度)的取值范围是 [0,179], S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。
物体跟踪:
在 HSV 颜色空间中要比在 BGR 空间 中更容易表示一个特定颜色。
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while True :
ret,frame = cap.read()
#每一帧先mask处理
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
#np.array 创建一个数组
lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])
#mask将符合数值区间的黑白提取出来
mask = cv.inRange(hsv,lower_blue,upper_blue)
#res将提取出来的在还原颜色
# frame和frame先取’与‘操作,在用其结果和mask取’与‘操作
# 将mask中白色地方的颜色在前面结果对应地方中显示出来)
res = cv.bitwise_and(frame,frame,mask = mask)
cv.imshow('frame', frame)
cv.imshow('mask', mask)
cv.imshow('res', res)
if cv.waitKey(5) & 0xff ==ord("q"):
break
cv.destroyAllWindows()
程序运行时间:
import cv2 as cv
e1 = cv.getTickCount()
#函数a
e2 = cv.getTickCount()
#可得函数a运行时间
time = (e2 - e1)/cv.getTickFrequency()
print(time)
思考题:
HSV和BGR三原色在图片信息存储的差别在哪?
答:
全彩图像RGB:颜色通道(红、绿、蓝),三层,每层的0-255代表该层颜色的亮度,opencv里是BGR
HSV:色调(H),饱和度(S),明度(V),增加黑色V减小,增加白色S减小
练习题:
编写一段程序实现以下功能:
代码调用电脑摄像头,寻找视野中任意颜色(自定)并具有一定大小的物体,并用矩形框处,最后显示在图像上;
import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while True :
ret,frame = cap.read()
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
red_lower = np.array([255,192,203])
red_upper = np.array([220,20,60])
mask = cv.inRange(hsv,red_lower,red_upper)
mask = cv.GaussianBlur(mask, (3, 3), 0)
(cnt_s, _) = cv.findContours(mask.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
if len(cnt_s) > 0:
cnt = sorted(cnt_s, key=cv.contourArea, reverse=True)
for i in cnt:
if len(i) > 60:
rect = np.int32(cv.boxPoints(cv.minAreaRect(i)))
cv.drawContours(frame, [rect], -1, (0, 255, 0), 2)
res = cv.bitwise_and(frame,frame,mask = mask)
cv.imshow('frame', frame)
cv.imshow('mask', mask)
cv.imshow('res', res)
if cv.waitKey() == ord("q"):
break
cv.destroyAllWindows()