小白学python(opencv色彩空间)
- 色彩空间介绍
- 灰度色彩空间
- RGB色彩空间
- HSV
- opencv–HSV颜色空间
- 一些简单操作
- 色彩空间转换
- 处理视频追踪某种颜色
- 把rgb图像三个通道分离
色彩空间介绍
灰度色彩空间
单通道,取值范围[0,255]
RGB色彩空间
RGB色彩空间还可以用一个三维的立方体来描述。当三基色分量都为0(最弱)时混合为黑色光;当三基色都为k(最大,值由存储空间决定)时混合为白色光。
Red,Green和Blue三个channel(通道)构成
opencv中R,G,B三通道取值范围均为[0,255]。
(百度百科)
HSV
是为了数字化图像提出来了,不能很好的表示人眼解释图像过程
H (Hue)色相:[0,360]
S (Saturation)饱和度,即色彩纯净度,0饱和度为白色
V (Value/Brightness):明度 0明度为纯黑色
在OpenCV中,颜色范围:
H = [0,179]
S = [0,255]
V = [0,255]
opencv–HSV颜色空间
HSV(hue,saturation,value)颜色空间的模型对应于圆柱坐标系中的一个圆锥形子集,圆锥的顶面对应于V=1. 它包含RGB模型中的R=1,G=1,B=1 三个面,所代表的颜色较亮。
色彩H由绕V轴的旋转角给定。红色对应于 角度0° ,绿色对应于角度120°,蓝色对应于角度240°。
在HSV颜色模型中,每一种颜色和它的补色相差180° 。 饱和度S取值从0到1,所以圆锥顶面的半径为1。
在圆锥的顶点(即原点)处,V=0,H和S无定义, 代表黑色。
圆锥的顶面中心处S=0,V=1,H无定义,代表白色。
从该点到原点代表亮度渐暗的灰色,即具有不同 灰度的灰色。
对于这些点,S=0,H的值无定义。可以说,HSV模型中的V轴对应于RGB颜色空间中的主对角线。 在圆锥顶面的圆周上的颜色,V=1,S=1,这种颜色是纯色。
HSV颜色空间它锥形的钻换模型中可以理解到: hue 通道的取值范围就应该是 0-360度,单数在opencv中其取值范围 [0,180]。
(百度百科)
一些简单操作
色彩空间转换
最常见两个为:
HSV与RGB
YUV与RGB
def color_space_demo(image): #色彩空间转换
cv.imshow("Source Pic",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)
cv.waitKey(0)
处理视频追踪某种颜色
def extract_object_demo(Videopath): #处理视频追踪某种颜色
capture = cv.VideoCapture(Videopath)
while(True):
ret,frame=capture.read()
if ret == False:
break
#用hsv进行追踪处理
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
lower_hsv = np.array([37,43,46])#低值(查表)
high_hsv = np.array([77,255,255])#高值(这里只是举个例子)
mask =cv.inRange(hsv,lowerb = lower_hsv,upperb = high_hsv)
#这里就可以追踪绿色的图像
cv.imshow("video",frame)
cv.imshow("mask", mask)
c = cv.waitKey(50)
if(c==27):
break
把rgb图像三个通道分离
利用split()函数
ef split_pitcure(src): #把rgb图像三个通道分离 b,g,r=cv.split(src)
cv.imshow("blue",b)
cv.imshow("green", g)
cv.imshow("red", r)
#目前代码:
import cv2 as cv
import numpy as np
def main():
Videopath = "E:/电影/[阳光电影www.ygdy8.com].疾速特攻.BD.720p.中英双字幕.mkv"
pitcurepath = "C:/Users/POG/Pictures/Autumn is coming WallPack/Timon Studler Mod.jpg"
src = cv.imread(pitcurepath)
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE) #创建窗口
#cv.imshow("input image",src) #显示初始图片
#access_pixels(src) #获取反色图片
#inverse(src) #获取反色图片2
#video_demo(Videopath) #输出视频
#extract_object_demo(Videopath) #处理视频
#create_iamge() #创建新图片
#color_space_demo(src) #色彩空间转换
split_pitcure(src) #把rgb图像三个通道分离
cv.waitKey(0) #等待
cv.destroyAllWindows() #销毁窗口
# get_image_info(src) #输出图片信息
#cv.imwrite("D:/result.png",src) #保存图片
def get_image_info(image):#获取图像信息
print(type(image))
print(image.shape)
print(image.size)
print(image.dtype)
pixel_data = np.array(image)
print(pixel_data)
def video_demo(Videopath):#调用摄像头
capture = cv.VideoCapture(Videopath)
while(True):
ret,frame = capture.read() #一帧一帧读取
frame=cv.flip(frame,1)
# 读取视频的fps, 大小
fps=capture.get(cv.CAP_PROP_FPS)
size=(capture.get(cv.CAP_PROP_FRAME_WIDTH),capture.get(cv.CAP_PROP_FRAME_HEIGHT))
print("fps: {}\nsize: {}".format(fps,size))
# 读取视频时长(帧总数)
total = int(capture.get(cv.CAP_PROP_FRAME_COUNT))
print("[INFO] {} total frames in video".format(total))
cv.imshow("video",frame)
c = cv.waitKey(50)
if (c==27): #esc为27
break
def access_pixels(image):#获得反色图片
print(image.shape)
height = image.shape[0]
width = image.shape[1]
channels = image.shape[2] #blue , green , red
for row in range(height):
for col in range(width):
for c in range(channels):
pv = image[row,col,c]
image[row,col,c] = 255-pv
cv.imshow("pixels_demo",image)
def inverse(image):#获得反色图片2
dst = cv.bitwise_not(image)
cv.imshow("inverse_demo",image)
def create_iamge():#创建图片
img = np.zeros([400,400,3],np.uint8) #创建图片
img[ :, :, 0] = np.ones([400,400])*255 #三通道为0,1,2
cv.imshow("new",img)
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",image)
yuv=cv.cvtColor(image,cv.COLOR_BGR2YUV)
cv.imshow("yuv",image)
def extract_object_demo(Videopath): #处理视频追踪某种颜色
capture = cv.VideoCapture(Videopath)
while(True):
ret,frame=capture.read()
if ret == False:
break
#用hsv进行追踪处理
hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)
lower_hsv = np.array([37,43,46])#低值(查表)
high_hsv = np.array([77,255,255])#高值(这里只是举个例子)
mask =cv.inRange(hsv,lowerb = lower_hsv,upperb = high_hsv)
#这里就可以追踪绿色的图像
cv.imshow("video",frame)
cv.imshow("mask", mask)
c = cv.waitKey(50)
if(c==27):
break
def split_pitcure(src): #把rgb图像三个通道分离 b,g,r=cv.split(src)
cv.imshow("blue",b)
cv.imshow("green", g)
cv.imshow("red", r)
if __name__ =="__main__":
main()