百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Python图像处理:基于边缘/区域的图像分割

off999 2024-10-20 08:06 44 浏览 0 评论

图像分割的概念

图像分割是将图像分割成不同的区域或类别,并使这些区域或类别对应于不同的目标或局部目标。每个区域包含具有相似属性的像素,并且图像中的每个像素都分配给这些类别之一。一个好的图像分割通常指同一类别的像素具有相似的强度值并形成一个连通区域,而相邻的不同类别的像素具有不同的值。这样做的目的是简化成改变图像的表示形式,使其更有意义、更易于分析。

如果分割做得好,那么图像分析的所有其他阶段都将变得更简单。因此,分割的质量和可靠性决定了图像分析是否成功。但是如何将图像分割成正确的片段通常是一个非常具有挑战性的问题。

分割技术可以是非上下文的(不考虑图像中特征和组像素之间的空间关系,只考虑一些全局属性,例如颜色或灰度),也可以是上下文的(另外利用空间关系,例如对具有相似灰度的空间封闭像素分组)。在本章中,我们将讨论不同的分割技术,并使用scikit-imagepython-opencvcv2)和SimpleITK库函数演示基于Python的图像分割实现。为此,从导入本章所需的库开始,如下面的代码所示:

import numpy as np
from skimage.transform import (hough_line, hough_line_peaks, hough_circle,
hough_circle_peaks)
from skimage.draw import circle_perimeter
from skimage.feature import canny
from skimage.data import astronaut
from skimage.io import imread, imsave
from skimage.color import rgb2gray, gray2rgb, label2rgb
from skimage import img_as_float
from skimage.morphology import skeletonize
from skimage import data, img_as_float
import matplotlib.pyplot as pylab
from matplotlib import cm
from skimage.filters import sobel, threshold_otsu
from skimage.feature import canny
from skimage.segmentation import felzenszwalb, slic, quickshift, watershed
from skimage.segmentation import mark_boundaries, find_boundaries

本节的这个例子源自scikit-image文档,它演示了如何从背景中分割目标。先使用基于边缘的分割算法,然后使用基于区域的分割算法。将源自skimage.data的硬币图像作为输入图像,在较幽暗的背景下勾勒出了硬币的轮廓。

如下代码实现了显示其灰度图像及其强度直方图:

coins = data.coins()
hist = np.histogram(coins, bins=np.arange(0, 256), normed=True)
fig, axes = pylab.subplots(1, 2, figsize=(20, 10))
axes[0].imshow(coins, cmap=pylab.cm.gray, interpolation='nearest')
axes[0].axis('off'), axes[1].plot(hist[1][:-1], hist[0], lw=2)
axes[1].set_title('histogram of gray values')
pylab.show()

运行上述代码,输出结果如图8-4所示。

图8-4 硬币图像及其灰度直方图

8.4.1 基于边缘的图像分割

在本例中,我们将尝试使用基于边缘的分割来描绘硬币的轮廓。为此,先使用Canny边缘检测器获取特征的边缘,如下面的代码所示:

edges = canny(coins, sigma=2)
fig, axes = pylab.subplots(figsize=(10, 6))
axes.imshow(edges, cmap=pylab.cm.gray, interpolation='nearest')
axes.set_title('Canny detector'), axes.axis('off'), pylab.show()

运行上述代码,使用Canny边缘检测器得到的硬币轮廓如图8-5所示。

图8-5 使用Canny边缘检测器得到的硬币轮廓

然后使用scipy ndimage模块中的形态学函数binary_fill_holes()填充这些轮廓,如下面的代码所示:

from scipy import ndimage as ndi
fill_coins = ndi.binary_fill_holes(edges)
fig, axes = pylab.subplots(figsize=(10, 6))
axes.imshow(fill_coins, cmap=pylab.cm.gray, interpolation='nearest')
axes.set_title('filling the holes'), axes.axis('off'), pylab.show()

运行上述代码,输出硬币的填充轮廓,如图8-6所示。

图8-6 硬币的填充轮廓

可以看到,有一枚硬币的轮廓没有被填满。在接下来的步骤中,我们将通过为有效目标设置最小尺寸,并再次使用形态学函数来删除诸如此类小伪目标。这次使用的是scikit-image形态学模块的remove_small_objects()函数,如下面的代码所示:

from skimage import morphology
coins_cleaned = morphology.remove_small_objects(fill_coins, 21)
fig, axes = pylab.subplots(figsize=(10, 6))
axes.imshow(coins_cleaned, cmap=pylab.cm.gray, interpolation='nearest')
axes.set_title('removing small objects'), axes.axis('off'), pylab.show()

运行上述代码,输出结果如图8-7所示。

图8-7 删除未填充的硬币轮廓

但这种方法并不是很健壮,因为没有完全闭合的轮廓没有被正确填充,如图8-6中还有一枚没有填充的硬币一样。

8.4.2 基于区域的图像分割

在本节中,我们将使用形态学分水岭算法对同一幅图像应用基于区域的分割方法。先直观地阐述分水岭算法的基本步骤。

形态学分水岭算法

任何灰度图像都可以看作一个地形地貌面。如果这个面从它的最小值被淹没,并且阻止了不同来源的水的汇合,那么图像就被分割成两个不同的集合,即集水盆和分水岭线。如果将这种变换应用于图像梯度,在理论上集水盆应与图像的同质的灰度区域(片段)相对应。

然而,在实际应用中,由于梯度图像中存在噪声或局部不规则性,使用变换会对图像进行过度分割。为了防止过度分割,使用一组预定义标记,并从这些标记开始对地表面进行注水淹没。因此,通过分水岭变换分割图像的步骤如下:

(1)找到标记和分割准则(用于分割区域的函数,通常是图像对比度/梯度);

(2)利用这两个元素运行标记控制的分水岭算法。

现在,使用scikit-image中的形态学分水岭算法实现从图像的背景中分离出前景硬币。首先,使用图像的sobel梯度找到图像的高程图,如下面的代码所示:

elevation_map = sobel(coins)
fig, axes = pylab.subplots(figsize=(10, 6))
axes.imshow(elevation_map, cmap=pylab.cm.gray, interpolation='nearest')
axes.set_title('elevation map'), axes.axis('off'), pylab.show()

运行上述代码,输出高程图,如图8-8所示。

图8-8 利用sobel梯度得到硬币图像的高程图

紧接着,基于灰度值直方图的极值部分,计算背景标记和硬币标记,如下面的代码所示:

markers = np.zeros_like(coins)
markers[coins < 30] = 1
markers[coins > 150] = 2
print(np.max(markers), np.min(markers))
fig, axes = pylab.subplots(figsize=(10, 6))
a = axes.imshow(markers, cmap=plt.cm.hot, interpolation='nearest')
plt.colorbar(a)
axes.set_title('markers'), axes.axis('off'), pylab.show()

运行上述代码,输出结果如图8-9所示,图中还示出标记数组的热度图。

图8-9 背景标记和硬币标记——热度图

最后,利用分水岭变换,从确定的标记点开始注入高程图的区域,如下面的代码所示:

segmentation = morphology.watershed(elevation_map, markers)
fig, axes = pylab.subplots(figsize=(10, 6))
axes.imshow(segmentation, cmap=pylab.cm.gray, interpolation='nearest')
axes.set_title('segmentation'), axes.axis('off'), pylab.show()

运行上述代码,输出使用形态学分水岭算法进行分割后所得到的二值图像,如图8-10所示。

图8-10 使用形态学分水岭算法进行分割后的二值图像

最后一种方法的效果更好,可以将硬币分割并单独标记出来,如下面的代码所示:

segmentation = ndi.binary_fill_holes(segmentation - 1)
labeled_coins, _ = ndi.label(segmentation)
image_label_overlay = label2rgb(labeled_coins, image=coins)
fig, axes = pylab.subplots(1, 2, figsize=(20, 6), sharey=True)
axes[0].imshow(coins, cmap=pylab.cm.gray, interpolation='nearest')
axes[0].contour(segmentation, [0.5], linewidths=1.2, colors='y')
axes[1].imshow(image_label_overlay, interpolation='nearest')
for a in axes:
 a.axis('off')
pylab.tight_layout(), pylab.show()

运行上述代码,输出被分水岭线(等值线)分割和标记后的硬币,如图8-11所示。

图8-11 分水岭线分割后的硬币和标记后的硬币

本文摘自《Python图像处理实战

本书介绍如何使用流行的Python图像处理库(如PIL、scikit-image、python-opencv、SciPy ndimage和SimpleITK)、机器学习库(scikit-learn)和深度学习库(TensorFlow、Keras)解决图像处理问题。通过学习本书,读者能够通过编写程序代码来实现复杂的图像处理(如图像增强、滤波、复原、分割、分类和目标检测),还能够掌握用机器学习和深度学习模型来解决复杂的图像处理问题的方法。

本书从基础开始,通过书中所提供的Python可重现实现来引导读者逐步进阶。本书从经典的图像处理技术开始,探索图像处理算法的进化历程,直至图像处理或计算机视觉与深度学习方面的最新进展。读者将学习如何用Python的PIL、scikit-image和SciPy ndimage等图像处理库编写Python 3代码片段,以及如何快速实现复杂的图像处理算法,如图像增强、滤波、分割、目标检测和分类。读者还将学习如何使用scikit-learn库和机器学习模型,并随后探索深度卷积神经网络(CNN),如TensorFlow/Keras VGG-19,用端到端深度学习YOLO模型进行目标检测,将DeepLab V3+用于语义分割和神经中枢式的转移模型等。读者还会学到一些高级图像处理技术问题,如图像内画、梯度混合、变分去噪、接缝雕刻、绗缝和变形。在本书最后,读者还将学习有效的图像处理的各种实现算法。

本书循着“高度实用”的宗旨来引导读者学习一系列图像处理的概念/算法,以帮助读者详细了解如何用高级的Python库函数实现这些算法。

相关推荐

安全教育登录入口平台(安全教育登录入口平台官网)

122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...

大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)

大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...

谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
  • 谷歌地球下载高清卫星地图(谷歌地球地图下载器)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)

要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...

2026-02-04 09:03 off999

电信宽带测速官网入口(电信宽带测速官网入口app)

这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...

植物大战僵尸95版手机下载(植物大战僵尸95 版下载)

1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...

免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)

1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...

2025世界杯赛程表(2025世界杯在哪个国家)

2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...

下载搜狐视频电视剧(搜狐电视剧下载安装)

搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...

pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
  • pubg免费下载入口(pubg下载入口官方正版)
永久免费听歌网站(丫丫音乐网)

可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...

音乐格式转换mp3软件(音乐格式转换器免费版)

有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...

电子书txt下载(免费的最全的小说阅读器)

1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...

最好免费观看高清电影(播放免费的最好看的电影)

在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...

孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)

要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...

取消回复欢迎 发表评论: