Python图像处理之目标物体轮廓提取的实现方法

 更新时间:2021年08月10日 11:56:45   作者:赵卓不凡  
目标物体的轮廓实质是指一系列像素点构成,这些点构成了一个有序的点集,这篇文章主要给大家介绍了关于Python图像处理之目标物体轮廓提取的实现方法,需要的朋友可以参考下

1 引言

目标物体的边缘对图像识别和计算机分析十分有用。边缘可以勾画出目标物体,使观察者一目了然;边缘蕴含了丰富的内在信息(如方向、形状等),是图像识别中抽取图像特征的重要属性。轮廓提取是边界分割中非常重要的一种处理,同时也是图像处理的经典难题,轮廓提取和轮廓跟踪的目的都是获得图像的外部轮廓特征。

2 原理

二值图像的轮廓提取的原理非常简单,就是掏空内部点:如果原图中有一点为黑,且它的8个相邻点皆为黑色,则将该点删除。对于非二值图像,需要先进行二值化处理。轮廓提取的方法有很多,在这里我们介绍一种最基本、最简单容易实现的算法。算法原理如下:

  • 在进行轮廓提取时,使用一个一维数组,用来记录处理的像素点的周围8邻域的信息
  • 若8个邻域的像素点的灰度值和中心点的灰度值相同,则认为该点在物体的内部,可以删除;
  • 否则,认为该点在图像的边缘,需要保留。
  • 依次处理图像中每一个像素,则最后留下来的就是图像的轮廓。

3 Python实现

1)读入彩色图像

img_name = "./20210808/sample3.png"
img = cv2.imread(img_name)

结果如下:

请添加图片描述

2) 彩色图像灰度化

gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

结果如下:

请添加图片描述

3)二值化

def get_binary_img(img):
    # gray img to bin image
    bin_img = np.zeros(shape=(img.shape), dtype=np.uint8)
    h = img.shape[0]
    w = img.shape[1]
    for i in range(h):
        for j in range(w):
            bin_img[i][j] = 255 if img[i][j] > 127 else 0
    return bin_img
# 调用
bin_img = get_binary_img(gray_img)

结果如下:

请添加图片描述

4)提取轮廓

参考上述原理,进行实现,代码如下:

def get_contour(bin_img):
    # get contour
    contour_img = np.zeros(shape=(bin_img.shape),dtype=np.uint8)
    contour_img += 255
    h = bin_img.shape[0]
    w = bin_img.shape[1]
    for i in range(1,h-1):
        for j in range(1,w-1):
            if(bin_img[i][j]==0):
                contour_img[i][j] = 0
                sum = 0
                sum += bin_img[i - 1][j + 1]
                sum += bin_img[i][j + 1]
                sum += bin_img[i + 1][j + 1]
                sum += bin_img[i - 1][j]
                sum += bin_img[i + 1][j]
                sum += bin_img[i - 1][j - 1]
                sum += bin_img[i][j - 1]
                sum += bin_img[i + 1][j - 1]
                if sum ==  0:
                    contour_img[i][j] = 255

    return contour_img
# 调用    
contour_img = get_contour(bin_img)

结果如下:

请添加图片描述

4 总结

通过上述简单步骤,我们实现了物体轮廓提取,相应的处理效果如下:

请添加图片描述

上图中 左侧为原图,右侧为我们提取的物体轮廓图。

到此这篇关于Python图像处理之目标物体轮廓提取的文章就介绍到这了,更多相关Python目标物体轮廓提取内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python异常处理并调试

    python异常处理并调试

    这篇文章主要介绍了python异常处理并调试,异常是错误出现时,可以在正常的控制流程之外采取的行为下面我们就来看看python的那些异常,需要的小伙伴可以参考一下
    2022-02-02
  • pycharm使用docker容器开发的详细教程

    pycharm使用docker容器开发的详细教程

    这篇文章主要介绍了pycharm使用docker容器开发的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • Python pycryptodome库实现RSA加密解密消息

    Python pycryptodome库实现RSA加密解密消息

    本文为大家介绍了如何在 Python 中使用 RSA 公钥加密技术来加密和解密消息,并使用 pycryptodome 库进行实现,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2024-02-02
  • python+VTK环境搭建及第一个简单程序代码

    python+VTK环境搭建及第一个简单程序代码

    这篇文章主要介绍了python+VTK环境搭建及第一个简单程序代码,简单介绍了vtk,然后分享了安装步骤,最后涉及一个简单的代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • python分割列表(list)的方法示例

    python分割列表(list)的方法示例

    这篇文章主要给大家介绍了python分割列表(list)的方法,文中给出了详细的示例代码大家参考学习,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-05-05
  • Python入门之实例方法、类方法和静态方法的区别讲解

    Python入门之实例方法、类方法和静态方法的区别讲解

    这篇文章主要介绍了Python入门之实例方法、类方法和静态方法的区别讲解,实例方法是在创建了类的实例之后才能被调用的方法,类方法是在不需要创建类的实例的情况下就可以调用的方法,最后,静态方法是与类和类的实例都没有绑定关系的方法,需要的朋友可以参考下
    2023-10-10
  • tensorflow求导和梯度计算实例

    tensorflow求导和梯度计算实例

    今天小编就为大家分享一篇tensorflow求导和梯度计算实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-01-01
  • Python爬虫:将headers请求头字符串转为字典的方法

    Python爬虫:将headers请求头字符串转为字典的方法

    今天小编就为大家分享一篇Python爬虫:将headers请求头字符串转为字典的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python 删除字符串中连续多个空格并保留一个的方法

    python 删除字符串中连续多个空格并保留一个的方法

    今天小编就为大家分享一篇python 删除字符串中连续多个空格并保留一个的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python中pd.cut()与pd.qcut()的对比及示例

    python中pd.cut()与pd.qcut()的对比及示例

    本文主要介绍了python中pd.cut()与pd.qcut()的对比及示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论