美文网首页
色彩空间转换

色彩空间转换

作者: Tsukinousag | 来源:发表于2021-10-01 22:14 被阅读0次

    颜色空间的转换用到了如下约定:

    • 8位图像的范围是[0,255]
    • 16位图像的范围是[0,65535]
    • 浮点数图像值的范围是[0.0~1.0]

    对于线性转换来说,这些取值范围是无关紧要的,但对于非线性转换来说,输入的RGB图像必须归一化到其相应的取值范围内

    cv2.cvtColor() 
    

    1.将RGB图像与灰度图像相互转换

    img=np.random.randint(0,256,size=[256,256,3],dtype=np.uint8)
    rst=cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)
    
    img=np.random.randint(0,256,size=[256,256],dtype=np.uint8)
    rst=cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)
    

    将图像从BGR模式转为RGB模式

    img=cv2.imread("D:/hjb.jpg",1)
    rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    

    从BGR空间到HSV空间的转换

    #将蓝色,绿色,红色三种颜色分别进行转换,将他们从BGR色彩空间转换到HSV空间,并观察对应值
    
    import cv2
    import numpy as np
    
    imgblue=np.zeros((1,1,3),dtype=np.uint8)
    imgblue[0,0,0]=255
    blue=imgblue
    
    blueHSV=cv2.cvtColor(blue,cv2.COLOR_BGR2HSV)
    
    print("blue:\n",blue)
    print("blueHSV:\n",blueHSV)
    

    映射后色调为120对应的是蓝色

    blue:
     [[[255   0   0]]]
    blueHSV:
     [[[120 255 255]]]
    

    import cv2
    import numpy as np
    
    imggreen=np.zeros((1,1,3),dtype=np.uint8)
    imggreen[0,0,1]=255
    green=imggreen
    
    greenHSV=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
    
    print("green:\n",green)
    print("greenHSV:\n",greenHSV)
    

    映射后色调为60对应的是绿色

    green:
     [[[  0 255   0]]]
    greenHSV:
     [[[ 60 255 255]]]
    

    import cv2
    import numpy as np
    
    imgred=np.zeros((1,1,3),dtype=np.uint8)
    imgred[0,0,2]=255
    red=imgred
    
    redHSV=cv2.cvtColor(red,cv2.COLOR_BGR2HSV)
    
    print("red:\n",red)
    print("redHSV:\n",redHSV)
    
    
    
    

    映射后色调对应的是0的是红色

    red:
     [[[  0   0 255]]]
    redHSV:
     [[[  0 255 255]]]
    

    标记特定颜色

    如何将图像特定颜色标记出来,即将一幅图像内的其他颜色屏蔽,仅仅将特定颜色显示出来

    1.inRange函数显示特定值
    dst=cv2.inRange(src,lowerb,upperb)
    
    • 1.如果src值处于该区间内,则dst中对应位置上的值为255
    • 2.如果src值不出与该指定区间内,则dst中对应位置上的值为0

    将某个图像内的在[100,200]内的值标注出来

    import cv2
    import numpy as np
    
    img=np.random.randint(0,256,size=[5,5],dtype=np.uint8)
    
    dst=cv2.inRange(img,100,200)
    
    print(dst)
    
    [[  0 255 255   0   0]
     [  0 255   0   0 255]
     [  0 255   0 255   0]
     [  0   0 255   0   0]
     [  0 255 255 255   0]]
    
    2.通过基于掩码的按位与显示ROI
    import cv2
    import numpy as np
    
    img=np.ones((5,5),dtype=np.uint8)*9
    mask=np.zeros((5,5),dtype=np.uint8)
    mask[0:3,0]=1
    mask[2:5,2:4]=1
    
    roi=cv2.bitwise_and(img,img,mask=mask)
    
    img:
     [[9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]
     [9 9 9 9 9]]
    mask:
     [[1 0 0 0 0]
     [1 0 0 0 0]
     [1 0 1 1 0]
     [0 0 1 1 0]
     [0 0 1 1 0]]
    roi:
     [[9 0 0 0 0]
     [9 0 0 0 0]
     [9 0 9 9 0]
     [0 0 9 9 0]
     [0 0 9 9 0]]
    
    3.显示特定颜色值

    在实际提取颜色时,提取一个颜色区间

    • 蓝色:[110,100,100]和[130,255,255]之间
    • 绿色:[50,100,100]和[70,255,255]之间
    • 红色:[0,100,100]和[10,255,255]之间
    import cv2
    import numpy as np
    
    img=cv2.imread("D:/opencv.jpg")
    
    dst=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    
    cv2.imshow("dst",dst)
    cv2.imshow("img",img)
    
    ####指定蓝色区域
    minblue=np.array([110,50,50])
    maxblue=np.array([130,255,255])
    
    #确定蓝色区域
    mask=cv2.inRange(dst,minblue,maxblue)
    blue=cv2.bitwise_and(dst,dst,mask=mask)
    
    cv2.imshow("blue",blue)
    ####指定绿色区域
    mingreen=np.array([50,50,50])
    maxgreen=np.array([70,255,255])
    
    mask=cv2.inRange(dst,mingreen,maxgreen)
    green=cv2.bitwise_and(dst,dst,mask=mask)
    
    cv2.imshow("green",green)
    ####指定红色区域
    minred=np.array([0,50,50])
    maxred=np.array([10,255,255])
    
    mask=cv2.inRange(dst,minred,maxred)
    red=cv2.bitwise_and(dst,dst,mask=mask)
    
    cv2.imshow("red",red)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    标记肤色

    假定肤色范围划定为

    • 色调在[5,170]之间
    • 饱和度在[25,166]之间
    import cv2
    import numpy as np
    
    img=cv2.imread("D:/renlian.jpg")
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    
    cv2.imshow("img",img)
    cv2.imshow("hsv",hsv)
    
    h,s,v=cv2.split(hsv)
    
    minh=5
    maxh=170
    hmask=cv2.inRange(h,minh,maxh)
    
    mins=25
    maxs=166
    smask=cv2.inRange(s,mins,maxs)
    
    #构建掩图
    mask=hmask&smask
    
    roi=cv2.bitwise_and(img,img,mask=mask)
    
    cv2.imshow("ROI\n",roi)
    
    cv2.waitKey(0)
    cv2.destroyWindow()
    

    改变HSV中的某一个值

    调整HSV色彩空间内V通道的值,观察其处理结果

    import cv2
    import numpy as np
    
    img=cv2.imread("D:/renlian.jpg")
    
    cv2.imshow("img",img)
    
    hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    
    h,s,v=cv2.split(hsv)
    
    v[:,:]=255
    
    newhsv=cv2.merge([h,s,v])
    
    art=cv2.cvtColor(newhsv,cv2.COLOR_HSV2BGR)
    
    cv2.imshow("art",art)
    
    cv2.waitKey(0)
    cv2.destroyWindow()[图片上传中...(QQ截图20211001214453.png-5a66fa-1633095911679-0)]
    
    

    alpha通道

    在RGB色彩空间三个通道的基础上,还可以加上一个A通道,也叫alpha通道,表示透明度。四个通道的色彩空间被称为BGRA色彩空间(PNG)。alpha通道的赋值是[0,1]或者[0,255],表示透明到不透明

    import cv2
    import numpy as np
    
    img=np.random.randint(0,256,size=[2,3,3],dtype=np.uint8)
    
    print("img:\n",img)
    
    bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
    
    print("bgra:\n",bgra)
    
    b,g,r,a=cv2.split(bgra)
    
    print("a:\n",a)
    
    a[:,:]=125
    
    newbgra=cv2.merge([b,g,r,a])
    
    print("newbgra:\n",newbgra)
    
    img:
     [[[  1 101 227]
      [ 37  64 144]
      [ 66 178 104]]
    
     [[178  15 241]
      [ 74 233  82]
      [163  60  45]]]
    
    bgra:
     [[[  1 101 227 255]
      [ 37  64 144 255]
      [ 66 178 104 255]]
    
     [[178  15 241 255]
      [ 74 233  82 255]
      [163  60  45 255]]]
    
    a:
     [[255 255 255]
     [255 255 255]]
    
    newbgra:
     [[[  1 101 227 125]
      [ 37  64 144 125]
      [ 66 178 104 125]]
    
     [[178  15 241 125]
      [ 74 233  82 125]
      [163  60  45 125]]]
    

    对图像的alpha通道进行操作

    import cv2
    import numpy as np
    
    img=cv2.imread("D:/renlian.jpg")
    cv2.imshow("img",img)
    
    bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)
    cv2.imshow("bgra",bgra)
    
    b,g,r,a=cv2.split(bgra)
    
    a[:,:]=125
    
    bgra125=cv2.merge([b,g,r,a])
    cv2.imshow("bgra125",bgra125)
    
    a[:,:]=0
    
    bgra0=cv2.merge([b,g,r,a])
    cv2.imshow("bgra0",bgra0)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    cv2.imwrite("D:/bgra.png",bgra)
    cv2.imwrite("D:/bgra0.png",bgra0)
    cv2.imwrite("D:/bgra125.png",bgra125)
    

    实际打开png后的效果如下,a=0是纯色透明的


    相关文章

      网友评论

          本文标题:色彩空间转换

          本文链接:https://www.haomeiwen.com/subject/forunltx.html