版权声明:本文为博主原创文章,未经博主允许不得转载。 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阈值判断.效果如下: