zoukankan      html  css  js  c++  java
  • 使用Sobel算子检测图像的水平特征和垂直特征

    一. sobel滤波器介绍

            sobel滤波器常用来提取灰度图像的水平边缘(水平特征)和竖直边缘(竖直特征)


    二. sobel算子        


    纵向算子,提取图像水平边缘 ↑
     

    横向算子,提取图像竖直边缘 ↑
     

    三. 实验:python实现sobel算子并将算子作用于图像

    import cv2
    
    import numpy as np
    
    # Gray scale
    
    def BGR2GRAY(img):
    
        b = img[:, :, 0].copy()
    
        g = img[:, :, 1].copy()
    
        r = img[:, :, 2].copy()
    
        # Gray scale
    
        out = 0.2126 * r + 0.7152 * g + 0.0722 * b
    
        out = out.astype(np.uint8)
    
        return out
    
    # sobel filter
    
    def sobel_filter(img, K_size=3):
    
        if len(img.shape) == 3:
    
            H, W, C = img.shape
    
        else:
    
            H, W = img.shape
    
        # Zero padding
    
        pad = K_size // 2
    
        out = np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)
    
        out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)
    
        tmp = out.copy()
    
        out_v = out.copy()
    
        out_h = out.copy()
    
        ## Sobel vertical
    
        Kv = [[1., 2., 1.],[0., 0., 0.], [-1., -2., -1.]]
    
        ## Sobel horizontal
    
        Kh = [[1., 0., -1.],[2., 0., -2.],[1., 0., -1.]]
    
        # filtering
    
        for y in range(H):
    
            for x in range(W):
    
                out_v[pad + y, pad + x] = np.sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
    
                out_h[pad + y, pad + x] = np.sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
    
        out_v = np.clip(out_v, 0, 255)
    
        out_h = np.clip(out_h, 0, 255)
    
        out_v = out_v[pad: pad + H, pad: pad + W].astype(np.uint8)
    
        out_h = out_h[pad: pad + H, pad: pad + W].astype(np.uint8)
    
        return out_v, out_h
    
    # Read image
    
    img = cv2.imread("../paojie.jpg").astype(np.float)
    
    # grayscale
    
    gray = BGR2GRAY(img)
    
    # sobel filtering
    
    out_v, out_h = sobel_filter(gray, K_size=3)
    
    # Save result
    
    cv2.imwrite("out_g.jpg",gray)
    
    cv2.imshow("result_g",gray)
    
    cv2.imwrite("out_v.jpg", out_v)
    
    cv2.imshow("result_v", out_v)
    
    cv2.imwrite("out_h.jpg", out_h)
    
    cv2.imshow("result_h", out_h)
    
    cv2.waitKey(0)
    
    cv2.destroyAllWindows()

    四. 实验结果


    原图 ↑
     

    原图转换为灰度图像 ↑
     

    sobel横向算子提取了图像的竖直特征 ↑
     

    sobel纵向算子提取了图像的水平特征 ↑
     

            从本实验结果我们观察到,在提取图像在水平或者垂直方向上的线条或轮廓时,可以使用sobel算子。


    五. 参考内容:

      https://www.jianshu.com/p/4b13fc189eba

  • 相关阅读:
    关于虚拟机断电导致的 generating /run/initramfs/rdsosreport.txt 问题优秀解决方案
    centos7 yum 阿里源
    startup.bat脚本启动tomcat时,cmd命令窗口闪现问题及Neither the JAVA_HOME nor the JRE_HOME environment variable is defined 错误解决
    Linux 中 Fish Shell
    卸载mysql
    /bin/bash^M: 坏的解释器: 没有那个文件或目录
    elementUI 文本鼠标移入显示太长
    el-upload 手动上传文件
    vue-element-admin 打包测试环境报错
    vue 分页跳转页面详情,返回记住当前点击第几页
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12504622.html
Copyright © 2011-2022 走看看