OpenCV图像边缘检测算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/missyougoon/article/details/81152682

前言

图像边缘检测的两种方法,第一种使用OpenCV提供的API,第二种手动写一个简单的算法实现.先放原图如下:
原图片

1.使用OpenCV提供的方法

import cv2
import numpy as np
import random

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# canny 1 gray; 2 高斯; 3 canny
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
imgG = cv2.GaussianBlur( gray, (3,3), 0 )
dst = cv2.Canny(img, 50, 50)
cv2.imshow('image', dst)
cv2.waitKey(0)

处理之后的图片如下:
边缘检测

手动写一个算法

import cv2
import numpy as np
import math

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# sobel 算法 1 算子模板 2 图片卷积 3 阈值判决
# [  1  2  1          [ 1 0 -1
#    0  0  0            2 0 -2
#   -1 -2 -1 ]          1 0 -1 }
# 卷积 dst
# sqrt(a*a + b*b) = f > th
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)

for i in range(height-2):
    for j in range(width-2):
        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]+gray[i+1,j]*2+gray[i+2,j]-gray[i,j+2]-gray[i+1,j+2]*2-gray[i+2,j+2]
        #grad = np.sqrt(gy**2 + gx**2)
        grad = math.sqrt(gy**2 + gx**2)
        if grad > 50:
            dst[i,j] = 255
        else:
            dst[i,j] = 0

cv2.imshow('image', dst)
cv2.waitKey(0)

需要三步:1,算子模板;2,图片卷积;3阈值判断.效果如下:
边缘检测

猜你喜欢

转载自blog.csdn.net/missyougoon/article/details/81152682