7.4.1 soble边缘检测
    图像的彩色信息在进行边缘检测时通常是多余的,因此可以在进行边缘检测前先把彩色图像转换成灰度图像。直观的感觉,灰度图像中的边缘一定是变化相对比较剧烈的区域,那么这个区域灰度值的一阶导数便是取极大值或者极小值。
    图7-15 小猪佩奇铅笔画
    soble边缘检测(见图7-16)正是基于这一原理,在opencv中的函数定义如下:
    sobel(src, ddepth, dx, dy, ksize=none, scale=none, delta=none, bordertype=none)
    其中主要的参数如下。
    ? ddepth:深度类型,通常用cv2.cv_64f表示64位浮点数即64 float。
    ? dx:x方向的导数,1表示取导,0表示不取导。
    ? dy:y方向的导数,1表示取导,0表示不取导。
    ? ksize:卷积核大小。
    图7-16 soble边缘检测示意图
    首先加载需要的库文件:
    import cv2
    from matplotlib import pyplot as plt
    import numpy as np
    加载测试图片(见图7-17a),并转换成灰度图像:
    img=cv2.imread("../picture/smallpig.jpeg")
    gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
    对图像进行边缘检测(见图7-17b):
    #sobel边缘检测
    sobel = cv2.sobel(gray_img,cv2.cv_64f,0,1)
    为了显示方便,对图像进行反转,黑色和白色会颠倒(见图7-17c),后面的案例默认都会进行翻转显示。
    notsobel=cv2.bitwise_not(sobel)
    图7-17 soble边缘检测示例(一)
    需要指出的是,当dx设置为1表示在x轴方向上进行边缘检测,当dy设置为1表示在y轴方向上进行边缘检测。如图7-18所示,一共有四个子图,子图a是原始图像,子图b对y轴方向取导,仅在y轴方向的边缘会被忽略,子图c对x轴方向取导,仅在x轴方向的边缘会被忽略,子图d对x轴和y轴两个方向同时取导,在x轴和y轴方向的边缘都会被忽略。
    img=cv2.imread("../picture/sobel.jpeg")
    gray_img=cv2.cvtcolor(img, cv2.color_rgb2gray)
    #sobel边缘检测
    sobel01 = cv2.sobel(gray_img,cv2.cv_64f,0,1)
    #对二值图像进行反转,黑白颠倒
    sobel01=cv2.bitwise_not(sobel01)
    #sobel边缘检测
    sobel10 = cv2.sobel(gray_img,cv2.cv_64f,1,0)
    #对二值图像进行反转,黑白颠倒
    sobel10=cv2.bitwise_not(sobel10)
    #sobel边缘检测
    sobel11 = cv2.sobel(gray_img,cv2.cv_64f,1,1)
    #对二值图像进行反转,黑白颠倒
    sobel11=cv2.bitwise_not(sobel11)
    图7-18 soble边缘检测示例(二)

章节目录

智能系统与技术丛书·AI安全之对抗样本入门所有内容均来自互联网,一曲书屋只为原作者兜哥的小说进行宣传。欢迎各位书友支持兜哥并收藏智能系统与技术丛书·AI安全之对抗样本入门最新章节