轮廓检测

  • 图像金字塔

    上采样,图像变大一倍,矩阵用0填充

img = cv2.imread('1,jpg')
cv_show('img',img)
up = cv2.pyrUp(img)
cv_show('up',up)

下采样,图像缩小一倍 删除矩阵偶数行偶数列

img = cv2.imread('1.jpg')
cv_show('img',img)
down = cv2.pyrDown(img)
cv_show('down',down)

  • 拉普拉斯金字塔

对图像G先down得到G_d,再G_d进行up得到G_d_u,然后对G_d_u先down再up,反复这个过程直到某一点结束

down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
l_l = img - down_up
cv_show('l_l',l_l)


  • 轮廓检测

  进行轮廓检测 先使图像变成灰度图,再进行二值化处理,再利用cv2.findContours()进行轮廓检测,再利用    cv2.drawContours()画出轮廓

1.cv2.findContours(二值化图像,轮廓检索方式,轮廓近似方式)

    轮廓检索方式:一般使用cv2.RETR_TREE

cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系
cv2.RETR_CCOMP 建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息
cv2.RETR_TREE 建立一个等级树结构的轮廓

  轮廓近似方式:

cv2.CHAIN_APPROX_NONE 存储所有边界点
cv2.CHAIN_APPROX_SIMPLE 压缩垂直、水平、对角方向,只保留端点
cv2.CHAIN_APPROX_TX89_L1 使用teh-Chini近似算法
cv2.CHAIN_APPROX_TC89_KCOS 使用teh-Chini近似算法

  cv2.findContours在Opencv3里有三个返回值:输入的二值化图像,图像的轮廓,轮廓的层析结构(本身包含两个                          ndarray,每个ndarray对应一个轮廓,每个轮廓有四个属性)

  cv2.findContours在Opencv2、Opencv4里有两个返回值:图像的轮廓,轮廓的层析结构

2.cv2.drawContours(原始图像,轮廓,轮廓的索引(当设置为-1时,绘制所有轮廓),画笔颜色,画笔大小)

cv2.drawContours返回值是绘制轮廓后的图像,注意原图像会变化,如果不想让原图变化的话可以copy一份

img = cv2.imread('TX.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
thresh,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show('res',res)

  轮廓特征

#轮廓特征
cnt = contours[0]
#面积
a = cv2.contourArea(cnt)
print(a)
#周长 True表闭合
L = cv2.arcLength(cnt,True)
print(L)

  轮廓近似

  cv2.approxPolyDP() 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合

  参数有3个:

  InputArray curve:输入曲线,数据类型可以为vector<Point>。

  double epsilon:判断点到相对应的line segment 的距离的阈值。(距离大于此阈值则舍弃,小于此阈值则保留,           epsilon越小,折线的形状越“接近”曲线。)

  bool closed:曲线是否闭合的标志位。

#利用周长做阈值进行轮廓近似
epsilon = 0.02 * cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)


  • 外接矩形

  利用cv2.boundingRec(cnt)返回cnt的外接矩形的左上点坐标和宽w和高h,再利用cv2.rectangle()画出外接矩形

  cv2.rectangle()有五个参数:图像,(x,y)左上角坐标,(x+w,y+h)右下角坐标,画笔颜色,画笔粗细

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
cv_show('img',img)

OpenCv基础_三的更多相关文章

  1. OpenCv基础_一

    图片的读取和展示 import cv2 img = cv2.imread('1.jpg') cv2.imshow('img',img) cv2.waitKey(0) cv2.destroyAllWin ...

  2. OpenCv基础_四

    Harris角点检测 理解 内部点:蓝框所示,无论滑动窗口水平滑动还是竖直滑动,框内像素值都不会发生大的变化 边界点:黑框所示,滑动窗口沿着某一个方向滑动框内像素点不会发生大的改变,但是沿着另一个方向 ...

  3. OpenCV基础_二

    阈值和平滑处理 cv2.threshold()二值化函数 ret,thresh = cv2.threshold(src, thresh, maxval, type[, dst]) 参数 src:所要进 ...

  4. RequireJS基础(三)

    这篇来写一个具有依赖的事件模块event. event提供三个方法bind.unbind.trigger来管理DOM元素事件. event依赖于cache模块,cache模块类似于jQuery的$.d ...

  5. Swift语法基础入门三(函数, 闭包)

    Swift语法基础入门三(函数, 闭包) 函数: 函数是用来完成特定任务的独立的代码块.你给一个函数起一个合适的名字,用来标识函数做什么,并且当函数需要执行的时候,这个名字会被用于“调用”函数 格式: ...

  6. java 基础知识三 java变量

    java  基础知识 三 变量 1.作用域 {} 包围起来的代码 称之为代码块,在块中声明的变量只能在块中使用 2.常量 就是固定不变的量,一旦被定义,它的值就不能再被改变. 3.变量 变量必须在程序 ...

  7. 什么是图像 -- opencv基础

    opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像: ...

  8. python基础_格式化输出(%用法和format用法)(转载)

    python基础_格式化输出(%用法和format用法) 目录 %用法 format用法 %用法 1.整数的输出 %o -- oct 八进制%d -- dec 十进制%x -- hex 十六进制 &g ...

  9. [Linux]经典面试题 - 网络基础 - TCP三次握手

    [Linux]经典面试题 - 网络基础 - TCP三次握手 目录 [Linux]经典面试题 - 网络基础 - TCP三次握手 一.TCP报文格式 1.1 TCP报头 1.2 报文图例 二.TCP三次握 ...

随机推荐

  1. Shell条件练习题

    Shell条件练习题 目录 Shell条件练习题 1.检查用户家目录中的 test.sh 文件是否存在,并且检查是否有执行权限 2.提示用户输入100米赛跑的秒数,要求判断秒数大于0且小于等于10秒的 ...

  2. 读写分离&分库分表学习笔记

    读写分离 何为读写分离? 见名思意,根据读写分离的名字,我们就可以知道:读写分离主要是为了将对数据库的读写操作分散到不同的数据库节点上. 这样的话,就能够小幅提升写性能,大幅提升读性能. 我简单画了一 ...

  3. Solution -「多校联训」假人

    \(\mathcal{Description}\)   Link.   一种物品有 长度 和 权值 两种属性,现给定 \(n\) 组物品,第 \(i\) 组有 \(k_i\) 个,分别为 \((1,a ...

  4. Solution -「多校联训」自动机

    \(\mathcal{Description}\)   Link.   有一个状态集为 \(V\) 的自动机,状态接收 (, ) 和 _(空格) 三种字符,分别编号为 \(0,1,2\),状态 \(u ...

  5. Solution -「JOISC 2019」「LOJ #3036」指定城市

    \(\mathcal{Description}\)   Link.   给定一棵含 \(n\) 个结点的树,双向边权不相同.\(q\) 次询问,每次询问在树上标记 \(e\) 个点,标记的价值为所有趋 ...

  6. 当gitlab的数据库坏了,或者其他的组件坏了,修复教程。

    一般企业的gitlab都承载着多个项目的源码和提交记录 如果gitlab的数据库 PostgreSQL 坏掉了,基本很难修复,那这是不是意味着源码丢失了呢. 本文章只针对 gitlab传统存储方式的修 ...

  7. 施耐德NOE77101后门漏洞分析

    固件下载地址: GitHub - ameng929/NOE77101_Firmware 文件目录结构,这里只列出了一些主要的文件信息: ├── bin ├── ftp ├── fw ├── rdt ├ ...

  8. 搭建开源跳板机——jumpserver

    搭建开源跳板机mobaxterm 官方文档:https://jumpserver.readthedocs.io/zh/master/ $ yum update -y # 防火墙 与 selinux 设 ...

  9. requests post/get请求params参数和post请求正文的数据类型记录

    1. 前言 在写接口数据驱动测试框架时,(从excel表中读取的非数据的值都是str类型),发送post/get请求因为数据类型原因,请求失败,走了一些弯路,记录总结一下请求的参数或者请求正文的数据类 ...

  10. for循环-嵌套

    代码 点击查看[ForNest.java]代码 //package com.d; /** * for循环-嵌套 * @date: 2022.2.24 * 正直角三角形.倒直角三角形.等腰三角形.九九乘 ...