首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv: Canny边缘检测(图示+源码)

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

作者头像
JNingWei
发布2018-09-28 15:58:02
3.9K0
发布2018-09-28 15:58:02
举报
文章被收录于专栏:JNing的专栏JNing的专栏

综述:

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)


本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 综述:
  • 滞后阈值参照表:
  • 实验思路:
  • Demo:
    • 原始图像
      • 拼接后的对照图像
      • 附上自己写的实验代码:
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档