Python_09OpenCV色彩空间、像素运算

2020/08/02

Python_OpenCV色彩空间、像素运算

  • 1、常见的色彩空间有哪些?
  • 2、色彩空间如何互相转换?
    • (1)HSV取值
    • (2)inRange函数
  • 3、视频色彩空间转换实例
    • (1)提取视频并显示出来
    • (2)RGB转换成HSV提取颜色(这时是亮色)
    • (3)显示出来彩色图像
  • 4、通道分离与合并
    • (1)通道分离
    • (2)通道合并
  • 5、像素运算
    • (1)算数运算
      • ①两个图像相加
      • ②两个图像相减
      • ③两个图像相乘
      • ④两个图像相除(用的较少)
      • ⑤两个图像的均值和方差
    • (2)逻辑运算
      • ①与运算
      • ②或运算
      • ③非运算
hon_OpenCV色彩空间、像素运算)

1、常见的色彩空间有哪些?

RGB、HSV、HIS、YCrCb、YUV

2、色彩空间如何互相转换?

def color_space_demo(image):
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)		#最常见的BGR转换到灰度空间
    cv.imshow("gray",gray)
    hsv = cv.cvtColor(image,cv.COLOR_BGR2HSV)   	#BGR转换到HSV
    cv.imshow("hsv",hsv)
    yuv = cv.cvtColor(image,cv.COLOR_BGR2YUV)   	#BGR转换到YUV
    cv.imshow("yuv",yuv)
    Ycrcb = cv.cvtColor(image,cv.COLOR_BGR2YCrCb)   #BGR转换到YCrCb
    cv.imshow("Ycrcb",Ycrcb)

运行结果:
Python_09OpenCV色彩空间、像素运算_第1张图片
注意:
重要的常用的转换
★①HSV与RGB之间的转换
★②YUV和RGB之间的转换

(1)HSV取值

H:0-180
S:0-255
V:0-255

(2)inRange函数

在这里插入图片描述
三个参数;第一个参数是输入图像就是转换成的hsv图像,第二个参数是hsv的三个低值,第三个参数是hsv的三个高值
Python_09OpenCV色彩空间、像素运算_第2张图片

3、视频色彩空间转换实例

(1)提取视频并显示出来

def extrace_object_demo():          #提取图像中有颜色的对象
    capture = cv.VideoCapture("E")  #读取视频文件
    while(True):
        ret,frame = capture.read()  #返回,如果有就返回True,如果没有就返回False
        if ret == False:            #如果没有就结束程序
            break
        cv.imshow("video",frame)    #显示视频
        c = cv.waitKey(40)
        if c == 27:                 #27就是esc退出
            break

(2)RGB转换成HSV提取颜色(这时是亮色)

Python_09OpenCV色彩空间、像素运算_第3张图片
即在3、(1)中加入以下代码

        hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)#将RBG转换为HSV
        lower_hsv = np.array([37,43,46])        # 对照表的数值提取绿色;定义13列的数组存放低值
        upper_hsv = np.array([77,255,255])      # 对照表的数值提取绿色;定义13列的数组存放高值
        mask = cv.inRange(hsv,owerb=lower_hsv,upperb=upper_hsv)
        cv.imshow("mask",mask)

(3)显示出来彩色图像

Python_09OpenCV色彩空间、像素运算_第4张图片

def extrace_object_demo():          #提取图像中有颜色的对象
    capture = cv.VideoCapture("E")  #读取视频文件
    while(True):
        ret,frame = capture.read()  #返回,如果有就返回True,如果没有就返回False
        if ret == False:            #如果没有就结束程序
            break

        hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)#将RBG转换为HSV
        lower_hsv = np.array([37,43,46])        # 对照表的数值提取绿色;定义13列的数组存放低值
        upper_hsv = np.array([77,255,255])      # 对照表的数值提取绿色;定义13列的数组存放高值
        mask = cv.inRange(hsv,owerb=lower_hsv,upperb=upper_hsv)
        dst = cv.bitwise_and(frame,frame,mask=mask) #与或非和mask一起用,颜色对象可以很快的被提取出来
        cv.imshow("video",frame)    #显示视频
        cv.imshow("mask",dst)       #这里不显示mask了,显示dst

        c = cv.waitKey(40)
        if c == 27:                 #27就是exc退出
            break

4、通道分离与合并

(1)通道分离

split(图片)将三通道图像分成三个通道显示

b,g,r = cv.split(src)
cv.imshow("blue",b)
cv.imshow("green",g)
cv.imshow("red",r)
src[:,:, 2]=0  #对某一个通道赋值;对最后一个通道赋值=0,就是去掉红色

(2)通道合并

merge(一个数组)将三通道图像合并起来

src = cv.merge([b,g,r])
cv.imshow("changed image",src)

5、像素运算

要求两种图片大小一样

(1)算数运算

加、减、乘、除

①两个图像相加

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 multiply_demo(m1,m2):   # 两个相乘
    dst = cv.multiply(m1,m2)
    cv.imshow("multiply_demo",dst)

④两个图像相除(用的较少)

def dicide_demo(m1,m2):   # 两个相除(用的较少)
    dst = cv.dicide(m1,m2)
    cv.imshow("dicide_demo",dst)

⑤两个图像的均值和方差

def others(m1,m2):            # 其他
    AVG1 = cv.mean(m1)        # m1的均值
    AVG2 = cv.mean(m2)        # m2的均值
    VAR1 = cv.meanStdDev(m1)  # m1的方差
    VAR2 = cv.meanStdDev(m2)  # m1的方差
    print(AVG1)
    print(AVG2)
    print(VAR1)
    print(VAR2)

均值和方差的应用

  1. 求图片的均值和方差,如果都等于0,则说明没有加载任何有用的信息
  2. 求均值和方差判断扫描仪是否除故障

色彩空间应用:
调节亮度、调节对比度
0是最黑暗的

def contrast_brightness_demo(image, c, b):         #
    h, w, ch = image.shape
    blank = np.zeros([h, w, ch],image.dtype)       # 创建一个和它宽度和高度相同的空白的图像
    dst = cv.addWeighted(image, c, blank, 1-c, b)  # 参数依次是图像image,对比度c,空白的图像blank,1-c,b;
                                                   # 注意:只要在函数当中是None的在前面都可以接收
    cv.imshow("contrast_brightness_demo", dst)

(2)逻辑运算

与、或、非

①与运算

def logic_demo0(m1,m2):   # 两个与运算
    dst = cv.bitwise_and(m1,m2)
    cv.imshow("logic_demo",dst)

②或运算

def logic_demo1(m1,m2):   # 两个图像或运算
    dst = cv.bitwise_or(m1,m2)
    cv.imshow("logic_demo",dst)

③非运算

一张图像的每个像素按位取反

def logic_demo(m1):          # 非运算不是对一组图而是对一张图像来说的;
                             # 和之前视频像素取反提高速度是一样的,就是每个像素按位取反
    dst = cv.bitwise_not(m1)
    cv.imshow("logic_demo",dst)

应用:
遮罩层控制

你可能感兴趣的:(笔记)