基于HSV颜色的连通区域提取

基于HSV颜色的ROI区域提取

过程:

  1. 得到图像中想要提取ROI的HSV范围
  2. 通过HSV范围得到二值图像,在范围内的值变为255,不在的是0
  3. 在二值图像中找连通区域,即ROI

代码

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from skimage import measure
import matplotlib.pyplot as plt

def hsv_mask(image, lower_color, upper_color, kernel_size):
    lower = np.array(lower_color, np.uint8)
    upper = np.array(upper_color, np.uint8)
    # 得到二值图像,在lower~upper范围内的值为255,不在的值为0
    mask = cv2.inRange(image, lower, upper)
    # 进行腐蚀和膨胀
    if kernel_size:
        kernel=cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
        dilated = cv2.dilate(mask, kernel)
        eroded = cv2.erode(dilated, kernel) 
        return eroded
    else:
        return mask

if __name__ == '__main__':
    im= cv2.imread('book.jpg')
    # 模糊,消除噪声
    blur_image = cv2.GaussianBlur(im, (5, 5), 0)
    # 转换HSV颜色空间 
    hsv_image = cv2.cvtColor(blur_image, cv2.COLOR_BGR2HSV)

    # 蓝色区域的HSV值范围
    hsv_low = [105, 80, 80]
    hsv_high = [125, 180, 140]

    # 通过设置的范围,去除不要的区域
    kernel_size = (20,20)
    img = hsv_mask(hsv_image, hsv_low, hsv_high, kernel_size)

    # 找连通域
    labels = measure.label(img, connectivity=2)
    pro = measure.regionprops(labels)

    # 画矩形框
    fig, ax = plt.subplots()
    im = im[:, :, (2, 1, 0)]
    ax.imshow(im, aspect='equal')
    for region in pro:
        box = region.bbox    
        ax.add_patch(
                plt.Rectangle((box[1], box[0]),
                            box[3] - box[1],
                            box[2] - box[0], fill=False,
                            edgecolor='red', linewidth=2)
            )
    # 去除坐标
    plt.axis('off')

    #dpi是设置清晰度的,大于300就很清晰了
    plt.savefig('result.png', dpi=300)

这里写图片描述
这里写图片描述
注意:

  1. ax,plt画图的x对应图像中的列数,y对应的是行数
  2. 用plt画图,显示和保存下来的图片,四周是有边框的,是可以去掉的
  3. 找连通域
labels = measure.label(img, connectivity=2)
pro = measure.regionprops(labels)

connectivity=2表示8邻接,1是4邻接。pro是list类型,每个region有很多属性,需要可以自己去查。
例如:bbox是边界外接框,area是区域内的像素个数,centroid是区域中心坐标等等,可以通过这些属性过滤掉一些区域。

交通标志识别系统标准完全模板HSV定位基础版-HSV提取基础版.rar 本帖最后由 hcq@@ 于 2013-7-7 11:04 编辑 1、交通标志(警示牌类),其外框一般为红色,所以定位时可采用HSV颜色模型或者RGB颜色模型来提取红色区域,通过regiongroup标记进一步提取目标区域。 HSV颜色模型:I1=Hsv; %记录颜色亮度为1的数据,以便之后再利用颜色阀值找出红色 figure,imshow;title'); BW=roicolor; %利用颜色阀值将红色对象都都显示为白色,其余都为黑色,至此完成图象的二值化 figure,imshow;title; 复制代码具体参考附件HSV提取基础版.rar RGB颜色模型 IR=double; IG=double; IB=double; for i=1:chang for j=1:kuan if 1.6*IR-IG-IB255 CA=255; else CA=1.6*IR-IG-IB; end end end figure;imshow;title; 复制代码经过对比,对于目标边界清晰的图片,RGB颜色模型的效果很不错,结果在贴图中。 2、分割出来的交通标志,为了便于二值化处理,强烈建议将背景黑色转成白色,这里标准模板只处理了20几张(考虑到可能用不到这么多的模板),如果有需要,可采取灰度—二值化—反色—擦除边缘—归一化步骤,即可处理成新的模板。代码在 附件里面: 3、识别的时候,可先建立数组,和普通的识别方法一样的,识别结果可采取msgbox的显示方法(即根据返回的匹配索引,得出结果)。if x==1 msgbox;end if x==2 msgbox;end if x==3 msgbox;end if x==4 msgbox;end 。。。。。。。同理 复制代码
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值