39. 边缘检测

2019-11-12  本文已影响0人  十里江城

本文解释Canny和sobel边缘检测算法。

1)Canny算法实现

步骤:

import cv2
import numpy as np
import random

img = cv2.imread('face.jpg', 1) 
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 模板大小:(3, 3)   (高斯模糊后图像质量降低)
imgG = cv2.GaussianBlur(gray, (3, 3), 0)

# 50 50 两个边缘门限
dst = cv2.Canny(img, 50, 50)

cv2.imshow('src', img)
cv2.imshow('img GaussianBlur', imgG)
cv2.imshow('dst', dst)
cv2.waitKey(0)

效果如下:

image.png

2)Sobel算法原理与实现

步骤:

import cv2
import numpy as np
import random
# 算法模块
import math

# 1 读取灰度图
img = cv2.imread('1.jpg', 1) 
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

# 2 用算子模板进行卷积(算子: 函数到函数/值的映射)
dst = np.zeros((height, width, 1), np.uint8)
# 算子模板
# [1  2  1         [ 1 0 -1
# 0  0  0            2 0 -2
# -1 -2 -1]          1 0 -1]
for i in range(0, height - 2):
    for j in range(0, width - 2):
        # 图像卷积
        # y方向梯度
        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)
        # x方向梯度
        gx = gray[i, j] * 1 + gray[i, j + 1] * 0 + gray[i, j + 2] * (-1) + gray[i + 1, j] * 2 + gray[i + 1, j + 1] * 0 + gray[i + 1, j + 1] * (-2) + gray[i + 2, j] * 1 + gray[i + 2, j + 1] * 0 + gray[i + 2, j + 2] * (-1)
        grad = math.sqrt(gx * gx + gy * gy)
        
        # 3 阈值判决
        if grad > 50:
            dst[i, j] = 255
        else:
            dst[i, j] = 0
# 4 显示边缘
cv2.imshow('src', img)
cv2.imshow('dst', dst)
cv2.waitKey(0)

效果如下:


image.png
上一篇 下一篇

猜你喜欢

热点阅读