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()
效果如图
参考资料: