计算机视觉基础

来源:互联网 发布:淘宝助理连打只能2单 编辑:程序博客网 时间:2024/06/16 10:07

CV,CG与DIP

我个人理解的是计算机视觉是让计算机看懂图片和视频,进而理解其中的信息。即输入是image或video,输出是information。而cg的话是一种数据的可视化的过程,要点是将图片显示出来。输入的是数据 ,如xyz,uv,rgb信息,输出是image即二维像素数组。DIP则是对图像进行一些操作(模糊,平滑等),输入是image,输出也是image。

这里写图片描述

CV系统的构成要素

既然是视觉,那我们就可以类比我们人类。
如果我们想看到并理解一样事物,那么首先我们需要照明设备(神说要有光~),而在cv系统中这里就是光源。
其次我们需要成像设备,即视网膜。在cv系统中这里多是相机。
然后我们还需要一个处理信息的设备,即我们的大脑。在cv系统中对应的多是主机。
最后我们需要的是进行理解的逻辑,及算法系统。在我们人脑中进行这部分工作的是感知与理解能力。在cv系统中对应的是视觉处理算法。

这里写图片描述

照明模型

上面说到既然cv系统构成要素第一位的就是照明模型,也就是光源。那么这里就先简单说说有关照明模型的概念。

  • 光通量
    光通量是指人眼所能感到的辐射功率,它等于单位时间内某一波段的辐射能量与该波段的相对视见率的乘积,符号是Φ,单位是lm。1lm=0.00146瓦。
    这个的概念比较难理解,毕竟我也不是学物理的~我个人理解从直观上来说这个概念从表达的意思就是一个光源究竟亮不亮,有多亮,即一个光源发出的光的功率。
    这里写图片描述

  • 辐照度
    辐照度是指辐射到某一平面的辐射通量密度。指到达一表平面上,单位时间单位面积上的辐射能。符号是E,单位是lux。1lux=1lm/㎡
    这里写图片描述

颜色模型

先说一下三基色原理:大部分的彩色都可由适当选择的三种基色混合而成。即:
这里写图片描述

说完了三基色原理,下面来说一说RGB颜色模型和CYMK颜色模型

  • RGB颜色模型
    这个大家都非常熟悉了。如下图:
    这里写图片描述
    即红绿蓝可混合为各种颜色。黄是蓝的补色,青是红的补色,品红是绿的补色。三色都有即为白色。

  • CYMK颜色模型
    上面提到了补色的概念,所谓补色即该色和其补色构成三基色。而在生活中我们所感知的许多物体他的颜色是在光照在该物体上面后该物体吸收了某种颜色后呈现出的色彩(也就是其补色)。因此引出了CYMK颜色模型。
    这里写图片描述
    这种颜色模型的三基色是黄青和品红。三色都为即为黑色。该颜色模型多用于印刷行业。

最后说一下HSI颜色模型

  • HSI颜色模型
    H指色调 hue,描述纯色的属性。
    S指饱和度 saturation,表示纯色被白光稀释的程度的度量。
    I指亮度 intensity,表示无色的光强度的概念。
    与RGB模型的转化关系:
    这里写图片描述
    HSI理解起来稍显抽象,下面这幅图则可帮助我们较好的理解HSI模型:
    这里写图片描述
    在锥体正中的圆盘的角度代表了H分量,不同的角度对应不同的颜色,红色对应起点位置,绿色在120°,蓝色在240°。而这个圆盘从内到外则决定了其S分量,越靠内圈颜色则越发的白,越靠外圈颜色则越发鲜艳。最后椎体的轴则决定了其I分量,从下到上分别代表整体颜色从暗到亮。
    进而有HSV模型,与HSI类似,可以理解为HSI椎体的一半:
    这里写图片描述

颜色模型的OpenCV实现

主要用到cvtColor和split函数。其中(注意是python的opencv库):

  • cvtColor函数用以转换颜色模型
    第一个参数传入img,第二个参数指定目标模型,有COLOR_BGR2GRAY和COLOR_BGR2HSV两种,前者代表将图像转换为灰度模型,后者将图像转换为HSV模型。
  • split函数用以将HSI的3通道进行分离,得到一个数组,分别表示原图的H、S、I三通道。

代码如下:

import cv2path = r'D:\OpenCV\sources\samples\data\opencv-logo-white.png'img = cv2.imread(path, 1)cv2.imshow('Color Model', img)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow('GRAY', gray)hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)hsvChannels = cv2.split(hsv)cv2.imshow('HUE', hsvChannels[0])cv2.imshow('SATURATION', hsvChannels[1])cv2.imshow('VALUE', hsvChannels[2])k = cv2.waitKey(0) & 0xffcv2.destroyAllWindows()

运行结果如下:
这里写图片描述
解释一下为什么是这种效果:
左上角是原图,右上角是灰度图。注意得到的灰度图中我们感觉绿色是最亮的,而蓝色是最暗的,这是因为人眼对绿色是最敏感的,对蓝色是最不敏感的。
左下角是hue分量,原图中背景色是透明色,而opencv几个字是白色的,而白色的是不对应色度的,其分量为0,因此在图中这几个字就是黑的。而红色的色度分量对应的是起点位置,即0°,因此在图中表现出来的也是黑色。而绿色的色度是120°,蓝色是240°,因此在图中看到的蓝色比绿色要亮一些。
第二排中间是saturation分量。因为原图中红绿蓝三色都是纯色,其饱和度信息都是1,因此在图中看到的就是一样的白色。而原图中的字同样是没有饱和度信息的,即为0,因此同样在这幅图中的字就是黑的,也就是看不到的。
右下角是value分量,同样是因为原图中的红绿蓝都是纯色,因此其亮度信息均为1,且白色是有亮度信息的,即为1,因此在图中最后呈现出的即为此效果。
最后补充一个RGB转灰度的公式:
gray = R * 0.299 + G * 0.587 + B * 0.114

原创粉丝点击