数字图像处理之图像边缘

图像边缘主要包含下面几个部分
在这里插入图片描述
导入库

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv

图片输出函数

def show(img):
    if img.ndim == 2:
        plt.imshow(img,cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR))
    plt.show()

Premitt算子

Premitt算子一般包含以下两种:
在这里插入图片描述
通过对水平方向和竖直方向的图片进行处理,然后合成,看最终的效果如何。

kx = np.array([
    [-1,0,1],
    [-1,0,1],
    [-1,0,1]
],dtype=np.float32)
ky = np.array([
    [-1,-1,-1],
    [0,0,0],
    [1,1,1]
],dtype=np.float32)
imgX = cv.filter2D(img,cv.CV_64F,kx)
imgY = cv.filter2D(img,cv.CV_64F,ky)
imgXY2 = np.abs(imgX)+np.abs(imgY)
show(np.hstack([img,np.abs(imgX).clip(0,255),np.abs(imgY).clip(0,255),np.abs(imgXY2).clip(0,255)]))

处理效果如下所示:
在这里插入图片描述

Roberts算子

Roberts算子也有两种形式,跟Premitt算子大同小异。
在这里插入图片描述

#Roberts算子
kx = np.array([
    [-1,0],
    [0,1]
],dtype=np.float32)
ky = np.array([
    [0,1],
    [1,0]
],dtype=np.float32)
imgX = cv.filter2D(img,cv.CV_64F,kx)
imgY = cv.filter2D(img,cv.CV_64F,ky)
imgXY = np.sqrt(imgX**2+imgY**2)
imgXY2 = np.abs(imgX)+np.abs(imgY)
show(np.hstack([img,np.abs(imgX).clip(0,255),np.abs(imgY).clip(0,255),np.abs(imgXY2).clip(0,255)]))

但是效果不如前者
在这里插入图片描述

Sobel-Feldman、Scharr算子

这两种算子与上面的两种算子,卷积核不一样,其余的地方大同小异,看看效果如何。
在这里插入图片描述

#soble-feldmen算子
imgX = cv.Sobel(img,cv.CV_16S,1,0)#x方向一阶偏导,y方向0阶偏导
imgY = cv.Sobel(img,cv.CV_16S,0,1)#y方向一阶偏导,x方向0阶偏导
imgXY = np.abs(imgX)+np.abs(imgY)
show(np.hstack([img,np.abs(imgX).clip(0,255),np.abs(imgY).clip(0,255),np.abs(imgXY).clip(0,255)]))
#Scharr算子
imgX = cv.Scharr(img,cv.CV_64F,1,0)
imgY = cv.Scharr(img,cv.CV_64F,0,1)
imgXY = np.sqrt(imgX**2+imgY**2)
show(np.hstack([img,np.abs(imgX).clip(0,255),np.abs(imgY).clip(0,255),np.abs(imgXY).clip(0,255)]))

soble-feldmen算子
在这里插入图片描述
Scharr算子
在这里插入图片描述

Laplacian算子

Laplacian算子基本上卷积核如下图所示:
在这里插入图片描述
opencv中有用来实现的方法

#Laplacian算子
img_lap = cv.Laplacian(img,cv.CV_64F)
show(np.abs(img_lap).clip(10,255))

在这里插入图片描述

LoG算子

LoG算子,是高斯模糊和Laplacian算子结合而成的。
在这里插入图片描述

#Log算子
img_blur = cv.GaussianBlur(img,(3,3),1)
img_log = cv.Laplacian(img_blur,cv.CV_64F)
show(np.hstack([np.abs(img_lap).clip(0,255),np.abs(img_log).clip(0,255)]))

和单纯的Laplacian相比,去除了很多噪声,emmm但是效果不是很好,可能是参数的问题。
在这里插入图片描述

Canny算法

Canny算法的处理方式:
在这里插入图片描述
opencv中自带的方法:

#canny边缘检测
img2 = cv.Canny(img,20,200)#低于20一定不是边缘,大于200就一定是强边缘,处于20-200之间的,如果靠近强边缘就一定是边缘
show(np.hstack([img,img2]))

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

starlet_kiss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值