# coding: utf-8
# !/usr/bin/python
"""
@File : Canny 边缘检测.py
@Author : jiaming
@Modify Time: 2020/2/3 12:48
@Contact :
@Version : 1.0
@Desciption : Canny 边缘检测
cv2.Canny()
"""
"""
Canny 边缘检测算法步骤:
1. 噪声去除
使用 5x5 的高斯滤波器去除噪声
2. 计算图像梯度
对平滑后的图像使用 Sobel 算子计算水平方向和竖直方向的一阶导数(Gx, Gy)找到边界的梯度和方向。
梯度的方向一般总是与边界垂直。梯度方向被归为四类:垂直、水平和两个对角线。
3. 非极大值抑制
在获得梯度的方向和大小之后,应该对整幅图像做一个扫描,去除那些非边界上的点。
对每一个像素进行检查。看这个点的梯度是不是周围具有相同梯度方向的点中最大的。
4. 滞后阈值
现在要确定哪些边界才是真正的边界。这时我们需要设置两个阈值:minVal 和 maxVal。当图像的灰度梯度高于
maxVal 时被认为是真的边界,那些低于 minVal 的边界会被抛弃。
如果介于两者之间的话,就要看这个点是否与某个被确定为真正的边界点相连,如果是就认为它也是边界点,如果不是就抛弃。
"""
import os
import sys
import numpy as np
import cv2
import pprint
from matplotlib import pyplot as plt
rawPath = os.path.abspath(__file__)
currentFile = os.path.basename(sys.argv[0])
dataPath = rawPath[:rawPath.find(currentFile)] + r'static\\'
img = cv2.imread(dataPath + 'j.png', 0)
edges = cv2.Canny(img, 100, 200)
plt.subplot(1, 2, 1), plt.imshow(img, cmap='gray')
plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(1, 2, 2), plt.imshow(edges, cmap='gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])
plt.show()