【OpenCV】边缘检测 [API与源码实现]

【OpenCV】边缘检测 [API与源码实现]

Notes
  1. 灰度图转换
  2. 高斯滤波
  3. Canny算法

1. API调用法

import cv2
import numpy as np

img = cv2.imread("../01_Img/01.jpg", 1)
imgInfo = img.shape  # 获取图像宽高信息

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图转换
imgG = cv2.GaussianBlur(gray, (3, 3), 0)  # 高斯滤波
dst = cv2.Canny(img, 50, 50)  # 后面的50是 图片通过卷积运算后 50 为边缘点

cv2.imshow("dst", dst)
cv2.waitKey(0)




2. 源码实现

  1. 步骤:
    灰度图转换 ----> 使用Sobel 算子分别对图像 x, y 进行卷积运算 ----> 确定梯度值
    ----> 给定阈值判定边界 ----> 展示图象

  2. sobel 算子 模板:
    Y 方向:

    -1-2-1
    000
    121

    X 方向:

    -101
    -202
    -101
  3. 代码演示:

    1> 准备环境

    import math
    import cv2
    import numpy as np
    
    img = cv2.imread("../01_Img/01.jpg", 1)
    imgInfo = img.shape
    

    2> 给定阈值 并建立目标图像矩阵

    yu = 50  # 此处给定阈值为 50
    dst = np.zeros((imgInfo[0], imgInfo[1], 1), np.uint8) # 建立目标图像的空矩阵
    

    3> 灰度图像转换算法

    for i in range(0, imgInfo[0]):
        for j in range(0, imgInfo[1]):
            (b, g, r) = img[i, j]
            gray = (int(b)+int(g)+int(r))/3  # 取BGR平均值
            dst[i, j] = gray
    

    4> 边缘检测算法实现

    for i in range(0, imgInfo[0]-2):
        for j in range(0, imgInfo[1]-2):
        	# 1. 使用Sobel算子 对图像进行卷积运算
            gy = gray[i, j]*1 + gray[i, j+1]*2 + gray[i, j+2]*1 - gray[i+2, j]*1 - gray[i+2, j+1]*2 - gray[i+2, j+2]*1
            gx = gray[i, j]*1 - gray[i, j+2]*1 + gray[i+1, j]*2 - gray[i+1, j+2]*2 + gray[i+2, j]*1 - gray[i+2, j+2]*1
            # 2.梯度计算
            grad = math.sqrt(math.pow(gy, 2) + math.pow(gx, 2))
            # 3.阈值判定
            if grad > yu:
                dst[i, j] = 255
            else:
                dst[i, j] = 0
    

    5> 展示图片

    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Panzer_Jack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值