颜色空间的转换用到了如下约定:
- 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是纯色透明的
网友评论