小白学python(opencv色彩空间)

这篇博客介绍了OpenCV中的色彩空间,包括灰度、RGB和HSV,并展示了如何进行色彩空间转换,如从BGR到HSV。还提供了处理视频的示例,通过HSV颜色空间追踪特定颜色,并演示了如何分离RGB图像的各个通道。
摘要由CSDN通过智能技术生成

色彩空间介绍

灰度色彩空间

单通道,取值范围[0,255]

RGB色彩空间

RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。
Red,Green和Blue三个channel(通道)构成
opencv中R,G,B三通道取值范围均为[0,255]。
(百度百科)
在这里插入图片描述

HSV

是为了数字化图像提出来了,不能很好的表示人眼解释图像过程
H (Hue)色相:[0,360]
S (Saturation)饱和度,即色彩纯净度,0饱和度为白色
V (Value/Brightness):明度 0明度为纯黑色

在OpenCV中,颜色范围:
H = [0,179]
S = [0,255]
V = [0,255]
在这里插入图片描述

opencv–HSV颜色空间

HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。
色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。

在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。
在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。
圆锥的顶面中心处S=0,V=1,H无定义,代表白色。
从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。
对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。

HSV颜色空间它锥形的钻换模型中可以理解到: hue 通道的取值范围就应该是 0-360度,单数在opencv中其取值范围 [0,180]。
在这里插入图片描述

(百度百科)
在这里插入图片描述

一些简单操作

色彩空间转换

最常见两个为:
HSV与RGB
YUV与RGB

def color_space_demo(image): #色彩空间转换
    cv.imshow("Source Pic",image)
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    cv.imshow("gray", gray)

    hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)
    cv.imshow("hsv", hsv)

    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
    cv.imshow("yuv", yuv)

    ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
    cv.imshow("ycrcb", ycrcb)
    cv.waitKey(0)

处理视频追踪某种颜色

def extract_object_demo(Videopath):  #处理视频追踪某种颜色
    capture = cv.VideoCapture(Videopath)
    while(True):
        ret,frame=capture.read()
        if ret == False:
            break
        #用hsv进行追踪处理
        hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
        lower_hsv = np.array([37,43,46])#低值(查表)
        high_hsv = np.array([77,255,255])#高值(这里只是举个例子)
        mask =cv.inRange(hsv,lowerb = lower_hsv,upperb = high_hsv)
        #这里就可以追踪绿色的图像
        cv.imshow("video",frame)
        cv.imshow("mask", mask)
        c = cv.waitKey(50)
        if(c==27):
            break

在这里插入图片描述

把rgb图像三个通道分离

利用split()函数

ef split_pitcure(src): #把rgb图像三个通道分离    b,g,r=cv.split(src)
    cv.imshow("blue",b)
    cv.imshow("green", g)
    cv.imshow("red", r)

在这里插入图片描述
#目前代码:

import cv2  as cv
import  numpy as np
def main():
    Videopath = "E:/电影/[阳光电影www.ygdy8.com].疾速特攻.BD.720p.中英双字幕.mkv"
    pitcurepath = "C:/Users/POG/Pictures/Autumn is coming WallPack/Timon Studler Mod.jpg"
    src = cv.imread(pitcurepath)
    cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建窗口
    #cv.imshow("input image",src)  #显示初始图片
    #access_pixels(src)  #获取反色图片
    #inverse(src) #获取反色图片2
    #video_demo(Videopath) #输出视频
    #extract_object_demo(Videopath)   #处理视频
    #create_iamge() #创建新图片
    #color_space_demo(src)   #色彩空间转换
    split_pitcure(src) #把rgb图像三个通道分离

    cv.waitKey(0) #等待
    cv.destroyAllWindows() #销毁窗口
    # get_image_info(src)  #输出图片信息
    #cv.imwrite("D:/result.png",src)  #保存图片


def get_image_info(image):#获取图像信息
    print(type(image))
    print(image.shape)
    print(image.size)
    print(image.dtype)
    pixel_data = np.array(image)
    print(pixel_data)


def video_demo(Videopath):#调用摄像头
    capture = cv.VideoCapture(Videopath)
    while(True):
        ret,frame = capture.read() #一帧一帧读取
        frame=cv.flip(frame,1)
        # 读取视频的fps,  大小
        fps=capture.get(cv.CAP_PROP_FPS)
        size=(capture.get(cv.CAP_PROP_FRAME_WIDTH),capture.get(cv.CAP_PROP_FRAME_HEIGHT))
        print("fps: {}\nsize: {}".format(fps,size))
        # 读取视频时长(帧总数)
        total = int(capture.get(cv.CAP_PROP_FRAME_COUNT))
        print("[INFO] {} total frames in video".format(total))
        cv.imshow("video",frame)
        c = cv.waitKey(50)
        if (c==27):    #esc为27
            break

def access_pixels(image):#获得反色图片
    print(image.shape)
    height = image.shape[0]
    width = image.shape[1]
    channels = image.shape[2] #blue , green , red
    for row in range(height):
        for col in range(width):
            for c in range(channels):
                pv = image[row,col,c]
                image[row,col,c] = 255-pv
    cv.imshow("pixels_demo",image)

def inverse(image):#获得反色图片2
    dst = cv.bitwise_not(image)
    cv.imshow("inverse_demo",image)

def create_iamge():#创建图片
    img = np.zeros([400,400,3],np.uint8) #创建图片
    img[ :, :, 0] = np.ones([400,400])*255  #三通道为012
    cv.imshow("new",img)

def color_space_demo(image):  #色彩空间转换
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    cv.imshow("gray",gray)
    hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
    cv.imshow("HSV",image)
    yuv=cv.cvtColor(image,cv.COLOR_BGR2YUV)
    cv.imshow("yuv",image)

def extract_object_demo(Videopath):  #处理视频追踪某种颜色
    capture = cv.VideoCapture(Videopath)
    while(True):
        ret,frame=capture.read()
        if ret == False:
            break
        #用hsv进行追踪处理
        hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
        lower_hsv = np.array([37,43,46])#低值(查表)
        high_hsv = np.array([77,255,255])#高值(这里只是举个例子)
        mask =cv.inRange(hsv,lowerb = lower_hsv,upperb = high_hsv)
        #这里就可以追踪绿色的图像
        cv.imshow("video",frame)
        cv.imshow("mask", mask)
        c = cv.waitKey(50)
        if(c==27):
            break
def split_pitcure(src): #把rgb图像三个通道分离    b,g,r=cv.split(src)
    cv.imshow("blue",b)
    cv.imshow("green", g)
    cv.imshow("red", r)


if __name__ =="__main__":
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mcl19909949541

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值