Opencv:Task02:图像的基础操作、色彩空间

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()

猜你喜欢

转载自blog.csdn.net/zhaohaobingniu/article/details/113820496