opencv 实现特定颜色线条提取与定位操作


Posted in Python onJune 02, 2020

本篇文章通过调用opencv里的函数简单的实现了对图像里特定颜色提取与定位,以此为基础,我们可以实现对特定颜色物体的前景分割与定位,或者特定颜色线条的提取与定位

主要步骤:

将RGB图像转化为HSV,H表示色调(度数表示0-180),S表示饱和度(取值0-255),V表示亮度(取值0-255),不同的颜色有着不同的取值范围,一般给出如下:

设定待提取颜色的HSV范围值,然后调用inRange函数实现对颜色空间的提取,该函数会将除目标颜色外的其余颜色为黑色背景,仅保留该颜色为前景

cv2.inRange(hsv, lower_red, upper_red)

参数解析:

第一个参数:hsv指的是原图

第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0

第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0

而在lower_red~upper_red之间的值变成255

二值化

腐蚀与膨胀操作,去除噪点,连接断点

调用findContours函数进行轮廓检测

cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图)

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

参数解析

第一个参数是寻找轮廓的图像;

第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

cv2.RETR_EXTERNAL表示只检测外轮廓

cv2.RETR_LIST检测的轮廓不建立等级关系

cv2.RETR_CCOMP建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。

cv2.RETR_TREE建立一个等级树结构的轮廓。

第三个参数method为轮廓的近似办法

cv2.CHAIN_APPROX_NONE存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1

cv2.CHAIN_APPROX_SIMPLE压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS使用teh-Chinl chain 近似算法

返回值

cv2.findContours()函数返回三个值,一个是图像,一个是轮廓本身,还有一个是每条轮廓对应的属性。

对于轮廓是以坐标的形式返回,可以通过函数cv2.drawContours()绘制出轮廓

绘制矩形区域对轮廓进行定位

主要代码如下:

import numpy as np
import cv2
import os
image = 'image1.jpg'
savefile = './mark1'
# image = os.listdir(image_file)
save_image = os.path.join(savefile, image)

#设定颜色HSV范围,假定为红色
redLower = np.array([156, 43, 46])
redUpper = np.array([179, 255, 255])

#读取图像
img = cv2.imread(image)

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

#去除颜色范围外的其余颜色
mask = cv2.inRange(hsv, redLower, redUpper)

# 二值化操作
ret, binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY)

#膨胀操作,因为是对线条进行提取定位,所以腐蚀可能会造成更大间隔的断点,将线条切断,因此仅做膨胀操作
kernel = np.ones((5, 5), np.uint8)
dilation = cv2.dilate(binary, kernel, iterations=1)

#获取图像轮廓坐标,其中contours为坐标值,此处只检测外形轮廓
_, contours, hierarchy = cv2.findContours(dilation, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

if len(contours) > 0:
  #cv2.boundingRect()返回轮廓矩阵的坐标值,四个值为x, y, w, h, 其中x, y为左上角坐标,w,h为矩阵的宽和高
  boxes = [cv2.boundingRect(c) for c in contours]
  for box in boxes:
    x, y, w, h = box
    #绘制矩形框对轮廓进行定位
    cv2.rectangle(img, (x, y), (x+w, y+h), (153, 153, 0), 2)
	#将绘制的图像保存并展示
	cv2.imwrite(save_image, img)
	cv2.imshow('image', img)
	cv2.waitKey(0)
	cv2.destroyAllWindows()

效果如图,一试卷红色批改字样为例:

原图:

opencv 实现特定颜色线条提取与定位操作

对批改区域定位图:

opencv 实现特定颜色线条提取与定位操作

以上这篇opencv 实现特定颜色线条提取与定位操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用python + openpyxl处理excel2007文档思路以及心得
Jul 14 Python
python flask 多对多表查询功能
Jun 25 Python
Python编程把二叉树打印成多行代码
Jan 04 Python
Python堆排序原理与实现方法详解
May 11 Python
Python中使用Counter进行字典创建以及key数量统计的方法
Jul 06 Python
python找出完数的方法
Nov 12 Python
python 实现一次性在文件中写入多行的方法
Jan 28 Python
numpy下的flatten()函数用法详解
May 27 Python
Python如何优雅获取本机IP方法
Nov 10 Python
python实现猜拳游戏项目
Nov 30 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
秀!学妹看见都惊呆的Python小招数!【详细语言特性使用技巧】
Apr 27 Python
Python爬虫入门有哪些基础知识点
Jun 02 #Python
Python实现进度条和时间预估的示例代码
Jun 02 #Python
python爬虫容易学吗
Jun 02 #Python
基于Python词云分析政府工作报告关键词
Jun 02 #Python
使用OpenCV获取图像某点的颜色值,并设置某点的颜色
Jun 02 #Python
如何利用python web框架做文件流下载的实现示例
Jun 02 #Python
python3+opencv 使用灰度直方图来判断图片的亮暗操作
Jun 02 #Python
You might like
php strstr查找字符串中是否包含某些字符的查找函数
2010/06/03 PHP
JSON字符串传到后台PHP处理问题的解决方法
2016/06/05 PHP
Laravel Intervention/image图片处理扩展包的安装、使用与可能遇到的坑详解
2017/11/14 PHP
PHPStorm 2020.1 调试 Nodejs的多种方法详解
2020/09/17 NodeJs
网页的标准,IMG不支持onload标签怎么办
2006/06/29 Javascript
用Javascript数组处理多个字符串的连接问题
2009/08/20 Javascript
jQuery ready函数滥用分析
2011/02/16 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
javascript操作数组详解
2014/12/17 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
快速获取/设置iframe内对象元素的几种js实现方法
2016/05/20 Javascript
详解Vue方法与事件
2017/03/09 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
在Vue中实现随hash改变响应菜单高亮
2020/03/09 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
详解JavaScript中的链式调用
2020/11/27 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
Python 抓取动态网页内容方案详解
2014/12/25 Python
python MySQLdb Windows下安装教程及问题解决方法
2015/05/09 Python
Python文件处理
2016/02/29 Python
python实现装饰器、描述符
2018/02/28 Python
Python实现的NN神经网络算法完整示例
2018/06/19 Python
美国电视购物:QVC
2017/02/06 全球购物
澳大利亚礼品卡商店:Gift Card Store
2019/06/24 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
高中毕业自我鉴定
2013/12/19 职场文书
体育运动口号
2014/06/09 职场文书
学习焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
旷课检讨书500字
2014/10/14 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
世界文化遗产导游词
2015/02/13 职场文书
Redis字典实现、Hash键冲突及渐进式rehash详解
2021/09/04 Redis
深入解析MySQL索引数据结构
2021/10/16 MySQL
AudioContext 实现音频可视化(web技术分享)
2022/02/24 Javascript