首页 > 其他 > 详细

使用Sobel算子检测图像的水平特征和垂直特征

时间:2020-03-16 17:08:23      阅读:126      评论:0      收藏:0      [点我收藏+]

一. 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

使用Sobel算子检测图像的水平特征和垂直特征

原文:https://www.cnblogs.com/wojianxin/p/12504622.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!