Opencv之颜色识别

用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画出相应的矩形,第一个参数是原图图像;第二个参数是矩形左上角的坐标值;第三个参数是矩形右下脚的坐标值;第四个参数是线条的颜色;第五个参数是线条的粗细程度。
实际检测可能有所误差…需要做进一步改进。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一剑踏破邑云天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值