综述:
Canny 边缘检测是一种非常流行的边缘检测算法。
滞后阈值参照表:
图像的灰度梯度 | 判定结果 |
---|---|
> maxVal | 真的边界 |
< minVal | 非边界 |
minVal < … < maxVal | 如果这个点是否与某个被确定为真正的边界点相连,就认为它也是边界点,如果不是就抛弃 |
实验思路:
- 设置对照试验,一组在Canny边缘检测前 不经过 高斯滤波处理,一组 有先经过 高斯滤波处理(由于边缘检测容易受到噪声影响,预先使用 5x5 的高斯滤波器 去除噪声);
- 在多组不同的 滞后阀值 的设定下,分别进行Canny边缘检测;
- 将两组边缘检测结果以图片格式分别存入 without_with_Gaussian_filter 和 pretreated_with_Gaussian_filter 两个文件夹;
- 依次从这两个文件夹中取出同名图片,左右拼接在一起(左半边是未经过高斯滤波的边缘检测结果,右边是已预先经过高斯滤波处理的),存入 concatenate 文件夹 。
Demo:
原始图像
(../pic/girl.jpg):
拼接后的对照图像
(左半边是未经过高斯滤波的边缘检测结果,右边是已预先经过高斯滤波处理的)
minVal = 0, maxVal = 50 (../pic/concatenate/canny_edge[000,050].jpg):
minVal = 0, maxVal = 100 (../pic/concatenate/canny_edge[000,100].jpg):
minVal = 0, maxVal = 150 (../pic/concatenate/canny_edge[000,150].jpg):
minVal = 0, maxVal = 200 (../pic/concatenate/canny_edge[000,200].jpg):
minVal = 0, maxVal = 250 (../pic/concatenate/canny_edge[000,250].jpg):
minVal = 50, maxVal = 100 (../pic/concatenate/canny_edge[050,100].jpg):
minVal = 50, maxVal = 150 (../pic/concatenate/canny_edge[050,150].jpg):
minVal = 50, maxVal = 200 (../pic/concatenate/canny_edge[050,200].jpg):
minVal = 50, maxVal = 250 (../pic/concatenate/canny_edge[050,250].jpg):
minVal = 100, maxVal = 150 (../pic/concatenate/canny_edge[100,150].jpg):
minVal = 100, maxVal = 200 (../pic/concatenate/canny_edge[100,200].jpg):
minVal = 100, maxVal = 250 (../pic/concatenate/canny_edge[100,250].jpg):
minVal = 150, maxVal = 200 (../pic/concatenate/canny_edge[150,200].jpg):
minVal = 150, maxVal = 250 (../pic/concatenate/canny_edge[150,250].jpg):
minVal = 200, maxVal = 250 (../pic/concatenate/canny_edge[200,250].jpg):
附上自己写的实验代码:
# -*- coding: utf-8 -*-
import cv2
import os
import numpy as np
Min_Max = [(0, 50), (0, 100), (0, 150), (0, 200), (0, 250),
(50, 100), (50, 150), (50, 200), (50, 250),
(100, 150), (100, 200), (100, 250),
(150, 200), (150, 250),
(200, 250)]
pic = cv2.imread('../pic/girl.jpg')
try:
os.mkdir('../pic/pretreated_with_Gaussian_filter')
os.mkdir('../pic/without_Gaussian_filter')
os.mkdir('../pic/concatenate')
except OSError:
pass
# 不经过 高斯滤波处理 去除噪声
for min_max in Min_Max:
min = min_max[0]
max = min_max[1]
edges = cv2.Canny(pic, min, max)
edges = np.expand_dims(edges, axis=2)
# cv2.imshow('canny_edge[{:>03},{:>03}]'.format(min, max), edges)
# cv2.waitKey(2000)
# cv2.destroyAllWindows()
cv2.imwrite('../pic/without_Gaussian_filter/canny_edge[{:>03},{:>03}].jpg'.format(min, max), edges)
# 有先经过 高斯滤波处理 去除噪声
pic = cv2.GaussianBlur(src=pic, ksize=(5, 5), sigmaX=0, sigmaY=0)
for min_max in Min_Max:
min = min_max[0]
max = min_max[1]
edges = cv2.Canny(pic, min, max)
edges = np.expand_dims(edges, axis=2)
# cv2.imshow('canny_edge[{:>03},{:>03}]'.format(min, max), edges)
# cv2.waitKey(2000)
# cv2.destroyAllWindows()
cv2.imwrite('../pic/pretreated_with_Gaussian_filter/canny_edge[{:>03},{:>03}].jpg'.format(min, max), edges)
# 组合显示图片 进行对比
image_no_gaussian_paths = [os.path.join('../pic/without_Gaussian_filter', path) for path in os.listdir('../pic/without_Gaussian_filter')]
image_with_gaussian_paths = [path.replace('without_Gaussian_filter', 'pretreated_with_Gaussian_filter') for path in image_no_gaussian_paths]
for (image_no_gaussian_path, image_with_gaussian_path) in zip(image_no_gaussian_paths, image_with_gaussian_paths):
image_no_gaussian = cv2.imread(image_no_gaussian_path)
image_with_gaussian = cv2.imread(image_with_gaussian_path)
concat_pic = np.concatenate([image_no_gaussian, image_with_gaussian], axis=1)
# cv2.imshow(image_no_gaussian_path[-23:-4], concat_pic)
# cv2.waitKey(2000)
# cv2.destroyAllWindows()
cv2.imwrite('../pic/concatenate/{:>03}.jpg'.format(image_no_gaussian_path[-23:-4]), concat_pic)