OpenCV:是一个基于BSD许可(开源)发行的跨平台计算视觉库。由一系列C函数和少量的C++编写,实现图像处理和计算机视觉方面的很多通用算法。
Canny边缘检测算子:是一种多级检测算法。1986年由John F. Canny提出,同时提出了边缘检测的三大准则:
- 低错误率的边缘检测:检测算法应该精确地找到图像中的尽可能多的边缘,尽可能的减少漏检和误检。
- 最优定位:检测的边缘点应该精确地定位于边缘的中心。
- 图像中的任意边缘应该只被标记一次,同时图像噪声不应产生伪边缘。
OpenCV将Canny算法封装在一个函数中,cv.Canny()。我们可以通过调用来使用它。
edge = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
Canny的前三个参数是必需的。第一个参数是我们的输入图像,第二个和第三个参数是我们的minVal和maxVal,其中maxVal用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,边缘检测出来是断断续续的。所以这时候用minVal用于将这些间断的边缘连接起来。
可选参数中 aperture_size是Sobel内核的大小,默认是3.最后一个参数是L2gradient,是一个布尔值。指定了求梯度大小的方程。如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则它将使用这个函数:Edge_Gradient(G)=|Gx|+|Gy|。默认值为False。
在使用python语言写OpenCV,确保已经安装了numpy, cv2, 和matplotlib模块
如果没有请在命令行执行以下命令
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
下面是一个简单的使用Canny检测边缘的例子。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('messi5.jpg',0) #替换为需要检测的图片
edges = cv.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()
效果如图
我们也可以动态改变边缘检测。在程序运行的时候改变参数大小,从而调整为合适的大小。
我们使用cv.createTrackbar()和cv.getTrackbarPos()来动态调整数值大小。
关于cv.createTrackbar()和cv.getTrackbarPos()的用法很简单。这里举一个例子就明白了
import numpy as np
import cv2 as cv
# trackbar更改触发的事件,事件为空
def nothing(x):
pass
# 新建一个黑色窗口
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# 添加三个trackbar,范围为0~255,trackbar更改触发的事件为nothing
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
#trackbar也可以作为开关
# 打开开关才可以更改颜色
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
# 一直循环监听
while(1):
cv.imshow('image',img)
# 如果是32位机器可以写k=cv.waitKey(1),如果是64位机器要加上& 0xFF
k = cv.waitKey(1) & 0xFF
# 当检测到按下esc按键触发此事件,退出程序
if k == 27:
break
# 获取trackbar的值,并更改图片颜色
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()
这个程序可以动态更改img的颜色,效果如下:
使用trackbar我们就可以动态更改minVal和maxVal的值了
# python动态边缘检测
import cv2
import numpy as np
from matplotlib import pyplot as plt
def nothing(x):
pass
img = cv2.imread('che.jpg')
# img = cv2.imread('ceshi2.bmp')
cv2.namedWindow('image')
# 范围可以根据需求,自己更改
cv2.createTrackbar('Val','image',0,500,nothing)
edges = cv2.Canny(img, 100, 200)
while(1):
k = cv2.waitKey(1) & 0xFF
# 当按esc键 触发关闭事件
if k == 27:
break
Val = cv2.getTrackbarPos('Val','image')
# 这里我直接将maxVal的值设置为minVal+100,可以根据需求自行更改
edges = cv2.Canny(img, Val,Val+100 )
cv2.imshow('image',edges)
cv2.destroyAllWindows()
效果如图
参考资料:
OpenCV-Python教程(8、Canny边缘检测)