赞
踩
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
1)使用高斯滤波器,以平滑图像,滤掉噪声。
2)计算图像中每个像素点的梯度强度和方向
3)应用非极大值(Non-Maximum Suppression)抑制,以消除边缘检测带来的杂散响应
4)应用双阈值(Double-Threshold)检测来确定真实的和潜在的边缘。
5)通过抑制孤立的弱边缘最终完成边缘检测
cv2.Canny(img,minval,maxval)
import cv2
import show_img as si
import numpy as np
import matplotlib.pyplot as plt
# 读取图片并灰度化处理
lena = cv2.imread('../data/lena.jpeg',cv2.IMREAD_GRAYSCALE)
# canny边缘检测
v1 = cv2.Canny(lena,80,150)
v2 = cv2.Canny(lena,50,100)
# 对比效果
res = np.hstack((v1,v2))
si.show_img('res',res)
效果对比
我们我们看到左边这张是低阈值设置的80,高阈值设置的150,经过检测后所呈现出来的边缘信息比右边设置的低阈值50,高阈值100呈现出来的信息要少,是因为低阈值设置的高了,有的潜在边缘在低阈值以下就给舍弃掉了,而且有的边缘信息达不到你设置的高阈值也就被舍弃掉了。这就是左边内容不太丰富的原因。故我们在进行边缘检测时双阈值设置的要差不多合理(可以反复进行尝试)。
import cv2 import show_img as si import numpy as np # 读取图片 lena = cv2.imread('../data/lena.jpeg',cv2.IMREAD_GRAYSCALE) # 进行阈值处理 ret,thresh = cv2.threshold(lena,127,255,cv2.THRESH_BINARY) # si.show_img('thresh',thresh) #轮廓检测 contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) # 绘制轮廓 # 传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度 # 注意需要copy,要不原图会变 draw_img = lena.copy() res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) # si.show_img('res',res) #draw_img1 = lena.copy() #res = cv2.drawContours(draw_img1,contours,0,(0,0,255),2) # si.show_img('res',res)
我们可以看到大致轮廓已经画出来了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。