美文网首页
图像边缘提取的实现

图像边缘提取的实现

作者: 此间不留白 | 来源:发表于2020-03-22 15:22 被阅读0次

前言

图像梯度和边缘提取的文章中,详细介绍了关于图像梯度和边缘提取的计算方法,这种计算方法依赖卷积运算,根据实际需要,设计不同的卷积kernel就可以实现不同方式的边缘提取。

实现图像边缘提取之前,首先需要对图片做一些预处理工作,这些预处理操作包括图像灰度化和图像阈值求取。其具体的代码如下所示:


待处理图片
  • 图片灰度化处理
import cv2
img_gray  = cv2.imread("2.jpg",cv2.IMREAD_GRAYSCALE)
(m,n) = img_gray.shape
shape = (m,n)
灰度化图片
  • 对图片进行阈值求取
    利用OTSU算法原理,对图片进行的阈值进行求取,根据图像阈值处理算的代码,所求得阈值为46

实现图像的边缘提取

  • 梯度法
    设计如下图所示的kernel,则梯度算法的计算公式如下所示:


    卷积kernel

梯度算子公式:G_x = (Z_4-Z_5),G_y = (Z_8-Z_5)
其代码如下所示:


T = 46
for i in range(1,m-1):
    for j in range(1,n-1):
        img_g[i,j]=np.abs(img_gray[i+1,j]-img_gray[i,j])+np.abs(img_gray[i,j+1]-img_gray[i,j])
        if img_g[i,j]<T:
            img_g[i,j]=0
        else:
            img_g[i,j]=255

实现效果如下所示:


梯度法
  • roberts 算子
    卷积kernel的计算公式如下所示:
    G_x = (Z_9-Z_5),G_y = (Z_8-Z_6)
    根据以上公式,roberts的实现代码如下所示:

T = 46
img_r = np.zeros(shape)
for i in range(1,m-1):
    for j in range(1,n-1):
        img_r[i,j]=np.abs(img_gray[i+1,j+1]-img_gray[i,j])+np.abs(img_gray[i,j+1]-img_gray[i+1,j])
        if img_r[i,j]<T:
            img_r[i,j]=0
        else:
            img_r[i,j]=255
roberts算子实现效果图
  • prewitt 算子
    prewitt算子的卷积kernel公式如下所示:
    G_x = (Z_7+Z_8+Z_9) - (Z_1+Z_2+Z_3)
    G_y = (Z_3+Z_6+Z_9)-(Z_1+Z_4+Z_7)

根据以上公式,实现代码如下所示:

T=46
img_p = np.zeros(shape)
for i in range(1,m-1):
    for j in range(1,n-1):
        img_p[i,j]=np.abs(img_gray[i-1,j-1]+img_gray[i,j-1]+img_gray[i+1,j-1]-img_gray[i-1,j+1]-img_gray[i,j+1]-img_gray[i+1,j+1])+np.abs(img_gray[i+1,j-1]+img_gray[i+1,j]+img_gray[i+1,j+1]-img_gray[i-1,j-1]-img_gray[i-1,j]-img_gray[i-1,j+1])
        if img_p[i,j]<T:
            img_p[i,j] = 0
        else:
            img_p[i,j]=255
prewitt算子实现效果图
  • sobel 算子
    sobel算子卷积kernel公式如下所示:
    G_x = (Z_7+2*Z_8+Z_9) - (Z_1+2*Z_2+Z_3)
    G_y = (Z_3+2*Z_6+Z_9)-(Z_1+2*Z_4+Z_7)
    其代码实现如下所示:
T=46
img_s = np.zeros(shape)
for i in range(1,m-1):
    for j in range(1,n-2):
        img_s[i,j]=np.abs(img_gray[i-1,j-1]+img_gray[i,j-1]+img_gray[i+1,j-1]-img_gray[i-1,j+1]-img_gray[i,j+1]-img_gray[i+1,j+1])+np.abs(img_gray[i+1,j-1]+img_gray[i+1,j]+img_gray[i+1,j+1]-img_gray[i-1,j-1]-img_gray[i-1,j]-img_gray[i-1,j+1])
        if img_s[i,j]<T:
            img_s[i,j] = 0
        else:
            img_s[i,j]=255

实现效果图如下所示:


sobel算子实现效果图

相关文章

  • 图像边缘提取的实现

    前言 在图像梯度和边缘提取的文章中,详细介绍了关于图像梯度和边缘提取的计算方法,这种计算方法依赖卷积运算,根据实际...

  • Android NDK开发:利用OpenCV实现简笔画效果

    目录 效果演示 实现原理 首先利用高斯滤波对图像进行降噪处理,然后将图像转换为灰度图像方便边缘的提取,接下来对灰度...

  • 拉布拉斯算子锐化图像的空域和频域--matlab实现

    本文将用matlab实现拉布拉斯算子提取边缘,锐化图像。分别采用空域和频域两种方法。 空域 步骤:1.读取图像/(...

  • 边缘检测

    边缘表示了一个图像的重要信息,hin重要 边缘检测目标:确定图像中突然变化的部分为啥边缘检测:后续可以提取信息,识...

  • 轮廓发现

    轮廓发现   轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果。相...

  • opencv+python -- 轮廓发现

    轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓发现结果 Code 运行结...

  • 028-Opencv笔记-轮廓发现

    轮廓发现 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法。所以边缘提取的阈值选定会影响最终轮廓发现结果API介...

  • 图像卷积与边缘检测

    什么是边缘检测 边缘检测是图像处理和计算机视觉中,尤其是特征提取中的一个研究领域。 所谓边缘,就是图像中强度发生突...

  • 计算机视觉实战(五)图像梯度计算

      这一节我们来看一下计算图像边缘的一些算子,提取图像边缘的信息有利于之后对图像中的物品进行更进一步的处理。 图像...

  • 图像傅里叶变换(二维离散傅里叶变换)

    应用:二维离散傅里叶变换是将图像从空间域转至频域,在图像增强、图像去噪、图像边缘检测、图像特征提取、图像压缩等等应...

网友评论

      本文标题:图像边缘提取的实现

      本文链接:https://www.haomeiwen.com/subject/uamuyhtx.html