文章目录
- 前言
- 1、Canny边缘检测算法
- 2、代码1
- 函数
- 3、代码2
- 4、基于tensor数据的代码
前言
最近在向卷积神经网络里的数据预处理和数据增强部分加这个函数,记录一下。
1、Canny边缘检测算法
Canny边缘检测算法是一种经典的边缘检测算法,其基本原理如下:
- 噪声去除:首先,使用高斯滤波器降噪,以平滑图像。
为了尽可能减少噪声对边缘检测结果的影响,所以必须滤除噪声以防止由噪声引起的错误检测。为了平滑图像,使用高斯滤波器与图像进行卷积,该步骤将平滑图像,以减少边缘检测器上明显的噪声影响。
其中Sigma为方差,k确定核矩阵的维数。高斯卷积核大小的选择将影响Canny检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。一般选取5x5。
-
梯度计算:然后,使用Sobel算子计算图像的梯度强度和方向。梯度方向垂直于边缘,因此它可以用来定位边缘。
-
非极大值抑制:在此步骤中,将梯度强度图像中的所有像素转换为它们在局部最大方向上的梯度强度,以消除边缘宽度。
非极大值抑制是一种边缘稀疏技术,非极大值抑制的作用在于“瘦”边。对图像进行梯度计算后,仅仅基于梯度值提取的边缘仍然很模糊。对于标准3,对边缘有且应当只有一个准确的响应。而非极大值抑制则可以帮助将局部最大值之外的所有梯度值抑制为0。
将当前像素的梯度强度与沿正负梯度方向上的两个像素进行比较。
如果当前像素的梯度强度与另外两个像素相比最大,则该像素点保留为边缘点,否则该像素点将被抑制。
-
双阈值检测:使用双阈值检测来确定哪些边缘是真实的边缘。如果像素的梯度强度大于高阈值,则将其视为边缘像素。如果像素的梯度强度小于低阈值,则其被排除在边缘之外。如果像素的梯度强度在两个阈值之间,则只有当该像素与高梯度强度像素相连时,才将其视为边缘像素。
-
边缘跟踪:最后,使用边缘跟踪算法来连接所有真实的边缘像素,以形成完整的边缘。
Canny算法多用于图像处理、计算机视觉和机器人等领域。
2、代码1
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
'''canny边缘提取'''
def canny_demo(image):
# 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
blur=cv.GaussianBlur(image,(7,7),0)
#2.灰度处理
gray=cv.cvtColor(blur,cv.COLOR_BGR2GRAY)
#3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
grad_x=cv.Sobel(gray,cv.CV_16SC1,1,0)
grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
#4.求边缘
edge_output=cv.Canny(grad_x,grad_y,50,150)#参数:x梯度,y梯度 ,低阈值,高阈值
#cv.imshow('canny-demo',edge_output)
dst=cv.bitwise_and(image,image,mask=edge_output)
#cv.imshow('color edge',dst)
return dst
img=cv.imread(r"D:/code/data/319.jpg")
print(img.shape)
cv.imshow('origin',img)
dst = canny_demo(img)
cv.imshow('dst',dst)
cv.waitKey(0)
print(dst.shape)
函数
def Canny(image):
# 1.高斯模糊:最后两个参数给定一个就可以自动求取另一个,所以只给其中一个赋值就可以
blur = cv.GaussianBlur(image, (7, 7), 0)
# 2.灰度处理
gray = cv.cvtColor(blur, cv.COLOR_BGR2GRAY)
# 3.求取梯度,也可以不用梯度,直接将灰度图传入cv.canny
grad_x = cv.Sobel(gray, cv.CV_16SC1, 1, 0)
grad_y = cv.Sobel(gray, cv.CV_16SC1, 0, 1)
# 4.求边缘
edge_output = cv.Canny(grad_x, grad_y, 50, 150) # 参数:x梯度,y梯度 ,低阈值,高阈值
dst = cv.bitwise_and(image, image, mask=edge_output)
return dst
3、代码2
import cv2
import numpy as np
Type = 0 # 阈值处理方式
Value = 0 # 使用的阈值
T = 0
V = 0
def onType(a):
Type = cv2.getTrackbarPos(tType, windowName)
Value = cv2.getTrackbarPos(tValue, windowName)
ret, dst = cv2.threshold(o, Value, 255, Type)
cv2.imshow(windowName, dst)
global T
T = Type
def onValue(a):
Type = cv2.getTrackbarPos(tType, windowName)
Value = cv2.getTrackbarPos(tValue, windowName)
ret, dst = cv2.threshold(o, Value, 255, Type)
cv2.imshow(windowName, dst)
global V
V = Value
o = cv2.imread(r"D:/code/data/319.jpg")
# 灰度转换
gray = cv2.cvtColor(o, cv2.COLOR_BGR2GRAY)
# cv2.imshow('gray', gray)
windowName = 'output'
cv2.namedWindow(windowName)
cv2.imshow(windowName, gray)
# 构建滚动条
tType = 'Type'
tValue = 'tValue'
cv2.createTrackbar(tType, windowName, 0, 4, onType)
cv2.createTrackbar(tValue, windowName, 0, 255, onValue)
while 1:
k = 0xFF & cv2.waitKey(1)
if k == 27:
break
elif k == ord('s'):
realType = T
realValue = V
retval, img = cv2.threshold(gray, realValue, 255, realType)
cv2.imshow('output.jpg', img)
cv2.imwrite("D:/code/data/output.jpg", img)
output = cv2.imread("D:/code/data/output.jpg")
print(output.shape)
# 高斯滤波平滑处理
gauss = cv2.GaussianBlur(output, (3, 3), 0, 0)
# cv2.imshow('gauss',gauss)
# 滤波除噪
k = np.ones((5, 5), np.uint8)
_open = cv2.morphologyEx(gauss, cv2.MORPH_OPEN, k)
_close = cv2.morphologyEx(_open, cv2.MORPH_CLOSE, k)
cv2.imshow('_close', _close)
cv2.imwrite("D:/code/data/output2.jpg", _close)
cv2.destroyAllWindows()
4、基于tensor数据的代码
这个我还没找到。