图像处理基础:颜色空间及其OpenCV实现

重磅干货,第一时间送达

作者:Soumyadip Sarkar

编译:ronghuaiyang

转自:AI公园

导读

对图像的颜色空间做了一个概念性的介绍,并通过代码的方式可视化了每种颜色空间的每个通道所表示的意义。

文章内容包括:

  • 什么是颜色空间?
  • 颜色空间有哪些类别?
  • 如何在OpenCV中实现?

什么是颜色空间?

颜色是一种连续的现象,它意味着有无数种颜色。但是,人类的眼睛和感知能力是有限的。所以,为了识别这些颜色,我们需要一种媒介或这些颜色的表示,这种颜色的表示被称为色彩空间。在技术术语中,一个颜色模型或颜色空间是一个特定的3-D坐标系统以及该系统中的一个子空间,其中每一种颜色都由一个单点表示。

有哪些颜色空间的类型?

目前主要有五种类型的颜色模型。但是,我将只写一些常见的(RGB、HSV和HSL)。

  1. RGB(Red Green Blue)
  2. HSL(Hue Saturation Lightness)
  3. HSV(Hue Saturation Value)
  4. YUV(Luminance, blue–luminance, red–luminance)
  5. CMYK(Cyan, Magenta, Yellow, Key)

RGB颜色空间:

RGB颜色空间是三维坐标系中红、绿、蓝坐标所表示的著名颜色空间之一。在更专业的术语中,RGB将颜色描述为由三个部分组成的元组。每个部分都可以取0到255之间的值,其中元组(0,0,0)表示黑色,元组(255,255,255)表示白色。元组的第0、第1和第2个部分分别表示红、绿、蓝的分量。

RGB颜色空间的Python实现:

这里我们导入了必要的库,cv2用于颜色空间转换,NumPy用于数组操作,Matplotlib用于显示图像,os用于访问图像目录,tqdm用于显示加载栏。

hsl_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HLS)  #### CONVERTING BGR COLOR SPACE INTO HSL COLOR SPACE  ####
hsl_img_1 = hsl_img.copy()
hsl_img_2 = hsl_img.copy()
hsl_img_3 = hsl_img.copy()
hsl_img_1[:,:,1] = 0  #### HUE --> ZERO  ####
hsl_img_1[:,:,2] = 0
hsl_img_2[:,:,0] = 0  #### SATURATION --> ZERO ####
hsl_img_2[:,:,2] = 0
hsl_img_3[:,:,0] = 0  #### LIGHTNESS --> ZERO ####
hsl_img_3[:,:,1] = 0

设置两个空列表Z和X,分别用于存储带有各自图像的标签,然后指定图像大小和路径目录。在这之后,我定义了两个函数,用于返回flower类型(assign_lable)和访问每个图像、读取和调整其大小(make_train_data)。

Z,X=[],[]IMG_SIZE=150FLOWER_SUNFLOWER_DIR='../input/flowers-recognition/flowers/flowers/sunflower'

def assign_label(img,flower_type):    return flower_type

def make_train_data(flower_type,DIR):    for img in tqdm(os.listdir(DIR)):        label=assign_label(img,flower_type)        path = os.path.join(DIR,img)        img = cv2.imread(path,cv2.IMREAD_COLOR)        img = cv2.resize(img, (IMG_SIZE,IMG_SIZE))#Resizing the image

加载图像,然后在OpenCV以BGR格式读取图像时将BGR颜色空间转换为RGB颜色空间,但Maplotlib使用RGB格式来显示图像。这就是为什么我们需要转换颜色空间后,读取图像为RGB。

然后对固定图像进行三份拷贝,并将每份拷贝的任何双色通道设为零,分别用于访问红、绿、蓝通道。如果你让第0个颜色通道都是0那么你只会得到蓝色通道。

make_train_data('Sunflower',FLOWER_SUNFLOWER_DIR)  #####Loading Sunflower Data
fix_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2RGB)    ###########CONVERTING BGR COLOR SPACE INTO RGB COLOR SPACE #########
new_img_1 = fix_img.copy() 
new_img_2 = fix_img.copy()
new_img_3 = fix_img.copy()
new_img_1[:,:,0] = 0 # making R channel zero    ####For BLUE channel#####
new_img_1[:,:,1] = 0 #making G channel zero
new_img_2[:,:,1] = 0####For RED color Channel####
new_img_2[:,:,2] = 0
new_img_3[:,:,0] = 0###For GREEN Channel####
new_img_3[:,:,2] = 0

显示图像:

f, axes = plt.subplots(1,3, figsize = (15,15))list = [new_img_1,new_img_2,new_img_3]i = 0for ax in axes:    ax.imshow(list[i])    i+=1

HSL颜色空间:

HSL的一般含义是色调、饱和度和明度。你可以将HSL以圆柱体的形式可视化,如图2(a)所示。围绕圆柱体的是不同的颜色,比如绿色、黄色、红色等等(我们真正想要的颜色)。饱和度是指颜色的多少,而明度是指颜色有多暗或多亮。正如你所看到的,圆柱体的顶部全是白色,底部全是黑色。

图2:HSL颜色空间

HSL颜色空间的Python实现:

使用OpenCV函数**cvtColor()**将BGR颜色空间转换为HSL颜色空间,在这里我们需要传递图像,以及从哪个颜色空间到哪个颜色空间我们想要改变图像。然后再复制并使两个颜色通道为零,以便分别显示每个颜色通道。

hsl_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HLS)  #### CONVERTING BGR COLOR SPACE INTO HSL COLOR SPACE  ####
hsl_img_1 = hsl_img.copy()
hsl_img_2 = hsl_img.copy()
hsl_img_3 = hsl_img.copy()
hsl_img_1[:,:,1] = 0  #### HUE --> ZERO  ####
hsl_img_1[:,:,2] = 0
hsl_img_2[:,:,0] = 0  #### SATURATION --> ZERO ####
hsl_img_2[:,:,2] = 0
hsl_img_3[:,:,0] = 0  #### LIGHTNESS --> ZERO ####
hsl_img_3[:,:,1] = 0

现在显示三个不同的颜色通道→

f, axes = plt.subplots(1,3, figsize = (15,15))list = [hsl_img_1,hsl_img_2,hsl_img_3]i = 0for ax in axes:    ax.imshow(list[i])    i+=1

HSV颜色空间:

HSV这个名字来自于颜色模型的三个坐标,即色相、饱和度和值。它也是一个圆柱形的颜色模型,圆柱体的半径表示饱和度,垂直轴表示值,角度表示色调。对于观察者,色调是占主导地位的,饱和度是混合到色调中的白光的数量,value是chrome的强度,value较低颜色变得更加类似于黑色,value越高,颜色变得更加像颜色本身。通过改变这些参数,我们可以生成不同的颜色。

图3:HSV颜色空间

HSV颜色空间的Python实现:

使用cvtColor()函数将色彩空间转换为HSV色彩空间。然后再复制并使两个通道置为零,以便分别显示每个通道。

hsv_img = cv2.cvtColor(X[0],cv2.COLOR_BGR2HSV)
hsv_img_1 = hsv_img.copy()
hsv_img_2 = hsv_img.copy()
hsv_img_3 = hsv_img.copy()
hsv_img_1[:,:,1] = 0#HUE --> ZERO
hsv_img_1[:,:,2] = 0
hsv_img_2[:,:,0] = 0#SATURATION --> ZERO
hsv_img_2[:,:,2] = 0
hsv_img_3[:,:,0] = 0#VALUE --> ZERO
hsv_img_3[:,:,1] = 0

单独显示每个颜色通道:

英文原文:https://medium.com/analytics-vidhya/image-processing-series-part1-colorspaces-836d2e3ca700

下载1:OpenCV-Contrib扩展模块中文版教程
(0)

相关推荐

  • 【从零学习OpenCV 4】颜色模型与转换

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 使用OpenCV进行颜色分割

    重磅干货,第一时间送达 在滤波.变换.缩放等任务中,图像分割具有重要的意义.图像分割是将不同的对象划分为不同的部分,并将这些区域以明显的颜色或者记号标记出来.图像分割是使用轮廓.边界框等概念进行其他高 ...

  • (一)OpenCV图像处理基础

    轮廓周围绘制矩形框和圆形框 轮廓周围绘制多边形 approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool ...

  • 图像处理基础:图像的灰度变换

    视觉/图像重磅干货,第一时间送达 新机器视觉 最前沿的机器视觉与计算机视觉技术 206篇原创内容 公众号 来源 |  字节流动 灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术 ...

  • Matlab 图像处理基础

    一.图像处理的基本操作 1.从图形文件读取图像 pic = imread('C:\Users\Good\Pictures\m.jpg'); 通过matlab自带的imread读入图像,函数内为图像的路 ...

  • OpenCV探索之路(二):图像处理的基础知识点串烧

    opencv图像初始化操作 #include<opencv2\opencv.hpp> #include<opencv2\highgui\highgui.hpp> using n ...

  • 【CV春季划】170分钟学习OpenCV与经典图像处理算法基础

    本次给大家带来的是有三AI-CV春季划组OpenCV与经典图像处理算法的直播回放,如果你还不知道有三AI-CV春季划是什么,可以看下面的视频和图文. 点击边框调出视频工具条 [CV春季划]言有三手把手 ...

  • 基于OpenCV实战的图像处理:色度分割

    重磅干货,第一时间送达 通过HSV色阶使用彩色图像可以分割来分割图像中的对象,但这并不是分割图像的唯一方法.为什么大多数人偏爱色度而不是RGB / HSV分割? 可以获得RGB / HSV通道之间的比 ...

  • 《颜色开发培训讲义》4.色度学基础:CIE-L*a*b*颜色空间

    通过第三节的介绍,了解到颜色感知三要素,下面开始介绍它应用--色度学 研究颜色测量的学科叫做色度学,色度学的任务就是用数量化来表征色觉特性. "色度"中的"度" ...

  • OpenCV图像处理教程C++(二十)轮廓发现、凸包、轮廓周围绘制圆和矩形

    轮廓发现–边缘 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓结果拓扑:就是把实体抽象成与其大小.形状无关的点,而把连接实体的线路抽象成"线&quo ...

  • (三)OpenCV图像处理

    直接 直接用霍夫直线检测,效果差; 通过图像形态学操作来寻找直线,霍夫获取位置信息与显示. #include <opencv2/opencv.hpp>#include <iostre ...