边缘检测实际上就是对图像进行系统的梯度计算,包含了图像的噪声处理,非极大值抑制,双阈值检测等一系列图像处理方式,通过这些方式处理图像后得到图像的轮廓。这些方式在之前的博客都已经提到过i了,而Opencv提供了一个非常方便的函数进行边缘检测,它将高斯滤波,梯度大小及方向计算,非极大值抑制,双阈值检测等几个边缘检测常用函数全部集成为一个函数,使用者只需要给出两个阈值的大小即可。

opencv 边缘检测与抠图 png python opencv 边缘检测_opencv 边缘检测与抠图 png

相关函数

cv2.Canny(XT_gray,minVal,maxVal):XT_gray为要进行处理的图像,而minVal是最小阈值,maxVal则是最大阈值。这两个参数可以自己设定,范围是0~255,而最小阈值表示如果检测到的梯度像素点小于最小阈值,那么它将会被舍去(即赋值为0),而介于最小阈值和最大阈值之间的梯度像素点,如果该像素点与边界相连,则将其保留为边界,否则同样舍去,而如果梯度像素点大于最大阈值,则直接将其认定为边界像素点,这样我们就舍去了图像模糊的部分,得到了图像明显的边界。

注意:在实际操作中,如果想要保留图像更多细节,则可以适当降低最小阈值,而反过来,如果想要简化图像,只想得到图像大体轮廓,则应该增大最小阈值。

opencv 边缘检测与抠图 png python opencv 边缘检测_opencv 边缘检测与抠图 png_02

代码示例

import cv2#导入相关包
import numpy as np
import matplotlib.pyplot as plt
XT_gray = cv2.imread("XT.jpeg",cv2.IMREAD_GRAYSCALE)#读入图像并将格式转化为灰度图
def cv2_imshow(name,img):#定义展示图像的函数
    cv2.imshow(name,img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
cv2_imshow("XT",XT_gray)#展示读入为灰度图的图像
X = cv2.Canny(XT_gray,30,100)#最小阈值比较小的情况
Y = cv2.Canny(XT_gray,150,200)#最小阈值比较大的情况
All = np.hstack((X,Y))#拼接两张图像以进行对比
cv2_imshow("All",All)#展示图像

运行结果 

原图

opencv 边缘检测与抠图 png python opencv 边缘检测_opencv 边缘检测与抠图 png_03

灰度图 

opencv 边缘检测与抠图 png python opencv 边缘检测_像素点_04

不同阈值的对比图,可以看到,左边最小阈值较小的图像细节会比较明显,但是看起来轮廓就不太清晰了 

opencv 边缘检测与抠图 png python opencv 边缘检测_opencv 边缘检测与抠图 png_05