国内Python库的镜像网站
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
华中理工大学:http://pypi.hustunique.com/
山东理工大学:http://pypi.sdutlinux.org/
豆瓣:http://pypi.douban.com/simple/
边缘检测原理
实现图像的边缘检测,就是要用离散化梯度逼近函数根据二维灰度矩阵梯度向量来寻找图像灰度矩阵的灰度跃变位置,然后在图像中将这些位置的点连起来就构成了所谓的图像边缘(图像边缘在这里是一个统称,包括了二维图像上的边缘、角点、纹理等基元图)
图像梯度
Sobel 和 Scharr 算子
高级卷积核。Sobel算子是高斯平滑加微分运算的联合运算,因此它更抗噪声。可以指定要采用的导数方向,垂直或水平(分别通过参数yorder和xorder)。还可以通过参数ksize指定内核的大小。如果ksize = -1 ,则使用3x3 Scharr滤波器,比3x3 Sobel滤波器具有更好的结果。
边缘检测具体步骤
1.滤波:边缘检测的算法主要是基于图像强度的一阶导数和二阶导数。OpenCV提供了许多边缘搜索滤波器(包括Laplacian,Sobel和Scharr),这些滤波器将非边缘的区域变为黑色,将边缘区域变为白色,但它们容易把噪点误认为边缘。所以为了消除噪点对我们边缘检测的效果,我们需要对图像进行滤波。
2.增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定
3.检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
基于Canny的边缘检测
.1.高斯滤波去除图像噪声
.2.计算梯度
用一阶偏导的有限差分来计算梯度的幅值和方向
理论先让我求教大佬之后再贴上去了,这部分我都看睡着了。。。😴😴😴
.3.在边缘上应用非极大值抑制
图像梯度幅值矩阵的元素值越大,说明图像中该点的梯度越大。但不能说明这个点是边缘点。在Canny算法中,我们 要进行非极大值抑制,寻找像素点局部点的最大值,将非极大值点对应的灰度值置为0,从而达到剔除大部分非边缘 的点
梯度方向垂直于边缘方向。
假设在梯度方向上有A、B、C三个像素点的梯度值,我们可以比较A/B/C的大小,找出最大梯度值的点(上图假设为 A),其余灰度值都置0,这样我们就可以得到一个白点。
多次在梯度方向上寻找比较,找出多个点,并连线,最后得到的结果是带有“细边”的二进制图像
.4.将双阈值应用于所有检测到的边缘,淘汰所有假正例结果
(最小阈值(threshold1)最大阈值(threshold2))
.5.分析所有边缘及其之间的连接,保留真正的边缘,并丢弃弱边缘
高阈值先把边缘链接成轮廓,当达到轮廓的端点时,该算法会自动寻找满足低阈值的点,再根据此点收集新的边缘, 直至整个图像闭合
找到Canny边缘后,我们可以对边缘进行轮廓检测。
cv2.Canny()函数
功能:Canny边缘检测
输入参数:
1.图像名(img)
2.最小阈值(threshold1)
3.最大阈值(threshold2)
注意:最大阈值用来检测图像中较明显的边缘,但其检测的边缘是断断续续的,所以这时候用最小阈值将这些断断续续的边缘连接起来
程序代码
import cv2 import numpy as np from matplotlib import pyplot as plt img = cv2.imread('love.jpg',0) img = cv2.Canny(img,700,800) cv2.imshow("canny",img) cv2.waitKey() cv2.destroyAllWindows()
效果图