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

本篇文章通过调用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 实现特定颜色线条提取与定位操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python Opencv实现图像轮廓识别功能

    本文实例为大家分享了python opencv识别图像轮廓的具体代码,供大家参考,具体内容如下 要求:用矩形或者圆形框住图片中的云朵(不要求全部框出) 轮廓检测 Opencv-Python接口中使用cv2.findContours()函数来查找检测物体的轮廓. import cv2 img = cv2.imread('cloud.jpg') # 灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化 ret, binary = cv2.th

  • python用opencv完成图像分割并进行目标物的提取

    运行平台: Windows Python版本: Python3.x IDE: Spyder 今天我们想实现的功能是对单个目标图片的提取如图所示: 图片读取 ###############头文件 import matplotlib.pyplot as plt import os import cv2 import numpy as np from PIL import Image #from skimage import io import random from PIL import Image

  • python利用opencv实现SIFT特征提取与匹配

    本文实例为大家分享了利用opencv实现SIFT特征提取与匹配的具体代码,供大家参考,具体内容如下 1.SIFT 1.1.sift的定义 SIFT,即尺度不变特征变换(Scale-invariant feature transform,SIFT),是用于图像处理领域的一种描述.这种描述具有尺度不变性,可在图像中检测出关键点,是一种局部特征描述子. 1.2.sift算法介绍 SIFT由David Lowe在1999年提出,在2004年加以完善 .SIFT在数字图像的特征描述方面当之无愧可称之为最红

  • Python Opencv提取图片中某种颜色组成的图形的方法

    主要目标识别图中红色的裂缝,尝试了几种不同的方法,最后发现比较每一点的RGB差值可以很好的解决这个问题,也就是提取图片中的红色相关信息.处理结果如下: 实现的代码如下,注意opencv读入的图片通道顺序是bgr: import cv2 import matplotlib.pyplot as plt imagepath = r'tear/11.jpg' image = cv2.imread(imagepath) height,width,channel = image.shape for i in

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

    本篇文章通过调用opencv里的函数简单的实现了对图像里特定颜色提取与定位,以此为基础,我们可以实现对特定颜色物体的前景分割与定位,或者特定颜色线条的提取与定位 主要步骤: 将RGB图像转化为HSV,H表示色调(度数表示0-180),S表示饱和度(取值0-255),V表示亮度(取值0-255),不同的颜色有着不同的取值范围,一般给出如下: 设定待提取颜色的HSV范围值,然后调用inRange函数实现对颜色空间的提取,该函数会将除目标颜色外的其余颜色为黑色背景,仅保留该颜色为前景 cv2.inRa

  • 浅谈python opencv对图像颜色通道进行加减操作溢出

    由于opencv读入图片数据类型是uint8类型,直接加减会导致数据溢出现象 (1)用Numpy操作 可以先将图片数据类型转换成int类型进行计算, data=np.array(image,dtype='int') 经过处理后(如:遍历,将大于255的置为255,小于0的置为0) 再将图片还原成uint8类型 data=np.array(image,dtype='uint8') 注意: (1)如果直接相加,那么 当像素值 > 255时,结果为对256取模的结果,例如:(240+66) % 256

  • 如何利用OpenCV进行特征(颜色、形状)提取

    目录 图像处理 1. 颜色 2. 形状 总结 图像处理 图像处理所做的只是从图像中提取有用的信息,从而减少数据量,但保留描述图像特征的像素. 下面从图像中提取颜色.形状和纹理特征的方法开始 1. 颜色 每次处理图像项目时,图像的色彩空间都会成为最先探索的地方,而我们最常用的就是RGB色彩空间.那么接下来使用OpenCV,我们可以将图像的颜色空间转换为HSV.LAB.灰度.YCrCb.CMYK等. a. HSV(色相饱和度值) 色调H:描述主波长,是指定颜色的通道 饱和度S:描述色调/颜色的纯度/

  • python opencv检测目标颜色的实例讲解

    实例如下所示: # -*- coding:utf-8 -*- __author__ = 'kingking' __version__ = '1.0' __date__ = '14/07/2017' import cv2 import numpy as np import time if __name__ == '__main__': Img = cv2.imread('example.png')#读入一幅图像 kernel_2 = np.ones((2,2),np.uint8)#2x2的卷积核

  • Opencv处理图像之轮廓提取

    本文实例为大家分享了Opencv处理图像之轮廓提取,使用cvfindContours对图像进行轮廓检测,供大家参考,具体内容如下 #include<iostream> #include<opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> int main() { IplImage* img = cvLoadImage("E:\\test.bmp",0); IplImage* img

  • python+opencv实现文字颜色识别与标定功能

    最近接了一个比较简单的图像处理的单子,花了一点时间随便写了一下: 数据集客户没有是自己随便创建的: 程序如下: """ Code creation time:September 11, 2021 Author:PanBo Realize function:It mainly realizes the recognition and calibration of fonts with different colors """ import nump

  • Python+OpenCV实现基于颜色的目标识别

    目录 任务 主要代码 效果展示 学习了一点opencv的知识于是找了个小项目来实践一下.这里先说明一下,我的实现方法不见得是最好的(因为这只是一个用于练习的项目)仅作参考,也欢迎各位大佬指正. 任务 让摄像头识别到视野范围内的气球并返回每个气球的中心点坐标. 因为场地固定,背景单一,所以省下来很多操作和处理.于是就有两种解决思路:第一种是基于气球形状做轮廓提取,只要是闭合椭圆或圆形形就认为是目标物体:第二种是基于气球颜色,只要符合目标物体的颜色就认为是目标物体. 因为摄像头是装在四足机器人(它的

  • OpenCV3.0+Python3.6实现特定颜色的物体追踪

    一.环境 win10.Python3.6.OpenCV3.x:编译器:pycharm5.0.3 二.实现目标 根据需要追踪的物体颜色,设定阈值,在视频中框选出需要追踪的物体. 三.实现步骤 1)根据需要追踪的物体颜色,设定颜色阈值,获取追踪物体的掩膜 代码:generate_threshold.py # -*- coding : utf-8 -*- # Author: Tom Yu import cv2 import numpy as np cap = cv2.VideoCapture(0)#获

  • OpenCV半小时掌握基本操作之图像基础操作

    目录 概述 截取图像 获取颜色通道 读取视频 [OpenCV]⚠️高手勿入! 半小时学会基本操作⚠️ 图像基础操作 概述 OpenCV 是一个跨平台的计算机视觉库, 支持多语言, 功能强大. 今天小白就带大家一起携手走进 OpenCV 的世界. 截取图像 例子: # 截取图像 img = cv2.imread("picture.jpg") img = img[200:600, 400:1000] cv2.imshow("cut", img) cv2.waitKey(

  • SQL Server实现将特定字符串拆分并进行插入操作的方法

    本文实例讲述了SQL Server实现将特定字符串拆分并进行插入操作的方法.分享给大家供大家参考,具体如下: --循环执行添加操作 declare @idx as int While Len(@UserList) > 0 Begin Set @idx = Charindex(',', @UserList); --只有一条数据 If @idx = 0 and Len(@UserList) > 0 Begin Insert Into BIS_MsgCenterInfo(ID,MsgID,UserI

随机推荐