Open cv的Canny边缘检测和轮廓检测例子
# -*- coding:utf-8 -*-
import cv2
image = cv2.imread("images/000.jpg")
cv2.imshow("en",image)
#Canny函数,三个参数:源图像,低阈值,高阈值
image = cv2.Canny(image,200,300)
cv2.imshow("what",image)
cv2.waitKey(0)
Canny 源码解析
====================================================================================
轮廓检测
imread( )
第一个参数是图像的路径,第二个参数一般默认为1,也就是彩色图片.
第二个参数,int类型的flags,为载入标识
- flags = 0, 载入灰度图
- flags = 1, 默认值
- flags = 2, 无损源图像
固定阈值操作:threshold( )函数
基本思想
对单通道数组应用固定阈值操作.该函数的典型应用是对灰度图像进行阈值操作得到二值图像,或者是去掉噪声例如滤掉很大或者很小的像素值的图像点.
python: cv2.threshold(src,thresh,maxval,type,dst)
第一个参数src: 源数据.
第二个参数thresh: 阈值的具体值.
第三个参数maxval: 当type值取cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV时域值类型时的最大值.
第四个参数type: 阈值类型.
- cv2.THRESH_BINARY 二进制阈值:二值阈值化
- cv2.THRESH_BINARY_INV 反二进制阈值:反向二值阈值化并反转
- THRESH_TRUNC 截断阈值:截断阈值化
- THRESH_TOZERO 反阈值化为0:超过阈值被置为0
- THRESH_TOZERO_INV 阈值化为0:低于阈值被置为0
上述标识符依次取值分别为0,1,2,3,4.
查找并绘制轮廓
-
寻找轮廓:findContours( )函数
用于在二值图像中寻找轮廓
cv2.findContours(image, mode, method, contours, hierarchy, offset)
第一个参数 image : 输入图像,即源图像.图像的非零像素被视为 1 , 0 像素值被保留为0,所以图像为二进制.可以使用compare(),inrange(),threshold(),adaptivethreshold(),canny()等函数由灰度图或者彩色图创建二进制图像.此函数会在提取图像轮廓的同时修改图像的内容.
第二个参数 mode : 轮廓检索模式.
第三个参数 method : 轮廓的近似办法
第四个参数 contours : 检测到的轮廓,函数调用后的运算结果存在这里.每个轮廓存储为一个点向量.
第五个参数 hierarchy : 可选的输出向量,包含图像的拓扑信息,其作为轮廓数量的表示,包含了许多元素.
第六个参数 offset :每个轮廓点的可选偏移量,有默认值.
-
绘制轮廓:drawContours( )函数
用于在图像中绘制外部或内部轮廓.
cv2.drawContours(image, contours, contourIdx, color, thickness = None, lineType = None, hierarchy = None, maxLevel
=None, offset = None)
第一个参数 image : 目标图像.
第二个参数 contours : 所有的输入轮廓.
第三个参数 contourIdx : 轮廓绘制的只是指示变量,如果其为负值,则绘制所有的轮廓.
第四个参数 color : 轮廓的颜色.
第五个参数 thicKness : 轮廓线条的粗细度,有默认值1.如果其为负值(如thickness = cv_filled),便会绘制在轮廓的内部.
第六个参数 lineType:线条的类型,有默认值.
第七个参数 hierarchy : 可选的层次结构信息,有默认值.
第八个参数 maxLevel : 表示用于绘制轮廓的最大等级,有默认值.
第九个参数 offset : 可选的轮廓偏移参数,用指定的偏移量offset = (dx, dy)偏移需要绘制的轮廓,有默认值.
# -*- coding:utf-8 -*-
import cv2
# Step1. 读入图像,并转换成灰度图像
image = cv2.imread('images/000.jpg', 0)
cv2.imshow("gray",image )
# Step2. 二值化
ret, thresh = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
# Step3. 轮廓提取
image, contour, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# Step4. 轮廓绘制
color = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR)
dst = cv2.drawContours(color, contour, -1, (0,255,0), 2)
cv2.imshow("dst", dst)
cv2.waitKey(0)
更具体的函数介绍可以点击此