机器视觉新突破:掌握边缘提取、形态学算子与模板匹配三大核心算法

标题边缘提取

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”,获取更多资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值