想用颜色提取图像的纹理,但是图片分辨率较大,整幅图无法平铺屏幕,没办法靠鼠标点击事件输出。所以进行如下尝试获取图形的HSV值和范围。
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
与上述HSV颜色系统不同的是,如果直接使用OpenCV中cvtColor函数,并设置参数为CV_BGR2HSV,那么所得的H、S、V值范围分别是[0,180),[0,255),[0,255),而非[0,360],[0,1],[0,1];这时我们可以查下面的表格来确定颜色的大致区间。

利用print输出HSV对应的图像矩阵,注:np输出显示不全的情况,需要加上 np.set_printoptions(threshold=np.inf)
import cv2
import numpy as np
np.set_printoptions(threshold=np.inf)
img1 = cv2.imread('test1.png')
grid_RGB = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
grid_HSV = cv2.cvtColor(grid_RGB, cv2.COLOR_RGB2HSV)
print(grid_HSV)
我们处理的图像是墙面的激光图,不算复杂,所以只需要筛选出激光的HSV值就可以提取五角星图像。

从输出的矩阵中挑选图形大概对应的值。从上面一.2的表中选出大概对应的值。比如[140 7 115],可通过菜鸟工具中RGB HSV 转换器https://c.runoob.com/front-end/6214/#2e4a97输入查看对应的值是什么颜色。


不过这个方法似乎不太友好,因为得到的HSV数值和opencv中需要的不一样,所以我用图像去色器https://c.runoob.com/front-end/6214/#2e4a97
获取了RGB对应的数值,通过python转换了一下,写了一小段代码如下:

import cv2
import numpy as np
img_rgb = np.zeros([1,1,3], dtype=np.uint8)
img_rgb[0,0,0] = 232
img_rgb[0,0,1] = 108
img_rgb[0,0,2] = 168
print(img_rgb)
RGB = img_rgb
HSV = cv2.cvtColor(RGB, cv2.COLOR_BGR2HSV)
print(HSV)

这样就获取了HSV的值,我们就可以根据这个颜色范围提取图形啦
import cv2
import numpy as np
img1 = cv2.imread('test1.png')
grid_HSV = cv2.cvtColor(img1, cv2.COLOR_RGB2HSV)
lower = np.array([125, 43, 46])
upper = np.array([155, 255, 255])
HSV = cv2.inRange(grid_HSV, lower, upper)
cv2.namedWindow("HSV", 0)
cv2.imshow("HSV", HSV)
cv2.waitKey()
提取图形如下

考虑到可能是激光的光会发散的原因,所以又进行了如下尝试:
通过过S 和 V 的值进行限定得出图形 :
lower = np.array([125, 43, 220])
upper = np.array([155, 90, 255])

白色:rgb(255,255,255)
黑色:rgb(0,0,0)
红色:rgb(255,0,0)
绿色:rgb(0,255,0)
蓝色:rgb(0,0,255)
青色:rgb(0,255,255)
紫色:rgb(255,0,255)