分类目录归档:科普知识

HSL和HSV色彩空间

基本概念

HSL和HSV都是一种将RGB色彩模型中的点在圆柱坐标系中的表示法。这两种表示法试图做到比RGB基于笛卡尔坐标系的几何结构更加直观。HSL即色相、饱和度、亮度(英语:Hue, Saturation, Lightness),又称HSL。HSV即色相、饱和度、明度(英语:Hue, Saturation, Value),又称HSB,其中B即英语:Brightness。

  • H:色相是色彩的基本属性,就是平常所说的颜色名称,如红色、黄色等。
  • S:饱和度(S)是指色彩的纯度,越高色彩越纯,低则逐渐变灰,取0-100%的数值。
  • V:明度(V),亮度(L),取0-100%。

HSL和HSV二者都把颜色描述在圆柱坐标系内的点,这个圆柱的中心轴取值为自底部的黑色到顶部的白色而在它们中间的是灰色,绕这个轴的角度对应于“色相”,到这个轴的距离对应于“饱和度”,而沿着这个轴的高度对应于“亮度”,“色调”或“明度”。

这两种表示在目的上类似,但在方法上有区别。二者在数学上都是圆柱,但HSV(色相,饱和度,明度)在概念上可以被认为是颜色的倒圆锥体(黑点在下顶点,白色在上底面圆心),HSL在概念上表示了一个双圆锥体和圆球体(白色在上顶点,黑色在下顶点,最大横切面的圆心是半程灰色)。注意:尽管在HSL和HSV中“色相”指称相同的性质,它们的“饱和度”的定义是明显不同的。

HSL和HSV的色彩空间

HSL和HSV的色彩空间

为什么考虑这种色彩空间

大多数电视机、显示器、投影仪通过将不同强度的红、绿、蓝色光混合来生成不同的颜色,这就是RGB三原色的加色法。通过这种方法可以在RGB色彩空间生成大量不同的颜色,然而,这三种颜色分量的取值与所生成的颜色之间的联系并不直观。

设计者们有时偏好使用HSL或HSV而不选择三原色光模式(即RGB模型)或 印刷四分色模式(即CMYK模型),因为它类似于人类感觉颜色的方式,具有较强的感知度。RGB和CMYK分别是加法原色和减法原色模型,以原色组合的方式定义颜色,而HSV以人类更熟悉的方式封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”。

主要用途

HSV模型通常用于计算机图形应用中。在用户必须选择一个颜色应用于特定图形元素各种应用环境中,经常使用HSV 色轮。在其中,色相表示为圆环;可以使用一个独立的三角形来表示饱和度和明度。典型的,这个三角形的垂直轴指示饱和度,而水平轴表示明度。在这种方式下,选择颜色可以首先在圆环中选择色相,在从三角形中选择想要的饱和度和明度。

HSV的平面表示

HSV的平面表示

HSV模型的另一种可视方法是圆锥体。在这种表示中,色相被表示为绕圆锥中心轴的角度,饱和度被表示为从圆锥的横截面的圆心到这个点的距离,明度被表示为从圆锥的横截面的圆心到顶点的距离。某些表示使用了六棱锥体。这种方法更适合在一个单一物体中展示这个HSV色彩空间;但是由于它的三维本质,它不适合在二维计算机界面中选择颜色。

HSV的表示2

HSV的立体表示

由于HSL、HSV关于色相的划分与人眼识别是连续的,而RGB对人眼而言没那么只管,通常我们可以使用HSL、HSV进行计算机图像处理中的颜色分割,比如识别某个区域内“蓝色”系的物体等。

蓝色球体监测跟踪

蓝色球体监测跟踪

转换方式

RGB到HSL、HSV的转换

设 (r, g, b)分别是一个颜色的红、绿和蓝坐标,它们的值是在0到1之间的实数。设max等价于r, g和b中的最大者。设min等于这些值中的最小者。要找到在HSL空间中的 (h, s, l)值,这里的h ∈ [0, 360)度是角度的色相角,而s, l ∈ [0,1]是饱和度和亮度,计算为:

RGB转HSL

RGB转HSL

h的值通常规范化到位于0到360°之间。而h = 0用于max = min的(就是灰色)时候而不是留下h未定义。HSL和HSV有同样的色相定义,但是其他分量不同。HSV颜色的s和v的值定义如下:

RGB转HSV

RGB转HSV

同样,HSL、HSV也可以转换回RGB,在此不做介绍,可参考:维基百科:HSL和HSV色彩空间

程序实现

Python程序实现

程序的实现很简单,不考虑程序优化,根据公式直译即可:

# 函数名:rgb2hsv(rgb)
# 功能:RGB转换为HSV
# 输入:像素点的RGB值
# 输出:像素点的HSV值
def rgb2hsv(rgb): 
  rgbmax = max(rgb[:])
  rgbmin = min(rgb[:])
  r, g, b = rgb[:]
  h, s, v = 0

  if rgbmax == rgbmin:
    h = 0
  elif (rgbmax==r) and (g>=b):
    h = 60*(g-b)/(rgbmax-rgbmin)+0
  elif (rgbmax==r) and (g<b):
    h = 60*(g-b)/(rgbmax-rgbmin)+360
  elif rgbmax == g:
    h = 60*(b-r)/(rgbmax-rgbmin)+120
  elif rgbmax == b:
    h = 60*(r-g)/(rgbmax-rgbmin)+240

  v = rgbmax/255

  if rgbmax == 0:
    s = 0
  else:
    s = (rgbmax-rgbmin)/rgbmax
 
  hsv = [h, s, v]
  return hsv

OpenCV实现

OpenCV函数:cvtColor(src, flag)

输入:src为要进行转换的RGB图像;flag为转换参数,RGB转换HSV的参数是COLOR_RGB2HSV,也就是说通过不同的flag属性,这个函数还支持其他色彩格式的转换,详见OpenCV手册

输出:色彩格式转换后的图像。

程序示例:

# Filename: rgb2hsvbycv2.py
# 载入OpenCV模块
import cv2
# 读取一副图像
img = cv2.imread('motor.png')
# 将图像色彩格式转换为HSV
img_hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

我们在进行程序设计的时候,通常尽量去使用已经创建好的函数库,而不是自己动手来写。原因很简单,通用的函数库已经充分做了程序优化,效率更高。

OpenCV介绍

OpenCV(Open Source Computer Vision) 是一个开源的计算机视觉函数库,于1999年由Intel建立,如今由Willow Garage提供支持,可以运行在Linux、Windows和Mac OS等桌面操作系统,及Android、iOS、Maemo、BlackBerry10等移动操作系统上。

 

OpenCV

OpenCV

OpenCV的应用领域包括:

  • 人机互动
  • 物体识别
  • 图象分割
  • 人脸识别
  • 动作识别
  • 运动跟踪
  • 机器学习
  • 运动分析
  • 机器视觉
  • 结构分析

OpenCV用C++语言编写,它的主要接口也是C++,但是依然保留了大量的C接口,函数库轻量级且高效。该库也有大量的Python, Java、MATLAB/OCTAVE接口,如今又增加了对C#、Perl、Ch、Ruby的支持,实现了图像处理和计算机视觉方面丰富的通用算法。

官方网站:http://opencv.org

中文网站:http://www.opencv.org.cn

 

SSH(Secure Shell)使用

什么是SSH?

传统的网络服务程序,如ftp,pop和telnet在本质上是不安全的,因为它们使用明文传送口令和数据,很容易被冒充真正服务器的中间人修改通信数据,影响你的正常通信。

SSH可以对你的数据进行加密,所以可以防止”中间人”攻击,DNS和IP欺骗,还一个好处是它对传输数据进行了压缩,可以加快传输的速度。

现在一般使用的是OpenSSH,开源免费。官方网站:http://www.openssh.com/

SSH是如何工作的?

从客户端来看,SSH提供两种级别的安全验证:

  • 基于口令的安全验证:只要知道自己的账号和密码就可以登录远程的主机,数据也都是加密的,但不能确定的是正在连接的服务器是不是你想到登录的服务器,也有可能受到”中间人”的攻击
  • 基于密匙的安全验证:需要自己创建一对密匙,并把公用密匙放在服务器上。如果你需要连接到SSH服务器上,客户端就会向服务器端发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在服务器上找到公用密匙,再用这个密匙和你发送过来的进行比对。如果两个密匙一致,服务器就用公用密匙加密”质询”(challenge)并把它发送给客户端。客户端软件收到质询之后再用你的私人密匙进行解密再把它发给服务器。

对于控制我们的机器人,第一种方法就够了。

如何使用SSH远程登录?

Windows环境

可以使用PuTTY客户端,首先在官网下载。直接打开后输入远程主机的IP地址(也就是机器人的IP)。

putty
在登录界面输入用户名、密码,完成登录。

putty login
Linux

通常各种Linux发行版都会自带SSH客户端,可以使用ssh -V指令查看版本号,如果没安装可以通过yum或apt-get(取决你用的RedHat还是Debian衍生版)安装openssh-client。

$ ssh -V
ssh: SSH Secure Shell 3.2.9.1 (non-commercial version) on i686-pc-linux-gnu

用SSH登录到远程主机,最简单的办法就是使用ssh指令,指令格式是:ssh 主机名(IP地址)

$ ssh 192.168.1.137

当你第一次使用ssh登录远程主机时,会出现没有找到主机密钥的提示信息。输入”yes”后,系统会将远程主机的密钥加入到你的主目录下的 .ssh/hostkeys下,这样你就可以继续操作了。后面的操作跟Windows相同(因为你看到的已经是远程主机的登录界面,所以都一样)。

占空比

占空比:duty cycle是指脉冲信号的通电时间与通电周期之比。在一串理想的脉冲周期序列中(如方波),正脉冲的持续时间与脉冲总周期的比值。

占空比

占空比

在乐高EV3马达中,可以理解为使用的马达强度占最大强度的百分比。

TF-IDF

TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术, TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。

TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率。IDF的主要思想是:如果包含词条t的文档越少,IDF越大,则说明词条t具有很好的类别区分能力。

TF公式:

 \mathrm{tf_{i,j}} = \frac{n_{i,j}}{\sum_k n_{k,j}}

以上式子中 n_{i,j} 是该词在文件d_{j}中的出现次数,而分母则是在文件d_{j}中所有字词的出现次数之和。

IDF公式:

 \mathrm{idf_{i}} =  \log \frac{|D|}{|\{j: t_{i} \in d_{j}\}|}

  • |D|:语料库中的文件总数
  •  |\{ j: t_{i} \in d_{j}\}| :包含词语 t_{i} 的文件数目(即 n_{i,j} \neq 0的文件数目)如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用1 + |\{j : t_{i} \in d_{j}\}|

TF-IDF加权值

 \mathrm{tf{}idf_{i,j}} = \mathrm{tf_{i,j}} \times  \mathrm{idf_{i}}
python
import scipy as sp
def tfidf(t, d, D):
    tf = float(d.count(t)) / sum(d.count(w) for w in set(d))
    idf = sp.log(float(len(D)) / (len([doc for doc in D \
    if t in doc])))
    return tf * idf
a, abb, abc = ["a"], ["a", "b", "b"], ["a", "b", "c"]
D = [a, abb, abc]
print(tfidf("a", a, D))
print(tfidf("b", abb, D))
print(tfidf("a", abc, D))
print(tfidf("b", abc, D))
print(tfidf("c", abc, D))

最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

对于一元线性回归模型, 假设从总体中获取了n组观察值(X1,Y1),(X2,Y2), …,(Xn,Yn)。对于平面中的这n个点,可以使用无数条曲线来拟合。要求样本回归函数尽可能好地拟合这组值。综合起来看,这条直线处于样本数据的中心 位置最合理。 选择最佳拟合曲线的标准可以确定为:使总的拟合误差(即总残差)达到最小。

最小二乘法的原则是以“残差平方和最小”确定直线位置。用最小二乘法除了计算比较方便外,得到的估计量还具有优良特性。这种方法对异常值非常敏感。

 

欧几里得度量

欧几里得度量(euclidean metric)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。

一、计算公式

1. 二维空间的公式

0ρ = sqrt( (x1-x2)^2+(y1-y2)^2 ) |x| = √( x2 + y2 )

2. 三维空间的公式

0ρ = √( (x1-x2)^2+(y1-y2)^2+(z1-z2)^2 ) |x| = √( x2 + y2 + z2 )

3. n维空间的公式

n维欧氏空间是一个点集,它的每个点 X 或向量 x 可以表示为 (x[1],x[2],…,x[n]) ,其中 x[i](i = 1,2,…,n) 是实数,称为 X 的第i个坐标。

两个点 A = (a[1],a[2],…,a[n]) 和 B = (b[1],b[2],…,b[n]) 之间的距离 ρ(A,B) 定义为下面的公式:

ρ(A,B) =√ [ ∑( a[i] – b[i] )^2 ] (i = 1,2,…,n)

向量 x = (x[1],x[2],…,x[n]) 的自然长度 |x| 定义为下面的公式:

|x| = √( x[1]^2 + x[2]^2 + … + x[n]^2 )

二、实现程序(python)

import numpy as np

#定义二维空间中的两个点
x1 = np.array([0,1])
x2 = np.array([1,0])

#计算两点的欧几里得度量
dist = np.linalg.norm(x2-x1)