用Opencv之颜色识别
1.以下是我的基本流程:
- 读入图像
- 图像转成HSV
- 高斯滤波
- 筛选需要识别的颜色
- 腐蚀操作
- 找出轮廓
- 画出轮廓
接下来是我的总代码:
import cv2
import numpy as np
import re
#颜色RBG取值
color = {
"blue": {"color_lower": np.array([100, 43, 46]), "color_upper": np.array([124, 255, 255])},
"red": {"color_lower": np.array([156, 43, 46]), "color_upper": np.array([180, 255, 255])},
"yellow": {"color_lower": np.array([26, 43, 46]), "color_upper": np.array([34, 255, 255])},
"green": {"color_lower": np.array([35, 43, 46]), "color_upper": np.array([77, 255, 255])},
"purple": {"color_lower": np.array([125, 43, 46]), "color_upper": np.array([155, 255, 255])},
"orange": {"color_lower": np.array([11, 43, 46]), "color_upper": np.array([25, 255, 255])}
}
def title():
print("*"*50+"颜色识别"+"*"*50)
imge = input("请输入你图片的路径:")
print('识别颜色种类有:"blue","red","yellow","green","purple","orange"')
color_0 = input("请输入你想要识别的颜色:")
return color_0,imge
def cv_show(name, img):
cv2.imshow(name, img)
cv2.waitKey(0)
cv2.destroyAllWindows()
def content(color_0, imge):
imge = cv2.imread(imge)
# imge = cv2.imread('D:\\Picture\\network\\color.jpg')
cv_show("img", imge) #展示原图
# print(img.shape)
img = cv2.cvtColor(imge, cv2.COLOR_BGR2HSV) #转成HSV
img = cv2.GaussianBlur(img, (5, 5), 0) #高斯滤波降噪,模糊图片
# img = cv2.threshold(img, 127,255, cv2.THRESH_BINARY)[1]
color_img = cv2.inRange(img, color[color_0]["color_lower"], color[color_0]["color_upper"])#筛选出符合的颜色
kernel = np.ones((3, 3), np.uint8) #核定义
color_img = cv2.erode(color_img, kernel, iterations=2) #腐蚀除去相关性小的颜色
color_img = cv2.GaussianBlur(color_img, (5, 5), 0) #模糊图像
cnts = cv2.findContours(color_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1] #找出轮廓
for cnt in cnts: #遍历所有符合的轮廓
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(imge, (x, y), (x+w, y+h), (0, 0, 255), 2)
#cv2.drawContours(imge.copy(), cnt, -1, (0, 0, 255), 2)
cv_show("img", imge) #展示处理后的图片
color_0, imge= title()
content(color_0, imge)
颜色的可以根据自己的需求增加下边界和上边界的数组或标量
2.读入图像
imge = cv2.imread(imge)
# imge = cv2.imread('D:\\Picture\\network\\color.jpg')
cv_show("img", imge) #展示原图
读入本地图片
3.图像转成HSV
img = cv2.cvtColor(imge, cv2.COLOR_BGR2HSV) #转成HSV
由于计算机对于RGB图像的饱和度不是很直观,所以需要转成HSV图像进行操作。
第一个参数是需要转换的图像;第二个参数是cv2中的内置参数。
4.高斯滤波
img = cv2.GaussianBlur(img, (5, 5), 0) #高斯滤波降噪,模糊图片
图像可能带有噪音点,需要用高斯滤波进行降噪处理,模糊图像使识别的范围更广更准确。
第一个参数是读入的图像;第二个参数是高斯核的大小,一般取奇数;第三个参数取标准差为0。
5.筛选需要识别的颜色
color_img = cv2.inRange(img, color[color_0]["color_lower"], color[color_0]["color_upper"])#筛选出符合的颜色
通过已经定好的颜色下边界的数组和上边界的数组,来识别出相应的颜色。
第一个参数是读入的图像;第二,三个参数是下上边界的数组。
6.腐蚀操作
kernel = np.ones((3, 3), np.uint8) #核定义
color_img = cv2.erode(color_img, kernel, iterations=2) #腐蚀除去相关性小的颜色
因为筛选出来的颜色有些可能在图片的毛刺部分,不是我们想要的结果,会导致误差,因此需要用腐蚀操作进行处理。
先自定义一个核kernel,第一个参数是传入的图像;第二个参数是核;第三个参数是腐蚀的次数。
7.找出轮廓
cnts = cv2.findContours(color_img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1] #找出轮廓
找出上面所操作的图像的轮廓。
第一个参数是传入的是copy()上述操作过后的图像,不加copy的话会直接在原图操作;第二个参数是cv2的内置函数,找出满足条件的外轮廓;第三个参数是cv2的内置函数,找出对应轮廓拐点信息。
8.画出轮廓
for cnt in cnts: #遍历所有符合的轮廓
x, y, w, h = cv2.boundingRect(cnt)
cv2.rectangle(imge, (x, y), (x+w, y+h), (0, 0, 255), 2)
#cv2.drawContours(imge.copy(), cnt, -1, (0, 0, 255), 2)
在原图画出矩形轮廓。
这里用到cv2.boundingRect,传入上述轮廓信息,找出矩形在图像中的位置和长宽值,接下来用到cv2.rectangle画出相应的矩形,第一个参数是原图图像;第二个参数是矩形左上角的坐标值;第三个参数是矩形右下脚的坐标值;第四个参数是线条的颜色;第五个参数是线条的粗细程度。
实际检测可能有所误差…需要做进一步改进。