Prewitt滤波器的实现,对比Prewitt滤波器和Sobel滤波器提取图像边缘的效果

一. Prewitt滤波器简介

        Prewitt是一种常用的检测图像边缘的滤波器,它分为横向和纵向算子,分别用于检测纵向和横向的边缘(注意:横向形式的滤波器检测图像的纵向边缘,纵向形式的滤波器检测图像的横向边缘)。

横向Prewitt滤波器(检测纵向边缘) ↑

纵向Prewitt滤波器(检测横向边缘) ↑


二. Prewitt滤波器和Sobel滤波器比较

        注意比较记忆 Prewitt 滤波器和 Sobel 滤波器,它们在形式和功能上十分相近,Sobel滤波器的算子如下两图:

Sobel 纵向算子,提取图像横向边缘 ↑  

Sobel 横向算子,提取图像纵向边缘 ↑


三. 实验:实现 Prewitt 算子并用算子对图像进行边缘检测

import cv2

import numpy as np

# prewitt filter

def prewitt_filter(img, K_size=3):

    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()

    ## prewitt vertical kernel

    Kv = [[-1., -1., -1.],[0., 0., 0.], [1., 1., 1.]]

    ## prewitt horizontal kernel

    Kh = [[-1., 0., 1.],[-1., 0., 1.],[-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 Gray image

img = cv2.imread("../paojie_g.jpg",0).astype(np.float)

# prewitt filtering

out_v, out_h = prewitt_filter(img, K_size=3)

# Save result

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()

四. 实验结果:

原图 ↑

Prewitt 横向算子滤波结果(过滤得到纵向边缘) ↑

Prewitt 纵向算子滤波结果(过滤得到横向边缘) ↑

        我同时用同样大小的 Sobel算子 对同样图像进行了边缘检测,结果如下:

Sobel 横向算子滤波结果(过滤得到纵向边缘) ↑  

Sobel 纵向算子滤波结果(过滤得到横向边缘) ↑    

        从实验结果,我们可以观察到,对比使用 Sobel算子 和 Prewitt算子 进行图像边缘检测 ,Sobel滤波器能够获得更加清晰明亮的边缘。


五. 参考内容:

        https://www.cnblogs.com/wojianxin/p/12505321.html

        https://www.jianshu.com/p/53ac8ffda399

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值