教程3_图像的轮廓

news2024/11/20 14:37:57

目录

目标

1. 特征矩

2、轮廓质心

3. 轮廓面积

4. 轮廓周长

5. 轮廓近似

6. 轮廓凸包

7. 边界矩形

7.1.直角矩形

7.2. 旋转矩形

8. 最小闭合圈

9. 拟合一个椭圆

10. 拟合直线


目标

        在本文中,我们将学习 - 如何找到轮廓的不同特征,例如面积,周长,质心,边界框等。 - 您将看到大量与轮廓有关的功能。

1. 特征矩

        特征矩可以帮助您计算一些特征,例如物体的质心,物体的面积等。请查看特征矩上的维基百科页面。函数 cv.moments() 提供了所有计算出的矩值的字典。见下文:

import numpy as np
import cv2 as cv
img = cv.imread('star.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
contours,hierarchy = cv.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv.moments(cnt)
print( M )

        从这一刻起,您可以提取有用的数据,例如面积,质心等。

2、轮廓质心

        质心由关系给出,cx=M10/M00 和 cy=M01/M00。可以按照以下步骤进行,第一个示例为简单的检测单个轮廓,第二个示例能检测图片中的多个轮廓。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

print('轮廓的质心坐标为:(%d,%d) '%cx %cy)
import cv2  
import numpy as np  
  
# 读取图像  
image = cv2.imread('7.jpg')  
  
# 转换为灰度图像  
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)  
  
# 应用阈值来获取二值图像  
_, thresholded = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)  
  
# 查找轮廓  
contours, _ = cv2.findContours(thresholded, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  
  
# 遍历每个轮廓  
for contour in contours:  
    # 计算轮廓的矩  
    M = cv2.moments(contour)  
      
    # 检查矩是否存在(轮廓不为空)  
    if M["m00"] != 0:  
        # 计算质心  
        cX = int(M["m10"] / M["m00"])  
        cY = int(M["m01"] / M["m00"])  
          
        # 在图像上绘制质心  
        cv2.circle(image, (cX, cY), 5, (255, 0, 0), -1)  
        cv2.putText(image, "centroid", (cX - 25, cY - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)  
  
# 显示结果图像  
cv2.imshow('Image with Centroids', image)  
cv2.waitKey(0)  
cv2.destroyAllWindows()

3. 轮廓面积

        轮廓区域由函数 cv.contourArea() 或从矩 M['m00'] 中给出。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

area = cv.contourArea(cnt) 

4. 轮廓周长

        也称为弧长。可以使用 cv.arcLength() 函数找到它。第二个参数指定形状是闭合轮廓(True)还是曲线。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

perimeter = cv.arcLength(cnt,True)

5. 轮廓近似

        根据我们指定的精度,它可以将轮廓形状近似为顶点数量较少的其他形状。它是Douglas-Peucker算法的实现。检查维基百科页面上的算法和演示。

        为了理解这一点,假设您试图在图像中找到一个正方形,但是由于图像中的某些问题,您没有得到一个完美的正方形,而是一个“坏形状”(如下图所示)。现在,您可以使用此功能来近似形状。在这种情况下,第二个参数称为epsilon,它是从轮廓到近似轮廓的最大距离。它是一个精度参数。需要正确选择epsilon才能获得正确的输出。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

epsilon = 0.1*cv.arcLength(cnt,True) 
approx = cv.approxPolyDP(cnt,epsilon,True)

        在第二张图片中,绿线显示了ε=弧长的10%时的近似曲线。第三幅图显示了ε=弧长度的1%时的情况。第三个参数指定曲线是否闭合。 

6. 轮廓凸包

        凸包外观看起来与轮廓逼近相似,但不相似(在某些情况下两者可能提供相同的结果)。在这里,cv.convexHull()函数检查曲线是否存在凸凹缺陷并对其进行校正。一般而言,凸曲线是始终凸出或至少平坦的曲线。如果在内部凸出,则称为凸度缺陷。例如,检查下面的手的图像。红线显示手的凸包。双向箭头标记显示凸度缺陷,这是凸包与轮廓线之间的局部最大偏差。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

hull = cv.convexHull(cnt) 

        但是,如果要查找凸度缺陷,则需要传递returnPoints = False。为了理解它,我们将拍摄上面的矩形图像。首先,我发现它的轮廓为cnt。现在,我发现它的带有returnPoints = True的凸包,得到以下值:[[[234 202]],[[51 202]],[[51 79]],[[234 79]]],它们是四个角 矩形的点。现在,如果对returnPoints = False执行相同的操作,则会得到以下结果:[[129],[67],[0],[142]]。这些是轮廓中相应点的索引。例如,检查第一个值:cnt [129] = [[234,202]]与第一个结果相同(对于其他结果依此类推)。

7. 边界矩形

有两种类型的边界矩形。

7.1.直角矩形

        它是一个矩形,不考虑物体的旋转。所以边界矩形的面积不是最小的。它是由函数cv.boundingRect()找到的。

        令(x,y)为矩形的左上角坐标,而(w,h)为矩形的宽度和高度。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )


x,y,w,h = cv.boundingRect(cnt)
cv.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
7.2. 旋转矩形

        这里,边界矩形是用最小面积绘制的,所以它也考虑了旋转。使用函数是 cv.minAreaRect()。它返回一个Box2D结构,其中包含以下细节 -(中心(x,y),(宽度,高度),旋转角度)。但要画出这个矩形,我们需要矩形的四个角。它由函数 cv.boxPoints() 获得:

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )


rect = cv.minAreaRect(cnt)
box = cv.boxPoints(rect)
box = np.int0(box)
cv.drawContours(img,[box],0,(0,0,255),2)

        两个矩形都显示在一张单独的图像中。绿色矩形显示正常的边界矩形。红色矩形是旋转后的矩形。

8. 最小闭合圈

        接下来,使用函数 cv.minEnclosingCircle() 查找对象的圆周。它是一个以最小面积完全覆盖物体的圆。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

(x,y),radius = cv.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
cv.circle(img,center,radius,(0,255,0),2)

 

9. 拟合一个椭圆

        下一个是把一个椭圆拟合到一个物体上。它返回内接椭圆的旋转矩形。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

ellipse = cv.fitEllipse(cnt)
cv.ellipse(img,ellipse,(0,255,0),2)

 

10. 拟合直线

        同样,我们可以将一条直线拟合到一组点。下图包含一组白点。我们可以近似一条直线。

import numpy as np
import cv2 as cv

img = cv.imread('star.jpg',0)

ret,thresh = cv.threshold(img,127,255,0)

contours,hierarchy = cv.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv.moments(cnt)
print( M )

rows,cols = img.shape[:2]
[vx,vy,x,y] = cv.fitLine(cnt, cv.DIST_L2,0,0.01,0.01)
lefty = int((-x*vy/vx) + y)
righty = int(((cols-x)*vy/vx)+y)
cv.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

12. 长宽比

        它是对象边界矩形的宽度与高度的比值。

x,y,w,h = cv.boundingRect(cnt)
aspect_ratio = float(w)/h

12. 范围

        范围是轮廓区域与边界矩形区域的比值。

area = cv.contourArea(cnt)
x,y,w,h = cv.boundingRect(cnt)
rect_area = w*h
extent = float(area)/rect_area

13. 坚实度

        坚实度是等高线面积与其凸包面积之比。

area = cv.contourArea(cnt)
hull = cv.convexHull(cnt)
hull_area = cv.contourArea(hull)
solidity = float(area)/hull_area

14. 等效直径

        等效直径是面积与轮廓面积相同的圆的直径。

area = cv.contourArea(cnt)
equi_diameter = np.sqrt(4*area/np.pi)

15. 取向

        取向是物体指向的角度。以下方法还给出了主轴和副轴的长度。

(x,y),(MA,ma),angle = cv.fitEllipse(cnt)

16. 掩码和像素点

        在某些情况下,我们可能需要构成该对象的所有点。可以按照以下步骤完成:

mask = np.zeros(imgray.shape,np.uint8)
cv.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv.findNonZero(mask)

        这里提供了两个方法,一个使用Numpy函数,另一个使用OpenCV函数(最后的注释行)。结果也是一样的,只是略有不同。Numpy给出的坐标是(行、列)格式,而OpenCV给出的坐标是(x,y)格式。所以基本上答案是可以互换的。注意,row = x, column = y

17. 最大值,最小值和它们的位置

        我们可以使用掩码图像找到这些参数。

min_val, max_val, min_loc, max_loc = cv.minMaxLoc(imgray,mask = mask)

18. 平均颜色或平均强度

        在这里,我们可以找到对象的平均颜色。或者可以是灰度模式下物体的平均强度。我们再次使用相同的掩码进行此操作。

mean_val = cv.mean(im,mask = mask)

19. 极端点

        极点是指对象的最顶部,最底部,最右侧和最左侧的点。

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

        例如,如果我将其应用于印度地图,则会得到以下结果: 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1547366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API网关-Apisix路由配置教程(数据编辑器方式)

文章目录 前言一、端口修改1. apisix 端口修改2. dashboard 端口修改3. 登录密码修改 二、常用插件介绍1. 常用转换插件1.1 proxy-rewrite插件1.1.1 属性字段1.1.2 配置示例 2. 常用认证插件2.1 key-auth插件2.1.1 消费者端字段2.1.2 路由端字段2.1.3 配置示例 2.2 basic-auth插…

工作多年,如何从 CRUD Boy 转型为分布式系统架构师?解锁分布式系统的艺术:从零开始理解分布式系统架构与设计原理!...

编程是一门艺术,它的魅力在于创造。 65 哥已经工作5年了,一直做着简单重复的编程工作,活活熬成了一个只会 CRUD 的打工 boy。 65 哥:总是听大佬讲分布式分布式,什么才是分布式系统呢? 分布式系统是一个硬件…

PyCharm Pro 2023 for Mac/Win:打造极致Python开发体验

在数字化浪潮席卷全球的今天,Python已成为众多开发者手中的利器。无论是数据分析、机器学习还是Web开发,Python都以其简洁易懂的语法和强大的功能库赢得了广泛好评。而在这个高效编程的时代,一款出色的Python开发工具,无疑能让开发…

基于word2vec+LSTM模型实现百度贴吧恶意评论预测

大家好,我是带我去滑雪! Word2Vec模型能够将词语映射到高维空间中的向量表示,同时保留了词语之间的语义信息和上下文关系。这使得模型能够更好地理解评论中的语境和含义。LSTM模型是一种适用于处理序列数据的深度学习模型,能够有效…

鸡兔同笼问题:利用Scratch C/C++ Python解决

文章目录: 一:问题 二:解决办法 1.通过Scratch解决 2.通过C/C解决 3.通过Python解决 一:问题 该问题大约在1500年前的《孙子算经》中就有记载:“今有雉兔同笼,上有三十五头,下有九十四足&…

【数字图像处理】改变图像灰度级别

改变图像灰度级别 首先,对原始图像 O O O进行灰度级量化: q int ⁡ ( O 2 i ) 2 i , q\operatorname{int}\left(\frac{O}{2^{i}}\right) \times 2^{i}, qint(2iO​)2i, 灰度级别256,128,64,32,16,8&…

百度蜘蛛池,权重蜘蛛池,泛站蜘蛛池,shell蜘蛛池-权重蜘蛛池

蜘蛛池的作用及其类型 蜘蛛池的主要作用是加速搜索引擎蜘蛛对网站链接的爬取,从而实现快速收录。使用权重蜘蛛池可以提高搜索引擎蜘蛛对网站链接的权重评价,实现秒收效果和发布外链的目的。常见的蜘蛛池有百度蜘蛛池、搜狗蜘蛛池和谷歌蜘蛛池等。 本文…

blog-engine-06-pelican 静态网站生成 windows11 安装实战笔记

拓展阅读 blog-engine-01-常见博客引擎 jekyll/hugo/Hexo/Pelican/Gatsby/VuePress/Nuxt.js/Middleman 对比 blog-engine-02-通过博客引擎 jekyll 构建 github pages 博客实战笔记 blog-engine-02-博客引擎jekyll-jekyll 博客引擎介绍 blog-engine-02-博客引擎jekyll-jekyl…

python安装与使用

1安装 1.0下载 从官网下载安装包欢迎来到 Python.orghttps://www.python.org/ 1.1安装 双击安装包 将 图中选项勾选 之后如图 在点击 等待安装,安装之后关闭(Close) 2实现第一个python程序 2.0打开python运行环境 安装之后在开始菜单…

使用小皮【phpstudy】运行Vue+MySql项目

现在的情况是我扒到了一个开源的项目,现在想要实现一下前端对应的功能,后端是完备的,但是需要调用数据库将数据跑起来,这里可以使用到MySql数据库,这里我还发现了一个比较好用的软件小皮【phpStudy】 官网 一 安装软件…

LabVIEW智能家居安防系统

LabVIEW智能家居安防系统 随着科技的飞速发展和人们生活水平的不断提升,智能家居系统以其便利性和高效性,逐渐成为现代生活的新趋势。智能家居安防系统作为智能家居系统的重要组成部分,不仅能够提高家庭的安全性,还能为用户提供更…

Kubernetes示例yaml:1. service-deployment.yaml

service-deployment.yaml 示例 apiVersion: apps/v1 kind: Deployment metadata:name: example-plusnamespace: aaaalabels:app: example-prdapp_unit: AAAA-EXAMPLE spec:replicas: 2selector:matchLabels:app: example-prdtemplate:metadata:labels:app: example-prdapp_uni…

Leetcode 3.26

Leetcode Hot 100 一级目录1.每日温度 堆1.数组中的第K个最大元素知识点:排序复杂度知识点:堆的实现 2.前 K 个高频元素知识点:优先队列 一级目录 1.每日温度 每日温度 思路是维护一个递减栈,存储的是当前元素的位置。 遍历整个…

结构体初阶+进阶 系统化的学习

结构体 什么是结构体 结构体是一种用户自定义的数据类型,可以组合多个相关值成为一个单一类型。它是由一批数据组合而成的结构型数据,结构体可以包含多个不同类型的字段,如基本数据类型、其他结构体、枚举类型等。在Rust中,结构…

Warning logs 2024-03-26

配置tomcat中的server.xml时遇到问题&#xff0c;会导致tomcat启动闪退。 server.xml文件如下&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!--Licensed to the Apache Software Foundation (ASF) under one or morecontributor lice…

PHPCMS v9城市分站插件

PHPCMS自带的有多站点功能&#xff0c;但是用过的朋友都知道&#xff0c;自带的多站点功能有很多的不方便之处&#xff0c;例如站点栏目没法公用&#xff0c;每个站点都需要创建模型、每个站点都需要单独添加内容&#xff0c;还有站点必须静态化。如果你内容很多这些功能当然无…

【Frida】【Android】02_JAVA层HOOK

&#x1f6eb; 系列文章导航 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446【Frida】【Android】03_RPC https://bl…

【C语言】三种方法模拟实现 strlen 函数

前言 这篇文章将要带我们去实现模拟一个stelen()函数 首先我们要知道strlen()函数的定义 strlen()定义和用法 我们先看一下strlen在cplusplus网站中的定义 链接: 点击跳转 这里我们可以知道strlen的用法 size_t strlen ( const char * str );获取字符串长度 返回 C 字符串…

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…

搭建 Apple Mac M1 stm32 开发环境

近期想学习 stm32 开发,看了些书和视频,买了开发板。开发板到了后就迫不及待的的进行尝试。由于我目前使用的电脑是 Apple M1 Pro,目前用的比较多的是 windows + keil。我先是在 mac 使用虚拟机,安装 win 环境来使用,但是我分别使用了 VMware 和 parallels desktop ,keil…