**1.图像相似性计算
HSV模型
HSV颜色检测:https://www.jianshu.com/p/33af63a63a12
①色调H(Hue)
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°,。它们的补色是:黄色为60°,青色为180°,品红为300°,0°- 359°时颜色会依次变换当角度到达360°时也就是红色,角度也就又回到0°了,所以总共为360°,每变换1°时,色相就会有轻微的变化!如果是顺时针的话这个变换过程会从红色逐渐变换到绿色,在由绿色逐渐变换到蓝色,在由蓝色逐渐变换到红色!逆时针的话就是相反的!
②饱和度 S(Saturation)
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
③明度V(Value)
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;通常取值范围为0%(黑)到100%(白)。
————————————————
原文链接:https://blog.csdn.net/bjbz_cxy/article/details/79701006
step1:RGB颜色空间到HSV颜色空间的转换**
import math
import cv2
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.mlab as mlab
img = cv2.imread('~/target1.jpg',cv2.IMREAD_COLOR)
HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
step2:多维矩阵转换为向量数组
第一步我们将RGB颜色空间转换为HSV后得到的是多维的矩阵格式。而在python中,无论是画直方图还是接下来我们需要使用的欧几里得距离计算都需要向量表示。因此,在这一步我们需要对第一步获得结果进行处理,最终的表示结果是向量格式。
H, S, V = cv2.split(HSV)
aH = np.array(H).flatten()
aS = np.array(S1).flatten()
aV = np.array(V).flatten()
step3:HSV三维空间坐标计算公式
在斜边长R,底面圆半径为r,高为h的HSV圆锥体内,以地面圆心为原点,H=0为x轴正方向建立坐标轴。那么色值是(H,S,V)的点的三维坐标(x,y,z)是
x=r∗V∗S∗cosH
y=r∗V∗S∗sinH
z=h∗(1−V)
x1 = r * V1[i] * S1[i] * math.cos(H1[i] / 180.0 * math.pi);
y1 = r * V1[i] * S1[i] * math.sin(H1[i] / 180.0 * math.pi);
z1 = h * (1 - V1[i]);
完整代码:
import math
import cv2
import numpy as np
from matplotlib import pyplot as plt
import matplotlib.mlab as mlab
img1 = cv2.imread('/home/*/result/target1.jpg',cv2.IMREAD_COLOR)
HSV1 = cv2.cvtColor(img1, cv2.COLOR_BGR2HSV)
aH1, aS1, aV1 = cv2.split(HSV1)
H1 = np.array(aH1).flatten()
S1 = np.array(aS1).flatten()
V1 = np.array(aV1).flatten()
# img2 = cv2.imread('/home/*/allAreaColor/result1.jpg',cv2.IMREAD_COLOR)
img2 = cv2.imread('/home/*/localColor/result1.jpg',cv2.IMREAD_COLOR)
HSV2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
aH2, aS2, aV2 = cv2.split(HSV2)
H2 = np.array(aH2).flatten()
S2 = np.array(aS2).flatten()
V2 = np.array(aV2).flatten()
R = 100.0;
angle = 30.0;
h = R * math.cos(angle / 180 * math.pi);
r = R * math.sin(angle / 180 * math.pi);
sum = 0.0
for i in range(0, len(H1)):
x1 = r * V1[i] * S1[i] * math.cos(H1[i] / 180.0 * math.pi);
y1 = r * V1[i] * S1[i] * math.sin(H1[i] / 180.0 * math.pi);
z1 = h * (1 - V1[i]);
x2 = r * V2[i] * S2[i] * math.cos(H2[i] / 180.0 * math.pi);
y2 = r * V2[i] * S2[i] * math.sin(H2[i] / 180.0 * math.pi);
z2 = h * (1 - V2[i]);
dx = x1 - x2;
dy = y1 - y2;
dz = z1 - z2;
sum = sum + dx * dx + dy * dy + dz * dz
eucli_dean = math.sqrt(sum)
print eucli_dean
1.demo
https://wenku.baidu.com/view/75617d16346baf1ffc4ffe4733687e21af45ff8d.html
2.cv2.inrange
函数很简单,参数有三个
第一个参数:hsv指的是原图
第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0
第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0
而在lower_red~upper_red之间的值变成255,范围之外的值变成0
函数目的是将介于[lowerb, upperb]间的像素值变成 255,其他变为 0。
参数说明如下:
hsv:指的是原图,但是需要注意图像格式
lowerb:指的是图像中低于这个 lowerb 的值,图像值变为 0
upperb:指的是图像中高于这个 upperb 的值,图像值变为 0
而在 lowerb ~ lowerb 之间的值变成 255
正常读入的 BGR 图像,需要提前转换成 HSV 格式,
原文链接1(Python):https://blog.csdn.net/hihell/article/details/112794364
参考链接2(C++):https://blog.csdn.net/zhangping1987/article/details/74449630
python-opencv获取图片精确hsv的值
import cv2
import numpy as np
from matplotlib import pyplot as plt
image=cv2.imread('hsv.png')
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件
print(HSV[y,x])
cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)