计算机视觉Opencv3实验笔记(3)——色彩空间与像素运算

一、色彩空间

1.1 什么是色彩空间

     色彩空间是定义的颜色范围,即计算机存储色彩的数据结构。知名的色彩空间有 sRGB、AdobeRGB 和 ProPhotoRGB。

1.2 常见的色彩空间

常见的色彩空间有 RGB、HSV、YUV等。

如上图所示的是一个HSV的色彩空间:S与V是0-255,H是0-180(在opencv中是0-180,原本是可以0-360的,只是为了8位存储,被归一化到0-180而已),色彩分布如下表所示,如果需要不同颜色时,按HSV进行填写:

YCrCb:常见用于人类皮肤的色彩数据

YUV:Linux中默认的存储图片的色彩空间为YUV

最常见的转换有两个:RGB<-->HSV, RGB<-->YUV

1.3 实验代码分析

import cv2 as cv
import numpy as np

def extrace_object_demo():   #函数将视频中绿色的部分过滤出来,使用cv.inRange()函数
    capture = cv.VideoCapture("C:\\0-MyWork\\03、Python版OpenCV3计算机图像视觉视频教程\\01概述与环境搭建.mp4")
    while(True):
        ret, frame = capture.read()
        if ret == False:
            break;
        hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
        lower_hsv = np.array([35, 43, 46])   #查看上述表中绿色的HSV低值
        upper_hsv = np.array([77, 255, 255])  #查看上述表中绿色的HSV高值
        mask = cv.inRange(hsv, lowerb=lower_hsv, upperb=upper_hsv)
        dst = cv.bitwise_and(frame, frame, mask=mask)    #对比原图和掩模进行位运算,bitwise_not代表取反(即255-原值)
        cv.imshow("video", frame)
        cv.imshow("mask", dst)
        c = cv.waitKey(40)    #cvWaitKey()函数的功能是不断刷新图像,频率时间为delay,单位为ms。如果使用cvWaitKey(0)则只会显示第一帧视频。
                              # 当delay<=0的时,如果没有键盘触发,则一直等待。返回值,为键盘按下的码字;
        if c == 27:
            break


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", hsv)
    yuv = cv.cvtColor(image, cv.COLOR_BGR2YUV)
    cv.imshow("yuv", yuv)
    Ycrcb = cv.cvtColor(image, cv.COLOR_BGR2YCrCb)
    cv.imshow("ycrcb", Ycrcb)
def spMergeFig(src):
    b, g, r = cv.split(src)   #通道分离
    cv.imshow("blue", b)
    cv.imshow("green", g)
    cv.imshow("red", r)

    src = cv.merge([b, g, r])  #也可以合并3个通道
    src[:, :, 0] = 0   #实验将第一个通道赋为0
    cv.imshow("changed image", src)

print("---------OPENCV 图像处理---------")
src = cv.imread("C:\\1-WorkSoftware\\pythonCode\\python-opencv_tutorial_codes\\opencv-python\\zly.jpeg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
color_space_demo(src)
extrace_object_demo()
spMergeFig(src)



cv.waitKey(0)
cv.destroyAllWindows()

 

以下仅为部分图片(视频部分运行结果已经去掉):

二、像素运算

2.1 对图片的三个通道进行计算

这里对图片的三个通道 进行:

1)+-*/四项进算;

2)逻辑运算、求平均值与方差;

3)对比度(即将像素之间的差异扩大化)与亮度(所有像素三通道全部加1个值,即变白了)进行运算。

测试代码如下:

import cv2 as cv
import numpy as np


def add_demo(m1, m2):    #像素点相加,图像大小要一样
    dst = cv.add(m1, m2)
    cv.imshow("add_demo", dst)


def subtract_demo(m1, m2):  #像素点相减,图像大小要一样
    dst = cv.subtract(m1, m2)
    cv.imshow("subtract_demo", dst)


def divide_demo(m1, m2):   #像素点相除,图像大小要一样
    dst = cv.divide(m1, m2)
    cv.imshow("divide_demo", dst)


def multiply_demo(m1, m2):
    dst = cv.multiply(m1, m2)
    cv.imshow("multiply_demo", dst)


def logic_demo(m1, m2):     #图片的逻辑运算
    #dst = cv.bitwise_and(m1, m2)
    dst1 = cv.bitwise_or(m1, m2)
    image = cv.imread("C:/1-WorkSoftware/pythonCode/images/linuxLogo.png")
    #cv.imshow("image1", image)
    dst2 = cv.bitwise_not(image)
    cv.imshow("logic_demo_bitwise_or", dst1)
    cv.imshow("logic_demo_bitwise_not", dst2)


def contrast_brightness_demo(image, c, b):    #调整图像的亮度与对比度,本函数中c代表对比度,b代表亮度
    h, w, ch = image.shape
    blank = np.zeros([h, w, ch], image.dtype)
    dst = cv.addWeighted(image, c, blank, 1-c, b)
    cv.imshow("con-bri-demo", dst)


def others(m1, m2):    #用于计算图片三通道的均值与方差,并打印之
    M1, dev1 = cv.meanStdDev(m1)   #M取图片三个通道的均值,dev取三通道的方差
    M2, dev2 = cv.meanStdDev(m2)
    h, w = m1.shape[:2]    #只取图像的高、宽,不取通道

    print(M1)       #[[37.24318885][37.09336945][36.66354489]]
    print(M2)       #[[126.14718782][ 96.75828173][ 42.0252838 ]]

    print(dev1)     #[[48.82160712] [48.72778769] [48.18074718]]
    print(dev2)     #[[67.57171883] [32.13257429] [50.82122017]]

    img = np.zeros([h, w ,3], np.uint8)  #新建一张纯黑色的图片,用于测试均值 与方差
    m, dev = cv.meanStdDev(img)     #函数取值如上所示
    print(m)                        #[[0.] [0.] [0.]]
    print(dev)                      #[[0.] [0.] [0.]]

print("--------- Hello Python ---------")
src1 = cv.imread("C:/1-WorkSoftware/pythonCode/images/linuxLogo.png")
src2 = cv.imread("C:/1-WorkSoftware/pythonCode/images/windowsLogo.png")
print(src1.shape)   #打印结果(170, 228, 3)
print(src2.shape)   #打印结果(170, 228, 3)
cv.namedWindow("image1", cv.WINDOW_AUTOSIZE)
cv.imshow("image1", src1)
cv.imshow("image2", src2)

add_demo(src1, src2)
subtract_demo(src1, src2)
divide_demo(src1, src2)   #基本上一除之后,值 很小,会变成偏黑
multiply_demo(src1, src2)  #相乘之后比较大,
others(src1, src2)
logic_demo(src1, src2)
contrast_brightness_demo(src2, 1.5, 50)  #表示对比亮扩大1.5倍,亮度加50
cv.waitKey(0)

cv.destroyAllWindows()

执行以上代码,运算结果如下所示。

 

 

说明:本无法博文及后续本专栏文章代码与测试文件下载地址为:

链接:https://pan.baidu.com/s/1BeZkXoCAn_AFRkyXcI8dMQ 
提取码:aze2 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值