026-OpenCV边缘检测图片

终于到这了,当初为啥会想学OpenCV,就是因为玩树莓派的时候网上找了一个OpenCV摄像头 Canny边缘检测的例子,当时我也不知道具体啥原理,觉得逼格好高…就发了条说说想装个逼,有人评论说出是Canny边缘检测,顿时感觉自己被打脸…今天算是找回场子了吧。
话不多说,上代码,看结果。

import cv2           # 导入库
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('15.jpg', 0)
'''
    cv2.blur(src, ksize, dst, anchor, borderType)
    均值滤波
# 用邻域内像素均值来代替该点像素值,均值滤波在去噪的同时也破坏了图像细节部分
#  src 要滤波的图像   ksize 内核的大小  anchor 锚点,即要平滑的点,默认值(-1, -1),即在核中心
#  ksize(3, 3)表示3 * 3的核大小
# dst 输出图像
# borderType 图像像素边界类型,默认就行
'''
img = cv2.blur(img, (5, 5))
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
'''
    cv2.Canny(image, threshold1, threshold2, edges, apertureSize, L2gradient)
# src 输入图像 dst 输出边缘图像
# threshold1: 滞后阈值低阈值(用于边缘连接) threshold2: 滞后阈值高阈值(控制边缘初始段)
# 推荐高低阈值比值在2:1到3:1之间
# apertureSize: 表示Sobel算子孔径大小, 默认值3
# L2gradient: 计算图像梯度幅值的标识
'''
img1 = cv2.Canny(img, 30, 100)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img1', img1)
'''
    cv2.Sobel(src, ddepth, dx, dy, dst, ksize, scale, delta, borderType)
# src 输入图像 dst 输出边缘图像
# ddepth 输出图像的深度 cv2.CV_8U(8位无符号数)、CV_16S(16位无符号数)
# CV_16U(16位有符号数) CV_32F(32位浮点数) CV_64F(64位浮点数)
# 若src.depth() = CV_8U, 取ddepth =-1/CV_16S/CV_32F/CV_64F 
# 若src.depth() = CV_16U/CV_16S, 取ddepth =-1/CV_32F/CV_64F 
# 若src.depth() = CV_32F, 取ddepth =-1/CV_32F/CV_64F 
# 若src.depth() = CV_64F, 取ddepth = -1/CV_64F 
# 取-1时, ddepth = src.depth()
# dx X方向上的差分阶数   dy Y方向上的差分阶数   当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数
# ksize  默认值3, 表示Sobel核大小, 1,3,5,7   scale  计算导数值时的缩放因子, 默认值1, 表示不缩放,效果通常使梯度图更亮
# delta(δ) 表示在结果存入目标图之前可选的delta值, 默认值0  在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
# borderType 决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT
'''
'''
        Sobel边缘检测咋检测?
# 先求X方向和Y方向的一阶导数,换句能理解的就是两方向的梯度、图像的深度
# 再将图像深度改为CV_8U,cv2.imshow()默认cv2.CV_8U(8位无符号数)
# absX、absY 图像合成一张图
# Sobel边缘检测完成
'''
dx = cv2.Sobel(img, cv2.CV_16S, 1, 0)
dy = cv2.Sobel(img, cv2.CV_16S, 0, 1)
'''
    cv2.convertScaleAbs(src[,alpha[,beta]])
# src 输入图像 alpha 比例因子  beta 保存新图像(数组)前可以增加的值
'''
absX = cv2.convertScaleAbs(dx)
absY = cv2.convertScaleAbs(dy)
img2 = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('dx', absX)
cv2.imshow('dy', absY)
cv2.imshow('img2', img2)

'''
    cv2.Laplacian(src, ddepth, dst, ksize, scale, delta, borderType)
    用来判断图像模糊度的
# src 输入图像 dst 输出边缘图像
# ddepth 图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度
# ksize  默认值3, 表示Sobel核大小, 1,3,5,7   scale  计算导数值时的缩放因子, 默认值1, 表示不缩放,效果通常使梯度图更亮
# delta(δ) 表示在结果存入目标图之前可选的delta值, 默认值0  在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
# borderType 决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT
'''
img3 = cv2.Laplacian(img, cv2.CV_16S, ksize=3)
img3 = cv2.convertScaleAbs(img3)
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img3', img3)
'''
cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
cv2.destroyAllWindows() 
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
026-OpenCV边缘检测图片_第1张图片
026-OpenCV边缘检测图片_第2张图片
026-OpenCV边缘检测图片_第3张图片
就先这样,遇到别的再补充。

你可能感兴趣的:(OpenCV学习,opencv,计算机视觉,python,pycharm,图像处理)