自学python-opencv(6)边缘检测
import cv2
import numpy
#Canny边缘检测
def edge_demo(image):
#sigmaX:X方向方差,X方向方差,控制权重。y与x是一致的
blurred=cv2.GaussianBlur(image,(3,3),0)
gray=cv2.cvtColor(blurred,cv2.COLOR_BGR2GRAY)
#xsobel
xsobel=cv2.Sobel(gray,cv2.CV_16SC1,1,0)
#ysobel
ysobel=cv2.Sobel(gray,cv2.CV_16SC1,0,1)
#edge
edge_output=cv2.Canny(xsobel,ysobel,50,150)
cv2.imshow("edge_output",edge_output)
dst=cv2.bitwise_and(image,img,mask=edge_output)
cv2.imshow("edge_output_and_image",dst)
print("-----------hi python-------------")
img=cv2.imread("./images/timg.bmp")
cv2.namedWindow("imput images",cv2.WINDOW_AUTOSIZE)
cv2.imshow("imput images",img)
edge_demo(img)
cv2.waitKey()
cv2.destroyWindow('all')
----------------------------------------------------------------------------------------------------
图像的边缘是指图象局部区域亮度变化显著的部分,该区域的灰度剖面一般可以看作是一个阶跃,既从一个灰度值在很小的缓冲区域内急剧变化到另一个灰度相差较大的灰度值。图象的边缘部分集中了图象的大部分信息,图象边缘的确定与提取对于整个图象场景的识别与理解是非常重要的,同时也是图象分割所依赖的重要特征,边缘检测主要是图象的灰度变化的度量、检测和定位,自从1959提出边缘检测以来,经过五十多年的发展,已有许多中不同的边缘检测方法。根据作者的理解和实践,本文对边缘检测的原理进行了描述,在此基础上着重对Canny检测算法的实现进行详述。
1)滤波:边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能。常见的滤波方法主要有高斯滤波,即采用离散化的高斯函数产生一组归一化的高斯核(具体见“高斯滤波原理及其编程离散化实现方法”一文),然后基于高斯核函数对图像灰度矩阵的每一点进行加权求和(具体程序实现见下文)。
2)增强:增强边缘的基础是确定图像各点邻域强度的变化值。增强算法可以将图像灰度点邻域强度值有显著变化的点凸显出来。在具体编程实现时,可通过计算梯度幅值来确定(梯度方向表示灰度变化最大的方向)。
3)检测:经过增强的图像,往往邻域中有很多点的梯度值比较大,而在特定的应用中,这些点并不是我们要找的边缘点,所以应该采用某种方法来对这些点进行取舍。实际工程中,常用的方法是通过阈值化方法来检测。
参考:https://blog.csdn.net/lyl771857509/article/details/79088321?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160118373819724835840340%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160118373819724835840340&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-1-79088321.pc_search_result_cache&utm_term=canny%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B%E7%AE%97%E6%B3%95&spm=1018.2118.3001.4187
1高斯模糊-GaussianBlur
2灰度转换-cvtColor
3计算梯度-Sobel/Scharr
4非最大信号抑制
5高低阈值输出二值图像
------------------
非最大信号抑制
[-1 0 +1]
Gx=[-2 0 +2]
[-1 0 +1]
[-1 -2 -1]
Gy=[0 0 0]
[+1 +2 +1]
其中黄色区域取值范围0~22.5与157.5~180
绿色区域取值范围为22.5~67.5
蓝色区域取值范围67.5~112.5
红色区域取值范围为112.5~157.5
1】高低阈值链接
T1,T2为阈值,凡是高于T2的都保留,凡是小于
T1都丢弃,从高于T2的像素出发,凡是大于T1而
且相互连接的,都保留。最终得到一个输出二值
图像
推荐的高低阈值比值为T2:T1=3:1/2:1其中T2为高阈值,
T1为低阈值
步骤:
】第一 去噪 通常高斯滤波器
】第二 梯度 梯度方向
】第三非极大值抑制(遍历图像,去除所有不是边界的点)
】第四 滞后阈值minVal maxVal
---------------------
import cv2
import numpy as np
img=cv2.imread("./images/lantian1.jpg",cv2.IMREAD_GRAYSCALE)
#threshold阈值
threshold1=cv2.Canny(img,100,200)
threshold=cv2.Canny(img,300,400)
cv2.imshow("liaoxiansheng",img)
cv2.imshow("thresold1",threshold1)
cv2.imshow("thresold",threshold)
cv2.waitKey()
cv2.destroyAllWindows()
----------------------
函数:
edges=cv2.Canny(image,threshold1,threshold2)
edges:边界图像
image:原始图像
threshold1:阈值1 minVal阈值1
threshold2:阈值2 maxVal阈值2