• 使用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

  • 相关阅读:
    计算机网络知识技能水平的测评试题
    Socket与系统调用深度分析
    学习构建调试Linux内核网络代码的环境MenuOS系统
    深入学习socket网络编程,以java语言为例
    网络配置工具iproute2和net-tools的基本原理和基本使用方法
    Linux系统学习总结报告
    结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程
    深入理解系统调用-40号调用
    基于mykernel2.0 编写一个操作系统内核
    交互式多媒体图书平台的设计与实现
  • 原文地址:https://www.cnblogs.com/wojianxin/p/12504622.html
Copyright © 2020-2023  润新知