基于Python的Opencv学习

基于Python的Opencv学习第十一天

今天为大家先介绍一下laplacian算子,来结束图像梯度的内容,然后介绍一下canny边缘检测。

一.laplacian算子

laplacian算子类似于二阶的sobel导数,因为laplacian算子的卷积核不同,其卷积核如图:
在这里插入图片描述
可以看到卷积核里面的系数同sobel算子和scharr算子不同。其中,laplacian算子的计算公式为:

P5=(p2+p4+p6+p8)-4*p5

来看示例:
在这里插入图片描述
来对比一下三种算子:
在这里插入图片描述
在这里插入图片描述
这里可以看到完全是因为三类算子其系数不同而导致结果不同。
在opencv里面,利用

cv2.Laplacian(src,ddepth)

在这里,dst为结果图像,src为原图像,ddepth为图像深度。

通常计算时,图像深度使用更高的数据类型cv2.CV_64F,取绝对值后,再转为np.uint8(cv2.CV_8U)类型。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
laplacian=cv2.Laplacian(a,cv2.CV_64F)
laplacian=cv2.convertScaleAbs(laplacian)
cv2.imshow("a",a)
cv2.imshow("laplacian",laplacian)

在这里插入图片描述
可以看到代码和结果。

二.Canny边缘检测

1.Canny边缘检测原理
Canny边缘检测的一般步骤分四步:
①去噪
边缘检测容易受到噪声的影响,所以在进行边缘检测前要进行去噪处理,通常采用高斯滤波器去除噪声

至于高斯滤波器的方法和使用,需要参考我以前的博客
即是让临近的像素具有更高的重要度,对周围像素计算加权平均值,较近的像素具有较大的权重值(除以56的原因是加起来的值等于56,然后可以确保得到的值能够在0~256之间)
在这里插入图片描述
②梯度
对平滑后的图像采用sobel算子计算梯度和方向
梯度的计算前面博客介绍了,至于方向,首先计算水平方向的梯度和竖直方向上的梯度,然后通过算式:

Angle(α)=tan^-1(Gy/Gx)可以得到该点的方向
在这里插入图片描述
梯度的方向一般总是与边界垂直,有四类:垂直,水平,以及两个对角线方向。

在这里插入图片描述

③非极大值抑制
在获取梯度和方向后,遍历图像,去除所有不是边界的点。实现方法:逐个遍历像素点,判断当前像素点是否是周围像素中具有相同方向梯度的最大值
在这里插入图片描述
如图,点A,点B,点C三点具有相同的方向,梯度方向垂直于边缘,判断点A是否为点A,点B,点C的局部最大值:如果是,保留该点;否则,该点被抑制(即像素值归零)。

来看个例子:
在这里插入图片描述
黄色背景的值被保留,其余点被抑制(处理为0)

④滞后阈值
这里我们选取两个阈值,分别为最大阈值和最小阈值在这里插入图片描述
看上图右侧,比边界阈值大的保留,与边界相连保留,其他的则抛弃。所以最后的结果为:
在这里插入图片描述
这里B和D被剔除,值被处理为0。

来看一下边缘处理的美:
在这里插入图片描述
2.Canny边缘检测函数
边缘检测的函数为cv2.Canny(),具体格式为:

edges=cv2.Canny(image,threshold1,threshold2)

参数说明:
edges为边界图像
image为原图像
threshold1为上面提到的阈值minVal
threshold2为上面提到的阈值maxVal

调整阈值,可以控制边缘细节:
maxVal,minVal变小,有更多的细节信息。

import cv2
import numpy as np
a=cv2.imread(r"C:\Users\LT010407\Desktop\lena.jpg")
r1=cv2.Canny(a,100,200)
r2=cv2.Canny(a,64,128)
cv2.imshow("a",a)
cv2.imshow("r1",r1)
cv2.imshow("r2",r2)

在这里插入图片描述

好的,今天的内容就结束了,为大家重点介绍了canny边缘检测知识,大家好好理解一下吧(转载注明出处)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
车牌识别系统是计算机视觉领域的一个重要应用,可以在交通管理、安防等领域发挥重要作用。基于PythonOpenCV的车牌识别系统可以通过以下步骤实现: 1. 图像预处理:对原始图像进行二值化、去噪等处理,以便后续处理。 2. 车牌定位:使用基于边缘检测的方法或基于颜色的方法定位车牌位置。 3. 车牌字符分割:对车牌进行字符分割,可以使用基于投影的方法或基于轮廓的方法。 4. 字符识别:使用OCR技术对字符进行识别,可以使用深度学习模型或传统机器学习算法。 以下是一个简单的基于PythonOpenCV的车牌识别系统的示例代码: ```python import cv2 # 读取图像 img = cv2.imread('car.jpg') # 图像预处理 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5, 5), 0) ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 车牌定位 contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] area = cv2.contourArea(cnt) if area < 1000 or area > 5000: continue rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) box = np.int0(box) cv2.drawContours(img, [box], 0, (0, 0, 255), 2) # 车牌字符分割 gray_roi = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) x, y, w, h = cv2.boundingRect(contours[0]) roi = gray_roi[y:y + h, x:x + w] ret, th = cv2.threshold(roi, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) cv2.imshow('th', th) # 字符识别 model = load_model('model.h5') chars = [] contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] x, y, w, h = cv2.boundingRect(cnt) if w < 8 or h < 8: continue roi = th[y:y + h, x:x + w] roi = cv2.resize(roi, (20, 20)) roi = np.expand_dims(roi, axis=2) roi = np.expand_dims(roi, axis=0) pred = model.predict(roi) char = np.argmax(pred) chars.append(char) # 输出识别结果 result = ''.join([CHARS[i] for i in chars]) print(result) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 需要注意的是,以上代码只是一个简单的示例,实际的车牌识别系统需要针对具体场景进行优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值