栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

色彩空间转换

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

色彩空间转换

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

  • 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("ROIn",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是纯色透明的


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/291006.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号