opencv: Canny边缘检测(图示+源码)

综述:

Canny 边缘检测是一种非常流行的边缘检测算法。

滞后阈值参照表:

图像的灰度梯度判定结果
> maxVal真的边界
< minVal非边界
minVal < … < maxVal如果这个点是否与某个被确定为真正的边界点相连,就认为它也是边界点,如果不是就抛弃

实验思路:

  1. 设置对照试验,一组在Canny边缘检测前 不经过 高斯滤波处理,一组 有先经过 高斯滤波处理(由于边缘检测容易受到噪声影响,预先使用 5x5 的高斯滤波器 去除噪声);
  2. 在多组不同的 滞后阀值 的设定下,分别进行Canny边缘检测;
  3. 将两组边缘检测结果以图片格式分别存入 without_with_Gaussian_filterpretreated_with_Gaussian_filter 两个文件夹;
  4. 依次从这两个文件夹中取出同名图片,左右拼接在一起(左半边是未经过高斯滤波的边缘检测结果,右边是已预先经过高斯滤波处理的),存入 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)


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值