范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

3种python3的canny边缘检测之静态,可调节和自适应

  先看高级版的python3的canny的自适应边缘检测:
  car的效果图
  内容:
  1 canny的边缘检测的介绍。
  2 三种方法的canny的边缘检测,由浅入深地介绍:固定值的静态,可自调节的,自适应的。
  说明:
  1 环境:python3.8、opencv4.5.3和matplotlib3.4.3。
  2 图片:来自今日头条正版免费图库。
  3 实现自适应阈值的canny边缘检测的参考代码和文章:#基于python2实现自适应阈值的canny https://github.com/sadimanna/canny  #本文基于python3,复现一种自适应的阈值分割方法。 https://blog.csdn.net/lyxleft/article/details/91558726?spm=1001.2014.3001.5501
  上述的代码,本机均有报错,故对代码进行修改,注释和运行。
  初级canny:
  1 介绍:opencv中给出了canny边缘检测的接口,直接调用:ret = cv2.canny(img,t1,t2)
  即可得到边缘检测的结果ret,其中,t1,t2是需要人为设置的阈值。
  2 python的opencv的一行代码即可实现边缘检测。
  3 Canny函数及使用:函数:Canny edges = cv2.Canny(image, threshold1, threashold2)  参数: image : 原始图像 threshold1 : 阈值1 (minVal) threshold2 : 阈值2 (maxVal)  返回值:edges : 边缘图像
  4 Canny边缘检测流程:
  去噪 --> 梯度 --> 非极大值抑制 --> 滞后阈值Canny边缘检测算法其实非常复杂,包括4个步骤:  1 去噪:用高斯滤波器对图像进行去噪 2 梯度:计算梯度 3 NMS:在边缘上使用非极大值抑制(NMS) 4 滞后阈值: 在检测到的边缘上使用双阈值去除假阳性 分析所有的边缘及其之间的连接,以保留真正的边缘去除不明显的边缘
  5 代码:import cv2  img = cv2.imread("/home/xgj/Desktop/edge_detection/snake.jpeg", cv2.IMREAD_GRAYSCALE) cv2.imshow("snake", img)  ret1 = cv2.Canny(img, 100, 200)  #人工设置固定值 cv2.imshow("result1", ret1)  ret2 = cv2.Canny(img, 20, 60)    #人工设置固定值 cv2.imshow("result2", ret2)  cv2.waitKey() cv2.destroyAllWindows()
  6 操作和过程:
  7 原图:
  8 疑问:
  ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人为设置的阈值,一般人怎么知道具体数值是多少,才是最佳的呀?所以,这是它的缺点。
  中级canny:
  1 中级canny,就是可调节的阈值,找到最佳的canny边缘检测效果。
  2 采用cv2.createTrackbar来调节阈值。
  3 代码:import cv2 import numpy as np  img= cv2.imread("/home/xgj/Desktop/edge_detection/3_self_canny/girl.jpeg") cv2.namedWindow("Canny edge detect") #设置窗口,cv2.WINDOW_NORMAL表示窗口大小可自动调节 cv2.namedWindow("Original Image")   def nothing(x):   pass # 创建两个滑动条,分别控制minVal(最小阈值)、maxVal(最大阈值). # minVal:滑动条名称; "Canny edge detect":窗口名; 60:滑动条默认滑动位置; 300:最大值 ; nothing:回调函数 cv2.createTrackbar("minVal","Canny edge detect",60,300,nothing) cv2.createTrackbar("maxVal","Canny edge detect",100,400,nothing)  while(1):   #获得滑动条所在的位置   #cv2.getTrackbarPos(滑动条名称,窗口名);   minVal = cv2.getTrackbarPos("minVal","Canny edge detect")   maxVal = cv2.getTrackbarPos("maxVal","Canny edge detect")   #Canny边缘检测   #cv2.Canny函数参数解析:   # img:原图像名   # minVal:最小梯度   # maxVal:最大梯度   # 5 :5*5大小的高斯滤波器(卷积核),用来消除噪声影响   # L2gradient :求图像梯度,从而进行去除非边界上的点(非极大值抑制)   edgeImage = cv2.Canny(img,minVal,maxVal,5,L2gradient=True)   #显示图片   cv2.imshow("Original Image",img) #原图   cv2.imshow("Canny edge detect",edgeImage) # Canny检测后的图     k = cv2.waitKey(1)   if k ==ord("q")& 0xFF: # 按 q 退出     break cv2.destroyAllWindows()#销毁窗口
  4 操作和效果:
  5 原图:
  高级canny:
  1 自适应canny的算法:
  ret = cv2.canny(img,t1,t2)
  即算法在运行过程中能够自适应地找到较佳的分割阈值t1,t2。
  2 文件结构:
  3 main.py代码: # 主程序:main.py  # 第1步:模块导入 import numpy as np import cv2, time, math from matplotlib import pyplot as plt from scipy.signal import convolve2d as conv2 #两个自定义模块(库)导入 from bilateralfilt import bilatfilt from dog import deroGauss  # 第2步:函数定义 # 2-1 获取边缘函数:用高斯滤波器对图像进行去噪 def get_edges(I,sd): 	dim = I.shape 	Idog2d = np.zeros((nang,dim[0],dim[1])) 	for i in range(nang): 		dog2d = deroGauss(5,sd,angles[i]) 		Idog2dtemp = abs(conv2(I,dog2d,mode="same",boundary="fill")) 		Idog2dtemp[Idog2dtemp<0]=0 		Idog2d[i,:,:] = Idog2dtemp 	return Idog2d   # 2-2 计算梯度 def calc_sigt(I,threshval): 	M,N = I.shape 	ulim = np.uint8(np.max(I))	 	N1 = np.count_nonzero(I>threshval) 	N2 = np.count_nonzero(I<=threshval) 	w1 = np.float64(N1)/(M*N) 	w2 = np.float64(N2)/(M*N)  	try: 		u1 = sum(i*np.count_nonzero(np.multiply(I>i-0.5,I<=i+0.5))/N1 for i in range(threshval+1,ulim)) 		u2 = sum(i*np.count_nonzero(np.multiply(I>i-0.5,I<=i+0.5))/N2 for i in range(threshval+1)) 		 		uT = u1*w1+u2*w2 		sigt = w1*w2*(u1-u2)**2  	except: 		return 0 	return sigt  # 2-3 非极大值抑制(NMS) def nonmaxsup(I,gradang): 	dim = I.shape 	Inms = np.zeros(dim) 	xshift = int(np.round(math.cos(gradang*np.pi/180))) 	yshift = int(np.round(math.sin(gradang*np.pi/180))) 	Ipad = np.pad(I,(1,),"constant",constant_values = (0,0)) 	for r in range(1,dim[0]+1): 		for c in range(1,dim[1]+1): 			maggrad = [Ipad[r-xshift,c-yshift],Ipad[r,c],Ipad[r+xshift,c+yshift]] 			if Ipad[r,c] == np.max(maggrad): 				Inms[r-1,c-1] = Ipad[r,c] 	return Inms  # 2-4-1 阈值 def threshold(I,uth): 	lth = uth/2.5 	Ith = np.zeros(I.shape) 	Ith[I>=uth] = 255 	Ith[I=lth, I0: 					Ipad[i,j] = 255 				else: 					Ipad[i,j] = 0 	Ih = Ipad[1:r+1,1:c+1] 	return Ih  # 2-4-3 获取最佳阈值 def get_threshold(I): 	max_sigt = 0 	opt_t = 0 	ulim = np.uint8(np.max(I)) 	print(ulim," ") 	for t in range(ulim+1): 		sigt = calc_sigt(I,t) 		if sigt > max_sigt: 			max_sigt = sigt 			opt_t = t 	print ("optimal high threshold: ",opt_t," ") 	return opt_t  # 第3步:图片读取 # 读取原图 img = cv2.imread("/home/xgj/Desktop/edge_detection/3_self_canny/car.jpeg") # 判断原图大小,如果大于多少,就调节图片大小 # 否则不调节 while img.shape[0] > 1100 or img.shape[1] > 1100:     img = cv2.resize(img,None, fx=0.5,fy=0.5,interpolation = cv2.INTER_AREA)  # 转换为gray灰度图 gimg = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) dim = img.shape #获取图片大小  # 第4步:开始图像的canny的自适应操作 #Bilateral filtering=双边滤波 print("总共有2步:有一定的耗时,与图片大小有关 ") print("第1步: ") print ("Bilateral filtering... ") # 双边滤波:达到保边去噪 gimg = bilatfilt(gimg,5,3,10) print ("after bilat: ",np.max(gimg)," ") #获取时间计时 stime = time.time() angles = [0,45,90,135] nang = len(angles)  #Gradient of Image=图片的梯度 print ("Calculating Gradient... ") img_edges = get_edges(gimg,2) print ("after gradient: ",np.max(img_edges)," ")  #Non-max suppression:在边缘上使用非极大值抑制(NMS) print ("Suppressing Non-maximas... ") for n in range(nang): 	img_edges[n,:,:] = nonmaxsup(img_edges[n,:,:],angles[n])  print ("after nms: ", np.max(img_edges)," ")  print ("请关掉matplotlib的图形窗口,进行下一步自适应… ")  img_edge = np.max(img_edges,axis=0) lim = np.uint8(np.max(img_edge)) plt.imshow(img_edge) plt.show()   print("第2步 函数调用: ") # 计算阈值 print ("Calculating Threshold... ") th = get_threshold(gimg) the = get_threshold(img_edge)  # 获取阈值 print (" Thresholding... ") img_edge = threshold(img_edge, the*0.25)  # 在边缘上使用非极大值抑制,滞后效应,获取自适应阈值 print ("Applying Hysteresis... ") img_edge = nonmaxsup(hysteresis(img_edge),90)  # 第5步:canny调用获取的自适应阈值 # 获取自适应的阈值采用canny进行边缘检测 img_canny = cv2.Canny(np.uint8(gimg),th/3,th)  cv2.imshow("Uncanny",img_edge) cv2.imshow("Canny",img_canny) print( "Time taken :: ", str(time.time()-stime)+" seconds... ") print("结束!!") cv2.waitKey(0)
  4 dog.py代码:import numpy as np import math  def deroGauss(w=5,s=1,angle=0): 	wlim = (w-1)/2 	y,x = np.meshgrid(np.arange(-wlim,wlim+1),np.arange(-wlim,wlim+1)) 	G = np.exp(-np.sum((np.square(x),np.square(y)),axis=0)/(2*np.float64(s)**2)) 	G = G/np.sum(G) 	dGdx = -np.multiply(x,G)/np.float64(s)**2 	dGdy = -np.multiply(y,G)/np.float64(s)**2 	angle = angle*math.pi/180 	dog = math.cos(angle)*dGdx + math.sin(angle)*dGdy  	return dog
  5 bilateralfilt.py代码:import numpy as np  # 双边滤波 def bilatfilt(I,w,sd,sr): 	dim = I.shape 	Iout= np.zeros(dim) 	wlim = (w-1)//2 	y,x = np.meshgrid(np.arange(-wlim,wlim+1),np.arange(-wlim,wlim+1)) 	g = np.exp(-np.sum((np.square(x),np.square(y)),axis=0)/(2*(np.float64(sd)**2)))  	Ipad = np.pad(I,(wlim,),"edge")  	for r in range(wlim,dim[0]+wlim): 		for c in range(wlim,dim[1]+wlim): 			Ix = Ipad[r-wlim:r+wlim+1,c-wlim:c+wlim+1] 			s = np.exp(-np.square(Ix-Ipad[r,c])/(2*(np.float64(sr)**2))) 			k = np.multiply(g,s) 			Iout[r-wlim,c-wlim] = np.sum(np.multiply(k,Ix))/np.sum(k) 			 	return Iout
  6 原图:
  7 效果图:本文第一个gif图,此处省略。
  小结:
  1 本文由浅入深,总结的很好,适合收藏。
  2 对于理解python的opencv的canny的边缘检测,很有帮助。
  3 本文高级版canny自适应的算法参考2篇文章,虽然我进行代码的删除,注释,修改,优化等操作,故我不标注原创,对原作者表达敬意。
  4 自己总结和整理,分享出来,希望对大家有帮助。

戴森推出DysonZone耳机,戴在头上的空气净化器IT之家3月30日消息,戴森今日宣布推出一款耳机,名为DysonZone,你可以理解为头戴式耳机空气净化器的二合一产品,官方给它的定义则是空气净化耳机。这款耳机支持主动降噪,内置戴启奥科技进北交所上市辅导期输血信息化企业拥有242项软件著作权挖贝网3月30日,新三板创新层公司启奥科技(831287)进入北交所上市辅导期,辅导机构为财达证券。3月22日,启奥科技与财达证券签订了北交所上市辅导协议,同日向河北证监局报送了辅爆款HiFi监听耳机飞利浦SHP9500特价419元如果你的预算有限,又想体验一下HiFi音质的话,那这款飞利浦(PHILIPS)SHP9500绝对是你进入HiFi世界的不二之选。SHP9500以极高的性价比一直在烧友们心中享有盛名等等党终究还是赢了!小米11Ultra限时降1500相机再次进化近期又有不少新机发布了,诸如RedmiK50系列,当然还有一个K40S突然冒出来有点让人措手不及,当然其他手机厂商也有很多好的手机,一些已经发布了,还有一些还在路上,总体来说,今年新能源物流车或迎爆发前夜2025年将突破200万辆?21世纪经济报道记者彭苏平上海报道新能源汽车开始在各个细分市场落地开花。来自电车资源的数据显示,2021年中国新能源物流车销量为13。12万辆,是2020年总销量58045辆的2。中国电信推出星卡随心版用户可随需订购新海南客户端南海网南国都市报3月30日消息(记者任桐)近期,中国电信推出满足个性化需求的星卡随心版,让用户可以在不同需求场景下,打破套餐思维,自由选择组合,随需订购。每个月总有流量对话零跑汽车当下仍需聚焦单车智能车路协同是一个锦上添花的过程,有这个东西可以大大改进单车智能上的一些容错能力,错误概率会大大降低,零跑汽车智能驾驶产品线总监王耀农在谈到智能驾驶路线时这样说道。经过长期的发展,智能阿里腾讯支付互联互通再进一步淘宝小范围开启微信支付内测(马秋月文)3月30日消息,继阿里旗下饿了么优酷等应用接入微信支付后,近日淘宝正针对小范围内开启对微信支付功能的内测,并在支付选项中新增了与微信支付相关的两种支付模式,分别是微信扫数据结构与算法手撕平衡二叉树平衡二叉树定义动机二叉查找树的操作实践复杂度由树高度决定,所以希望控制树高,左右子树尽可能平衡。平衡二叉树(AVL树)称一棵二叉查找树为高度平衡树,当且仅当或由单一外结点组成,或由比缺芯还严重!超90大陆市场被美企垄断,该警惕了当今电子产业的高速发展让人们的视线都集中在半导体产业上,尤其是自从华为的芯片由于芯片规则被修改而断供后,芯片问题更是国内热烈讨论的问题,引起了国家以及相关企业的重视。这一次华为的事神州控股2021年营收205。39亿港元,大数据产品收入增长1023月30日晚间,神州数码控股有限公司(简称神州控股股票代码00861。HK)发布了2021年度报告。报告显示,公司2021年营收205。39亿港元,归母净利润(扣除股份支付费用及少
颜值喜人的百元有线耳机徕声T200大家好,好久没跟大家推荐耳机了,今天跟大家分享的是徕声科技出品的一款百元内的入门级HiFi音乐耳机,这个品牌别的不说,在外观设计上很有自己的独特见解,在外观方面很符合我口味,下面就LG官宣正式退出手机业务4月5日上午,韩国LG电子召开理事会,正式宣布停止其手机业务,此前早有预告,所以这次官宣没有引起太大的波澜。作为一家较早进入手机领域的电子企业,LG高光时刻的表现还是十分不错的,其美国监管机构公布特斯拉失控调查结果美国国家公路交通安全管理局(NHTSA)是美国政府部门汽车安全的最高主管机关,是美国运输部下的一个执行机构,其宗旨是保护生命防止伤害,减少车辆撞击。NHTSA缺陷调查办公室在接到客中国三大运营商退市纽交所NO在2021年的最后时间,纽交所发出一则声明,根据纽交所的声明,中国的三家电信运营商将在1月7日至1月11日期间退市。此消息一出,整个业界为之震惊,甚至有行业人士认为这是彻底疯狂了,HUGOBOSS中国总经理来自施华洛世奇Dior任命首席传讯和形象官HUGOBOSS10月25日,全球奢侈品时尚集团HUGOBOSS(雨果博斯)任命孙珏女士(JudithSun)为中国区董事总经理。她将领导公司在此最具活力的市场的新战略执行,积极提2021华丽志上海沙龙全景报道聚焦中国品牌成长和全球时尚投资2021年10月12日13日上海时装周期间,华丽志在上海新天地连续举办了两场线下行业沙龙活动,聚焦中国品牌成长和全球时尚投资两个重要课题,邀请时尚产业的创业者投资人和高级管理者共聚直播报名好瓶COO对话中国品牌主理人第15期华丽志线上音视频栏目对话中国品牌主理人,邀请中国最具潜力的品牌创始人,分享他们的一手经验和深层思考。好瓶也与不同领域的企业跨界合作,比如与可口可乐中国推出联名款24包,与中国航天文特写雪山沙漠盐湖中国品牌如何为时装大秀选址?如何为大秀选址?正在成为越来越多时尚品牌苦思冥想的问题。秀场所处的环境虽然是无声的背景,却为品牌的表达提供了最好的坐标和注解。翻修前的巴黎大皇宫一直是法国奢侈品牌Chanel(香奈深度中国时尚新品牌加速涌现,这六个最新趋势不容错过在今天的中国时尚市场,海量新品牌正不断涌现,而人头攒动热闹非凡的上海时装周,正是近距离观察这些新品牌不容错过的一个窗口。截止到10月17日,2022春夏上海时装周完成了超百场男装女高通最新5G芯片依然是业界第一国内现在都在欢度春节,但是西方国家是没有春节这一节日的,2020年联发科在5G领域一度超过一直手机芯片领域的业界老大高通!联发科2020年下半年发布了全球首款基于5nm工艺的5G调苹果春季发布会终于定了众多果粉翘首以盼的春季发布会终于确定了。苹果公司在今天凌晨向媒体发出2021年春季特别活动邀请函,确定将于美国当地时间4月20日(北京时间4月21日)通过线上形式举行活动。此次发布