你可能会想要识别图片中的某种特定颜色,比如红绿灯的识别,当你以RGB方式读取一张图片之后,想要判定颜色是十分困难的,此时可以借助另一种颜色表示形式,HSV。
正如RGB分别代表红绿蓝,HSV分别代表色相、饱和度和明度,其中如果想要区分不同颜色只需要借助色相(即第一个通道)即可,HSV可以具体表示为以下方式
(3ucky(3all / CC BY-SA (http://creativecommons.org/licenses/by-sa/3.0/)
https://commons.wikimedia.org/wiki/File:HSV_cone.png
我使用一张红绿灯的相片,检测其中红黄绿三种不同颜色的分布
Shinxenius / CC BY-SA (https://creativecommons.org/licenses/by-sa/4.0)
https://commons.wikimedia.org/wiki/File:Semaforoencendido.jpg
上代码
import cv2import numpy as npimage = cv2.imread("test.jpg", cv2.IMREAD_COLOR)image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)red_min1 = np.array([0, 15, 5])red_max1 = np.array([5, 255, 255])red_min2 = np.array([160, 15, 5])red_max2 = np.array([180, 255, 255])green_min = np.array([40, 15, 5])green_max = np.array([90, 255, 255])yellow_min = np.array([8, 15, 5])yellow_max = np.array([40, 255, 255])def detect_colour(image, colour_min, colour_max): zone = cv2.inRange(image, colour_min, colour_max) index = zone == 255 img = np.zeros_like(image) img[:] = (255, 255, 255) img[index] = image[index] return imgresult = detect_colour(image, yellow_min, yellow_max)cv2.imwrite("result-yellow.jpg", result)result = detect_colour(image, red_min1, red_max1) + detect_colour( image, red_min2, red_max2)cv2.imwrite("result-red.jpg", result)result = detect_colour(image, green_min, green_max)cv2.imwrite("result-green.jpg", result)
我们先以RGB读取图片,之后第6行将图片转换成HSV形式,8-17行我指定了几种颜色的取值范围,但是此处的范围是我自行测试调整的,可能存在不准确的状况。我定义了一个函数detect_colour来检测某个范围的图片内容,由于红色存在两个区间,所以就将两个区间分别运行,结果相加。如此运行得到的三个结果如下。
从以上结果来看,大致可以过滤出不同颜色的部份,如果要做红绿灯识别的话,需要在上面三个结果的基础上进一步加工,要达到比较高准确度的话可能还要进行形态学转换,本文就不涉及了。