img = cv.imread(r"D:\AI\笔记课件\images\tu.png")
kernel = np.array([[-1,0,1],
[-2,0,2],
[-1,0,1]],dtype=np.float32)
kernel = kernel.T
# print(kernel)
img1 = cv.filter2D(img,-1,kernel)
cv.imshow('img',img)
cv.imshow('img1',img1)
cv.waitKey(0)
cv.destroyAllWindows()
tips:使用转置即可提取另外一个维度的边缘特征
sobel_image = cv2.Sobel(src, ddepth, dx, dy, ksize)
src:这是输入图像,通常应该是一个灰度图像(单通道图像),因为 Sobel 算子是基于像素亮度梯度计算的。在彩色图像的情况下,通常需要先将其转换为灰度图像。
ddepth:这个参数代表输出图像的深度,即输出图像的数据类型。在 OpenCV 中,-1 表示输出图像的深度与输入图像相同。
dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,在这里,设置为1意味着我们想要计算图像在水平方向(x轴)的梯度。当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
ksize:Sobel算子的大小,可选择3、5、7,默认为3。
∂ 2 f ∂ y 2 = f ( x , y + 1 ) + f ( x , y − 1 ) − 2 f ( x , y ) {\frac{\partial^{2}f}{\partial y^{2}}}=f(x,y+1)+f(x,y-1)-2f(x,y) ∂y2∂2f=f(x,y+1)+f(x,y−1)−2f(x,y)
合在一起就是:
V 2 f ( x , y ) = f ( x + 1 , y ) + f ( x − 1 , y ) + f ( x , y + 1 ) + f ( x , y − 1 ) − 4 f ( x , y ) V^{2}f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y) V2f(x,y)=f(x+1,y)+f(x−1,y)+f(x,y+1)+f(x,y−1)−4f(x,y)
二维的Laplacian滤波核就是:
k = [ 0 1 0 1 − 4 1 0 1 0 ] k=\left[\begin{array}{c c c}{0}&{1}&{0}\\ {1}&{-4}&{1}\\ {0}&{1}&{0}\end{array}\right] k= 0101−41010
有些资料中在此基础上考虑斜对角情况,将卷积核拓展为:
k = [ 1 1 1 1 − 8 1 1 1 1 ] k=\left[\begin{array}{c c c}{1}&{1}&{1}\\ {1}&{-8}&{1}\\ {1}&{1}&{1}\end{array}\right] k= 1111−81111
cv2.Laplacian(src, ddepth)
src:这是输入图像
ddepth:这个参数代表输出图像的深度,即输出图像的数据类型。在 OpenCV 中,-1 表示输出图像的深度与输入图像相同。
edges = cv2.Canny(image, threshold1, threshold2),该方法封装了以上步骤
可以先对图像进行噪声类型的分析,再手动去除噪点,以得到更好的效果
image
:输入的灰度/二值化图像数据。
threshold1
:低阈值,用于决定可能的边缘点。
threshold2
:高阈值,用于决定强边缘点。
img = cv.imread(r"D:\AI\笔记课件\images\shudu.png",cv.IMREAD_GRAYSCALE)
_,img_binary = cv.threshold(img,127,255,cv.THRESH_BINARY)
dst = cv.Canny(img_binary,threshold1=30,threshold2=70)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
contours,hierarchy = cv2.findContours(image,mode,method)
返回值:[ 轮廓点坐标 ] 和 [ 层级关系 ]。
contours:表示获取到的轮廓点的列表。检测到有多少个轮廓,该列表就有多少子列表,每一个子列表都代表了一个轮廓中所有点的坐标。
hierarchy:表示轮廓之间的关系。对于第i条轮廓, h i e r a r c h y [ i ] [ 0 ] hierarchy[i][0] hierarchy[i][0], h i e r a r c h y [ i ] [ 1 ] hierarchy[i][1] hierarchy[i][1] , h i e r a r c h y [ i ] [ 2 ] hierarchy[i][2] hierarchy[i][2] ,$ hierarchy[i][3]$分别表示其后一条轮廓、前一条轮廓、(同层次的第一个)子轮廓、父轮廓的索引(如果没有相应的轮廓,则对应位置为-1)。该参数的使用情况会比较少。
image:表示输入的二值化图像。
mode:表示轮廓的检索模式。
method:轮廓的表示方法。
cv2.drawContours(image, contours, contourIdx, color, thickness)
image:原始图像,一般为单通道或三通道的 numpy 数组。
contours:包含多个轮廓的列表,每个轮廓本身也是一个由点坐标构成的二维数组(numpy数组)。
contourIdx:要绘制的轮廓索引。如果设为 -1
,则会绘制所有轮廓。根据索引找到轮廓点绘制出来。默认是-1。
color:绘制轮廓的颜色,可以是 BGR 值或者是灰度值(对于灰度图像)。
thickness:轮廓线的宽度,如果是正数,则画实线;如果是负数,则填充轮廓内的区域。
img1 = cv.imread(r"D:\AI\笔记课件\images\num.png")
img = cv.cvtColor(img1,cv.COLOR_BGR2GRAY)
_,img_binary = cv.threshold(img,127,255,cv.THRESH_BINARY_INV) #目标区域显示为白色,其他区域显示为黑色
contours,hierarchy = cv.findContours(img_binary,mode=cv.RETR_EXTERNAL,method=cv.CHAIN_APPROX_SIMPLE)
# print(contours,hierarchy)
cv.drawContours(img1,contours=contours,contourIdx=-1,color=(0,255,0),thickness=5)
cv.imshow('img',img1)
cv.waitKey(0)
cv.destroyAllWindows()
THE END