opencv学习手册(三)(线条识别)(更新中

RGB->HSV

RGB颜色分类通过三种颜色通道(R红、G绿、B蓝)的变化以及之间的叠加来得到各种各样的颜色。采用RGB方式编码,所有的颜色都可以用这三个颜色分量来表示。

这样编码方式几乎可以得到人眼能够感知到的所有颜色。但是三种颜色分量的值随着环境亮度的变化会有很大的变化。为了克服不同颜色分量在不同环境亮度下数值的波动,可以采用一种新的编码方式HSV。

HSV颜色模型使用H色调、S饱和度、V明度三种颜色参数。使用这种颜色模型的好处是亮度由V名都参数表示,H色调不受亮度而波动。

#将图像转化为HSV格式
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

opencv学习手册(三)(线条识别)(更新中_第1张图片
opencv学习手册(三)(线条识别)(更新中_第2张图片

补充资料:
从 RGB 到 HSV 的转换详细介绍
在Python中使用OpenCV将RGB格式的图像转换为HSV格式的图像
此外,根据目标颜色的HSV数值,我们设定一个HSV范围。在这个范围内的像素点是我们的目标像素点,范围之外的像素点则排除。

#设定颜色HSV数值范围
#np.array存储数组更加高效
sensitivity = 20
blue_lower = np.array([120-sensitivity,100,100])
blue_upper = np.array([120+sensitivity,255,255])

二值化

根据颜色我们找出目标线条,目标线条以外的所有物体都可以被忽略。这一步我们用1标注我们的目标,用0标注目标意外的所有物体。

#去除颜色范围外的其他颜色
img_mask = cv2.inRange(img_hsv,blue_lower,blue_upper)
cv_show(img_mask)
cv2.imwrite('IMG_MASK.jpg',img_mask)
#二值化操作
ret,img_binary = cv2.threshold(img_mask, 0, 255, cv2.THRESH_BINARY)
cv_show(img_binary)
cv2.imwrite('IMG_Bin.jpg',img_binary)

opencv学习手册(三)(线条识别)(更新中_第3张图片

碎片填补

图片经过二值化,仍然存在黑色空洞。原因是拍摄时部分位置反光严重,使图片上呈现高亮度的白色。通过判断白色区域是否为连通区域。如果是,则连通区域内包含的黑色区域也处理为白色区域。

#碎片填充
def FillHole(img,SavePath):
    im_in = img
    # 复制 im_in 图像
    im_floodfill = im_in.copy()    
    # Mask 用于 floodFill,官方要求长宽+2
    h, w = im_in.shape[:2]
    mask = np.zeros((h+2, w+2), np.uint8)    
    # floodFill函数中的seedPoint必须是背景
    isbreak = False
    for i in range(im_floodfill.shape[0]):
        for j in range(im_floodfill.shape[1]):
            if(im_floodfill[i][j]==0):
                seedPoint=(i,j)
                isbreak = True
                break
        if(isbreak):
            break
    # 得到im_floodfill
    cv2.floodFill(im_floodfill, mask, seedPoint, 255);
    # 得到im_floodfill的逆im_floodfill_inv
    im_floodfill_inv = cv2.bitwise_not(im_floodfill)
    # 把im_in、im_floodfill_inv这两幅图像结合起来得到前景
    im_out = im_in | im_floodfill_inv
    cv2.imwrite(SavePath, im_out)

opencv学习手册(三)(线条识别)(更新中_第4张图片
补充链接->python_opencv实现图像分割孔洞填充后处理

轮廓提取

透视变换

线计算

跟随控制线

你可能感兴趣的:(笔记,opencv,python)