首页 > 编程语言 >【Python】【OpenCV】轮廓检测

【Python】【OpenCV】轮廓检测

时间:2023-11-30 21:22:33浏览次数:43  
标签:img 阈值 Python cv2 像素 OpenCV 图像 轮廓

Code:

 1 import cv2
 2 import numpy as np
 3 
 4 img = np.zeros((200, 200), dtype=np.uint8)
 5 img[50:150, 50:150] = 255
 6 
 7 # ret, thresh = cv2.threshold(img, 127, 255, 0)
 8 contours, hierarchy = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
 9 color = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
10 img = cv2.drawContours(color, contours, -1, (0, 255, 0), 2)
11 cv2.imshow('hierarchy', img)
12 cv2.waitKey()
13 cv2.destroyAllWindows()

 

1、创建一个200x200的正方形,初始化为0的array数组,数据类型为uint8。

2、获取中心正方形,大小为100x100,并将中心区域的灰度级置为255。

 

3、对img图像进行二值化,threshold(src, threshold, maxval, type) 方法,将图像分割为目标物体和背景两部分:

  src:输入的源图像,灰度图像最常见。

  thresh:设定的阈值,用于对图像进行分割。

  maxval:当像素值超过阈值时,赋予的新的像素值。

  type:阈值化类型,包括cv2.THRESH_BINARY(大于阈值的像素设为maxval,小于阈值的像素设为0)、cv2.THRESH_BINARY_INV(大于阈值的像素设为0,小于阈值的像素设为maxval)等多种类型。

  对传入的img进行阈值化处理,0表示简单阈值化方法,即当像素点上的灰度级大于127时,则该点灰度级置为255,否则置为0。(本随笔中可以省略此段代码,但是针对其他多灰度级分布的灰度图或者彩色图这一步是必要的)

 

4、对img图像进行查找轮廓,findContours(image, mode, method) 方法,在二值图像中查找轮廓:

  image:输入的二值图像,通常为经过阈值化处理后的图像。

  mode:轮廓检索模式,指定轮廓的层次结构。可以选择的模式包括:

    cv2.RETR_EXTERNAL:只检测最外层的轮廓。

    cv2.RETR_LIST:检测所有的轮廓,并将其存储在列表中,不建立轮廓之间的等级关系。

    cv2.RETR_CCOMP:检测所有的轮廓,并将其组织为两级层次结构。顶层为连通域的外围边界,次层为连通域的内围边界。

    cv2.RETR_TREE:检测所有的轮廓,并将其组织为树形结构。

  method:轮廓的近似方法。可以选择的方法包括:

    cv2.CHAIN_APPROX_NONE:保存所有的轮廓点。

    cv2.CHAIN_APPROX_SIMPLE:仅保存轮廓的端点,例如一个矩形框的四个角点。

    cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS:使用 Teh-Chinl chain 近似算法进行轮廓压缩。

  函数的返回值包括两部分:

    contours:轮廓的坐标信息,以列表形式返回。每个轮廓都是一个由点坐标构成的数组。

    hierarchy:轮廓的层次结构信息,以多维数组形式返回。

 

5、将img转换成BGR图像。

6、绘画轮廓,drawContours() 方法:

  image:输入的图像,可以是彩色图像或灰度图像。

  contours:要绘制的轮廓,通常是通过 findContours 函数获取到的轮廓列表。

  contourIdx:指定要绘制的轮廓在列表中的索引。如果设置为 -1,则绘制所有的轮廓。

  color:轮廓线的颜色,可以是一个三元组 (B, G, R) 表示的颜色值。

  thickness:轮廓线的厚度,如果设置为 -1,则填充轮廓内部。

 

标签:img,阈值,Python,cv2,像素,OpenCV,图像,轮廓
From: https://www.cnblogs.com/vangoghpeng/p/17868336.html

相关文章

  • Python 内置方法
    【一】整型1.1-十进制转二进制bin()num=20print(bin(num))#0b101001.2-十进制转八进制oct()num=30print(oct(num))#0o361.3-十进制转十六进制hex()num=40print(hex(num))#0x281.4-非进制转十进制:int()hex1=0x28print(int(hex1))......
  • Python批量修改文件名
    '''pythonimportos,sys#导入模块fromitertoolsimportgroupbyfromos.pathimportsplitextifname=='main':path=r'C:\C1Files'#运行程序前,记得修改主文件夹路径!old_names=os.listdir(path)#取路径下的文件名,生成列表,这个获取的时候可能会出现未获取全......
  • python内置方法
    【整型的内置方法】 【浮点型】 【数字类型判断】 【字符串】   【列表类型】  ......
  • 代码随性训练营第四十九天(Python)| 121. 买卖股票的最佳时机 、122.买卖股票的最佳时机I
    121.买卖股票的最佳时机1、动态规划classSolution:defmaxProfit(self,prices:List[int])->int:#dp[i][0]代表第i天持有股票获取的最大利益#dp[i][1]代表第i天不持有股票获取的最大利益dp=[[0]*2for_inrange(len(prices)......
  • 代码随性训练营第四十八天(Python)| 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III
    198.打家劫舍1、动态规划classSolution:defrob(self,nums:List[int])->int:#dp数组代表在第i个房间可以偷窃到的最高金额为dp[i]dp=[0]*len(nums)iflen(nums)==1:returnnums[0]iflen(nums)==2:......
  • Python中异常处理
    一、错误与异常简述Python有两种错误很容易辨认:语法错误和异常。Pythonassert(断言)用于判断一个表达式,在表达式条件为false的时候触发异常。二、语法错误Python的语法错误或者称之为解析错,是初学者经常碰到的,如下实例>>>whileTrueprint('Helloworld') File"<std......
  • Python中的文件读写
    一、文件读写1、open()方法Pythonopen()方法用于打开一个文件,并返回文件对象。在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出OSError。注意:使用open()方法一定要保证关闭文件对象,即调用close()方法。open()函数常用形式是接收两个参数:文件名......
  • Python 将文本转换成语音
    #coding:utf-8#pipinstallpyttsx3importpyttsx3aspyttsxtext='Icanbecauseithinkican.逆境清醒Lifeisnotallroses.人生并不是康庄大道。'engine=pyttsx.init()engine.say(text)#engine.setProperty('rate',100)#设置语速#engine.setPr......
  • 代码随性训练营第四十六天(Python)| 139.单词拆分 、多重背包
    139.单词拆分classSolution:defwordBreak(self,s:str,wordDict:List[str])->bool:dp=[False]*(len(s)+1)dp[0]=True#求排列先遍历背包再遍历物品foriinrange(len(s)+1):forjinrange(i):......
  • 软件测试/人工智能|教你轻松掌握Python输入与输出
    简介Python是一种流行的编程语言,它具有简洁而强大的输入输出功能,允许开发者与用户交互并显示结果。本文将介绍Python中的输入和输出方法。输入(Input)Python中获取用户输入的常用方法是使用input()函数。这个函数允许程序暂停执行,等待用户输入内容,并将输入的内容作为字符串返回......