重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
先看高级版的python3的canny的自适应边缘检测:
成都创新互联坚持“要么做到,要么别承诺”的工作理念,服务领域包括:成都网站设计、网站建设、企业官网、英文网站、手机端网站、网站推广等服务,满足客户于互联网时代的凤庆网站设计、移动媒体设计的需求,帮助企业找到有效的互联网解决方案。努力成为您成熟可靠的网络建设合作伙伴!
内容:
1 canny的边缘检测的介绍。
2 三种方法的canny的边缘检测,由浅入深地介绍:固定值的静态,可自调节的,自适应的。
说明:
1 环境:python3.8、opencv4.5.3和matplotlib3.4.3。
2 图片:来自品阅网正版免费图库。
3 实现自适应阈值的canny边缘检测的参考代码和文章:
上述的代码,本机均有报错,故对代码进行修改,注释和运行。
初级canny:
1 介绍:opencv中给出了canny边缘检测的接口,直接调用:
即可得到边缘检测的结果ret,其中,t1,t2是需要人为设置的阈值。
2 python的opencv的一行代码即可实现边缘检测。
3 Canny函数及使用:
4 Canny边缘检测流程:
去噪 -- 梯度 -- 非极大值抑制 -- 滞后阈值
5 代码:
6 操作和过程:
7 原图:
8 疑问:
ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人为设置的阈值,一般人怎么知道具体数值是多少,才是最佳的呀?所以,这是它的缺点。
中级canny:
1 中级canny,就是可调节的阈值,找到最佳的canny边缘检测效果。
2 采用cv2.createTrackbar来调节阈值。
3 代码:
4 操作和效果:
5 原图:
高级canny:
1 自适应canny的算法:
ret = cv2.canny(img,t1,t2)
即算法在运行过程中能够自适应地找到较佳的分割阈值t1,t2。
2 文件结构:
3 main.py代码:
4 dog.py代码:
5 bilateralfilt.py代码:
6 原图:
7 效果图:本文第一个gif图,此处省略。
小结:
1 本文由浅入深,总结的很好,适合收藏。
2 对于理解python的opencv的canny的边缘检测,很有帮助。
3 本文高级版canny自适应的算法参考2篇文章,虽然我进行代码的删除,注释,修改,优化等操作,故我不标注原创,对原作者表达敬意。
4 自己总结和整理,分享出来,希望对大家有帮助。
使用opencv-python的内置函数,对图片进行降噪处理。
8Fourier变换的应用——图像去噪
给出的图片是RGB图片,也就是需要有三个通道。
下面的函数用来去噪。
img=np.uint8(cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21))
对这个图片进行局部自适应二值化处理:
img=hui(img)
th1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,5)
另一种局部自适应二值化处理:
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,31,5)
在第一步连续执行两次去噪,得到的三幅图片是:
执行三次降噪。
连续10次降噪。
#coding:utf-8
import sys,os
from PIL import Image,ImageDraw
#二值数组
t2val = {}
def twoValue(image,G):
for y in xrange(0,image.size[1]):
for x in xrange(0,image.size[0]):
g = image.getpixel((x,y))
if g G:
t2val[(x,y)] = 1
else:
t2val[(x,y)] = 0
# 降噪
# 根据一个点A的RGB值,与周围的8个点的RBG值比较,设定一个值N(0 N 8),当A的RGB值与周围8个点的RGB相等数小于N时,此点为噪点
# G: Integer 图像二值化阀值
# N: Integer 降噪率 0 N 8
# Z: Integer 降噪次数
# 输出
# 0:降噪成功
# 1:降噪失败
def clearNoise(image,N,Z):
for i in xrange(0,Z):
t2val[(0,0)] = 1
t2val[(image.size[0] - 1,image.size[1] - 1)] = 1
for x in xrange(1,image.size[0] - 1):
for y in xrange(1,image.size[1] - 1):
nearDots = 0
L = t2val[(x,y)]
if L == t2val[(x - 1,y - 1)]:
nearDots += 1
if L == t2val[(x - 1,y)]:
nearDots += 1
if L == t2val[(x- 1,y + 1)]:
nearDots += 1
if L == t2val[(x,y - 1)]:
nearDots += 1
if L == t2val[(x,y + 1)]:
nearDots += 1
if L == t2val[(x + 1,y - 1)]:
nearDots += 1
if L == t2val[(x + 1,y)]:
nearDots += 1
if L == t2val[(x + 1,y + 1)]:
nearDots += 1
if nearDots N:
t2val[(x,y)] = 1
def saveImage(filename,size):
image = Image.new("1",size)
draw = ImageDraw.Draw(image)
for x in xrange(0,size[0]):
for y in xrange(0,size[1]):
draw.point((x,y),t2val[(x,y)])
image.save(filename)
image = Image.open("d:/1.jpg").convert("L")
twoValue(image,100)
clearNoise(image,4,1)
saveImage("d:/5.jpg",image.size)