标题边缘提取
1.Canny边缘检测:首先使用高斯模糊去除噪声,然后计算每个像素点的梯度大小和方向,接着应用非极大抑制,最后通过设置阈值提取边缘点集,对噪声不敏感,能够检测到真正的弱边缘,计算复杂度高,不适用于实时系统,对参数明感,需要调参
使用场景:
Canny算子适用于需要高质量的边缘检测任务。例如物体识别,图像分割等
参数:
1.img:输入图像
2.threshold1:阈值,控制边缘强度
3.threshold2:阈值,控制边缘强度
4.edges:输出的边缘图像
5.apertureSize:Sobel算子的大小,可选3,5,7,默认3
6.L2gradient:是否使用L2范数计算梯度大小,可选值True或False,默认为False
代码:
# 进行边缘检测
sobel = cv2.Canny(img,100,200)
2.Sobel算子:sobel用于计算图像的梯度,分别在x和y方向上计算梯度,然后将两个梯度的图像合并得到最终的边缘图像
使用场景:
Sobel适用于一般的边缘检测任务,它对明显的轮廓边缘有良好的响应
参数:
1.src:输入图像
2.ddepth:输出图像的深度,-1表示与原图像相同深度
3.dx:x方向上的梯度
4.dy:y方向上的梯度
5.ksize:sobel核大小,若为-1则采用Scharr算子进行运算
6.scale:计算导数值时所采用的缩放因子,默认为1
7.delta:加在目标图像上的值,默认为0
8.borderType:边界样式
代码:
sobel = cv2.Sobel(img,cv2.CV_64F,1,0)
sobel_img = cv2.convertScaleAbs(sobel)
3.Laplacian算子:
使用场景:
拉普拉斯算子适用于更加精细的边缘检测,但对噪声比较明感,通常需要与其他滤波方法(如高斯滤波)结合使用
参数:
1.src:输入图像
2.ddepth:输出图像的深度
3.ksize:计算二阶导数的核尺寸大小
4.scale:计算拉普拉斯值的缩放比例,默认为1
5.delta:加到目标图像上的值,默认为0
6.borderType:边界样式
使用:
通常处理图像为8位图类型(cv2.CV_8U),若结果也是该类型则会导致所有负数自动截断为0,为了避免信息丢失,计算时通常采用cv2.CV_64F,然后再通过绝对值计算转换位8位图类型
代码:
lap = cv2.Laplacian(img,cv2.CV_64F)
edge_img = cv2.convertScaleAbs(lap)
形态学算子
1.腐蚀运算
算子:cv2.erode()
参数:
image:图像源
kernel:腐蚀核大小
iterations:腐蚀次数
场景:适用于去除小的白色噪声和分离连接的物体
2.膨胀运算
算子:cv2.dilate()
参数:
image:图像源
kernel:膨胀核大小
iterations:膨胀次数
场景:会增加图像中的白色区域,或增加前景目标的尺寸大小
3.开运算
算子:cv2.morphologyEX()
参数:
image:图像源
morph:运算子(cv2.MORPH_OPEN)
kernel:运算核大小
场景:先腐蚀后膨胀,用于消除细小的物体,在纤细点处分离物体,平滑较大物体的边界
4.闭运算
算子:cv2.morphologyEX()
参数:
image:图像源
morph:运算子(cv2.MORPH_CLOSE)
kernel:运算核大小
场景:先膨胀后腐蚀,填充前景物体中的小洞或前景物体上的小黑点
模板匹配
def mutil_temp_detect(self,roi_img):
res_simi = 0
temp_imgs = os.listdir(self.temp_dir)
# 灰度图转换
gray_img = cv2.cvtColor(roi_img,cv2.COLOR_BGR2GRAY)
# 直方图计算
hist_roi = cv2.calcHist([gray_img],[0],None,[256],[0,256])
# 归一化
cv2.normalize(hist_roi,hist_roi,alpha=0,beta=1,norm_type=cv2.NORM_MINMAX)
for img_path in temp_imgs:
temp_img = cv2.imread(self.temp_dir+img_path)
# 灰度图转换
temp_img = cv2.cvtColor(temp_img,cv2.COLOR_BGR2GRAY)
# 直方图计算
hist_temp = cv2.calcHist([temp_img],[0],None,[256],[0,256])
# 归一化
cv2.normalize(hist_temp,hist_temp,alpha=0,beta=1,norm_type=cv2.NORM_MINMAX)
# 相似度计算
similarity = cv2.compareHist(hist_temp,hist_roi,cv2.HISTCMP_CORREL)
# 输出百分比
res_simi = round(similarity,2)
return res_simi
简单模板匹配:
算子:cv2.matchTemplate()
参数:
image:待匹配原图像
templ:用来匹配的模板图像
method:匹配方法,例如:cv2.TM_CCOEFF_NORMED
代码:
res = cv2.matchTemplate(roi_img,temp_img,cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)
print(f"匹配分数:{max_val}")
if max_val > 0.8:
print("匹配成功")
公众号关注“CrazyNET”,获取更多资源。