【OpenCV官网--python】函数cv::Canny实现Canny边缘检测器

例子源于OpenCV官网手册(https://docs.opencv.org/4.x/da/d5c/tutorial_canny_detector.html)
使用OpenCV函数cv::Canny实现Canny边缘检测器。

该代码功能:
要求用户输入一个数值来设置我们的Canny边缘检测器的较低阈值(通过Trackbar)。
应用Canny检测器并生成一个蒙版(黑色背景上代表边缘的亮线)。
将获得的蒙版应用于原始图像并显示在窗口中。

代码:

from __future__ import print_function
import cv2 as cv
import argparse

#定义变量
max_lowThreshold = 100#高阈值
window_name = 'Edge Map'
title_trackbar = 'Min Threshold:'
ratio = 3
kernel_size = 3#内核大小

#加载图像
def CannyThreshold(val):
    low_threshold = val#将val赋值给低阈值
    img_blur = cv.blur(src_gray, (3,3))#图像模糊处理
    detected_edges = cv.Canny(img_blur, low_threshold, low_threshold*ratio, kernel_size)#用canny算子检测边缘
    mask = detected_edges != 0
    dst = src * (mask[:,:,None].astype(src.dtype))
    #属性dtype用于说明数组中的数据类型的对象
    #astype()函数用于转换数据类型dtype
    cv.imshow(window_name, dst)
parser = argparse.ArgumentParser(description='Code for Canny Edge Detector tutorial.')
parser.add_argument('--input', help='Path to input image.', default='house.png')
args = parser.parse_args()
#src = cv.imread(cv.samples.findFile(args.input))


src = cv.imread(r'D:\zhiyanyuan\house.png')
if src is None:
    print('Could not open or find the image: ', args.input)
    exit(0)
    #转为灰度图
src_gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
#创建窗口用于展示结果
cv.namedWindow(window_name)
#创建一个Trackbar,让用户输入Canny检测器的较低阈值
cv.createTrackbar(title_trackbar, window_name , 0, max_lowThreshold, CannyThreshold)
CannyThreshold(0)
cv.waitKey()

运行结果:
原图:
【OpenCV官网--python】函数cv::Canny实现Canny边缘检测器_第1张图片

canny边缘检测图像:
【OpenCV官网--python】函数cv::Canny实现Canny边缘检测器_第2张图片
【OpenCV官网--python】函数cv::Canny实现Canny边缘检测器_第3张图片
可以看到阈值很低的时候线条更多,当然"伪边缘"更多,当阈值很高的时候,"伪边缘"减少了,但也丢失了更多的细节。所以需要根据自己实际的图片数据去调参。

你可能感兴趣的:(OpenCV,opencv,python,计算机视觉)