77百科网
当前位置: 首页 生活百科

python深度学习实现图像多分类(使用Python的scikit-image模块进行图像分割)

时间:2023-08-08 作者: 小编 阅读量: 1 栏目名: 生活百科

用户仍然可以调整某些设置以获得所需的输出。直方图是显示图像中不同强度值下的像素数量的图形。监督阈值由于我们将自己选择阈值,我们称之为监督阈值。无监督阈值Scikit-image有许多自动阈值处理方法,在选择最佳阈值时无需输入。对于本节,我们将使用免费提供的示例图像,并尝试使用监督分割技术对头部进行分割。下一步将使用rgb2gray将图像转换为灰度。

在本文中,我们将详细讨论scikit-image,这是一个基于Python的图像处理库。

Scikit-image

scikit-image.org

Scikit-image是一个专用于图像处理的Python包。

安装

scikit-image可以按如下方式安装:

pip install -U scikit-image(Linux and OSX)pip install scikit-image(Windows)# For Conda-based distributionsconda install scikit-image

Python中的图像概述

在继续进行图像分割技术之前,我们必须熟悉scikit image生态系统以及它如何处理图像。

  • 从skimage库导入GrayScale图像

skimage数据模块包含一些内置的示例数据集,这些数据集通常以jpeg或png格式存储。

from skimage import dataimport numpy as npimport matplotlib.pyplot as pltimage = data.binary_blobs()plt.imshow(image, cmap='gray');

  • 从skimage库导入彩色图像

from skimage import dataimport numpy as npimport matplotlib.pyplot as pltimage = data.astronaut()plt.imshow(image);

  • 从外部源导入图像

# The I/O module is used for importing the imagefrom skimage import dataimport numpy as npimport matplotlib.pyplot as pltfrom skimage import ioimage = io.imread('skimage_logo.png')plt.imshow(image);

  • 加载多个图像

images = io.ImageCollection('../images/*.png:../images/*.jpg')print('Type:', type(images))images.files

Out[]: Type: <class ‘skimage.io.collection.ImageCollection’>

  • 保存图像

#Saving file as ‘logo.png’io.imsave('logo.png', logo)

图像分割

现在我们有了关于scikit-image的概念,让我们来深入了解图像分割的细节。图像分割本质上是将数字图像分割成多个部分,以简化和/或将图像的表示形式转换成更有意义和更容易分析的东西的过程。

在本文中,我们将把分割过程看作有监督和无监督算法的组合。

scikit-image库中提供了一些分段算法

监督分割:一些先验知识,可能来自人类输入,用于指导算法。

无监督分割:无需先验知识。这些算法尝试自动将图像细分为有意义的区域。用户仍然可以调整某些设置以获得所需的输出。

让我们从最简单的算法Thresholding开始。

阈值

这是通过选择高于或低于特定阈值的像素来从背景中分割对象的最简单方法。当我们打算从背景中分割对象时,这通常很有用。

让我们在预装了scikit-image数据集测试一下。

导入Python库

import numpy as npimport matplotlib.pyplot as pltimport skimage.data as dataimport skimage.segmentation as segimport skimage.filters as filtersimport skimage.draw as drawimport skimage.color as color

图片

text = data.page()image_show(text)

这个图像有点暗,但也许我们仍然可以选择一个值,无需任何高级算法就能给出合理的分割。现在,为了帮助我们选择该值,我们将使用直方图。

直方图是显示图像中不同强度值下的像素数量的图形。简单地说,直方图是一种图形,其中x轴表示图像中的所有值,而y轴表示这些值的频率。

fig, ax = plt.subplots(1, 1)ax.hist(text.ravel(), bins=32, range=[0, 256])ax.set_xlim(0, 256);

我们的例子恰好是一个8位图像,所以我们在x轴上总共有256个可能的值。我们观察到像素的浓度比较淡(0:黑色,255:白色)。这很可能是我们的文字背景。一个理想的分割直方图应该是双峰的,并且是完全分离的,这样我们就可以在中间选择一个数字。现在,让我们尝试制作一些基于简单阈值的分割图像。

监督阈值

由于我们将自己选择阈值,我们称之为监督阈值。

text_segmented = text > (value concluded from histogram i.e 50,70,120 )image_show(text_segmented);

上:text> 50 | 中:text> 70 | 下:text> 120

我们没有得到任何理想的结果,因为左边的阴影会产生问题。让我们现在尝试使用无监督阈值处理。

无监督阈值

Scikit-image有许多自动阈值处理方法,在选择最佳阈值时无需输入。一些方法是:otsu, li, local.

text_threshold = filters.threshold_ # Hit tab with the cursor after the underscore to get all the methods.image_show(text < text_threshold);

上:otsu 下:li

对于local,我们还需要指定block_size。Offset有助于优化图像以获得更好的结果。

text_threshold = filters.threshold_local(text,block_size=51, offset=10) image_show(text > text_threshold);

local thresholding

这很好,在很大程度上消除了噪声区域。

监督分割

阈值处理是一个非常基本的分割过程,在高对比度图像中无法正常工作,我们需要更高级的工具。

对于本节,我们将使用免费提供的示例图像,并尝试使用监督分割技术对头部进行分割。

# import the imagefrom skimage import ioimage = io.imread('girl.jpg') plt.imshow(image);

在对图像进行任何分割之前,使用一些过滤器去噪是一个好主意。

但是,在我们的例子中,图像不是很嘈杂,所以我们会照原样。下一步将使用rgb2gray将图像转换为灰度。

image_gray = color.rgb2gray(image) image_show(image_gray);

我们将使用两种完全不同原理的分割方法。

活动轮廓分割

活动轮廓分割也称为snakes,使用用户定义的轮廓或线进行初始化,然后该轮廓慢慢收缩。

对于我们的示例图像,让我们在人的头部周围画一个圆来初始化snake。

def circle_points(resolution, center, radius):""" Generate points which define a circle on an image.Centre refers to the centre of the circle """radians = np.linspace(0, 2*np.pi, resolution)c = center[1]radius*np.cos(radians)#polar co-ordinates r = center[0]radius*np.sin(radians)return np.array([c, r]).T# Exclude last point because a closed path should not have duplicate pointspoints = circle_points(200, [80, 250], 80)[:-1]

上述计算计算圆周边上的点的x和y坐标。既然我们已经给出了200的分辨率,它将计算200个这样的点。

fig, ax = image_show(image)ax.plot(points[:, 0], points[:, 1], '--r', lw=3)

然后,算法通过将闭合曲线拟合到脸部的边缘来从人的图像的其余部分分割人的面部。

snake = seg.active_contour(astronaut_gray, points)fig, ax = image_show(image)ax.plot(points[:, 0], points[:, 1], '--r', lw=3)ax.plot(snake[:, 0], snake[:, 1], '-b', lw=3);

我们可以调整调用的参数alpha和 beta。较高的alpha值会使这条snake收缩得更快,而beta会让snake变得更加平滑。

snake = seg.active_contour(image_gray, points,alpha=0.06,beta=0.3)fig, ax = image_show(image)ax.plot(points[:, 0], points[:, 1], '--r', lw=3)ax.plot(snake[:, 0], snake[:, 1], '-b', lw=3);

随机游走分割

在这种方法中,用户交互地给少量像素标上标签,这些像素被称为标签。然后想象每个未标记的像素释放一个random walker,然后可以确定一个random walker从每个未标记的像素开始并到达其中一个预先标记的像素的概率。将每个像素分配给计算概率最大的标签,可以得到高质量的图像分割。

我们将重用前面示例中的种子值。我们可以做不同的初始化,但为了简单起见,我们还是用圆吧。

image_labels = np.zeros(image_gray.shape, dtype=np.uint8)

随机游走算法期望标签图像作为输入。所以我们将有一个更大的圆圈,包括人的整个脸部和另一个靠近脸部中间的小圆圈。

indices = draw.circle_perimeter(80, 250,20)#from hereimage_labels[indices] = 1image_labels[points[:, 1].astype(np.int), points[:, 0].astype(np.int)] = 2image_show(image_labels);

现在,让我们使用Random Walker,看看会发生什么。

image_segmented = seg.random_walker(image_gray, image_labels)# Check our resultsfig, ax = image_show(image_gray)ax.imshow(image_segmented == 1, alpha=0.3);

看起来不像我们想要的边缘。为了解决这种情况,我们可以调优beta参数,直到得到所需的结果。经过多次尝试,3000的值工作得相当好。

image_segmented = seg.random_walker(image_gray, image_labels, beta = 3000)# Check our resultsfig, ax = image_show(image_gray)ax.imshow(image_segmented == 1, alpha=0.3);

这就是监督分割,我们必须提供特定的输入,也必须调整特定的参数。

无监督分割

无监督分割不需要先验知识。考虑这样的图像,该图像太大以致不能同时考虑所有像素。在这种情况下,无监督分割可以将图像分割成几个子区域,所以不是数百万像素,而是数十到数百个区域。让我们来看看这两种算法:

SLIC(简单线性迭代聚类)

SLIC算法实际上使用了一种名为K-Means的机器学习算法。它接收图像的所有像素值并尝试将它们分离到给定数量的子区域中。

SLIC以彩色工作,因此我们将使用原始图像。

image_slic = seg.slic(image,n_segments=155)

我们所做的只是将我们找到的每个子图像或子区域设置为该区域的平均值,这使得它看起来不像随机分配的颜色拼凑而更像一个图像被分解成类似的区域。

# label2rgb replaces each discrete label with the average interior colorimage_show(color.label2rgb(image_slic, image, kind='avg'));

我们已将此图像从512 * 512 = 262,000像素缩小到155个区域。

Felzenszwalb

该算法还使用了一种称为最小生成树聚类的机器学习算法。Felzenszwaib没有告诉我们图像将被分割成的聚类的确切数量。它会运行并生成它认为适合于图像上给定的缩放因子的任意多的聚类。

image_felzenszwalb = seg.felzenszwalb(image) image_show(image_felzenszwalb);

这里有很多区域。我们来计算唯一区域的数量。

np.unique(astronaut_felzenszwalb).size

3368

现在让我们使用区域平均值重新着色它们,就像我们在SLIC算法中所做的那样。

image_felzenszwalb_colored = color.label2rgb(image_felzenszwalb, image, kind='avg')image_show(image_felzenszwalb_colored);

现在我们得到了更小的区域。如果我们想要更少的区域,我们可以改变scale参数,或者从这里开始并将它们组合起来。这种方法有时被称为over-segmentation

这看起来更像是一张图片,它基本上只是减少了颜色数量。要再次组合它们,您可以使用区域邻接图(RAG)。

结论

图像分割是图像处理中的一个非常重要的步骤。它是一个活跃的研究领域,应用范围从计算机视觉到医学图像,交通和视频监控。Python以scikit-image的形式提供了一个强大的库,其中包含大量用于图像处理的算法。它是免费和不受限制的,背后有一个活跃的社区。

    推荐阅读
  • 筒蒿的吃法(清炒蒜末筒蒿简单做)

    筒蒿可以用蒜头清炒,做法如下:,今天小编就来说说关于筒蒿的吃法?下面更多详细答案一起来看看吧!筒蒿的吃法筒蒿可以用蒜头清炒,做法如下:茼蒿洗净备用。全程大火炒,最后放盐调味。如果想味道更鲜,炒的时候可以放入蚝油或生抽,翻炒均匀即可出锅。

  • 三国演义是什么意思(三国演义的解释)

    《三国演义》是中国文学史上第一部章回小说,是历史演义小说的开山之作,也是第一部文人长篇小说,被列为中国古典四大名著之一。明清时期甚至有“第一才子书”之称。

  • 30多岁练劈叉要多久(30多岁练劈叉要的时间)

    30多岁练劈叉要多久3个月左右。前一个星期稍微活动下筋骨,让身体慢慢适应。劈叉为柔韧性训练的高级阶段是武术舞蹈体操,瑜伽形体训练等体育学习的基本功又名一字马分为,竖劈腿:腿前后分开成一字型双手撑地使上身正直,而后努力使身体向下振压致两腿前后分开至一条线,坐于地下为合。

  • 张世饰演赵高是什么电视剧(赵高张世演技被北电当教材)

    最近,低调的张世在接受采访时,自曝为妻子为买下了900坪的地来种菜。张世的出生,让老来得子的父亲激动万分,所以对其极度宠爱。那一年,张世17岁,叛逆少年正式出道。张世的表演天赋极高,电影《风柜来的人》上映后,观众一致给予好评。因为长相平平,张世发现自己饰演古装剧才能彻底散发光芒。婚后,两人既是夫妻又是默契的事业搭档,堪称完美眷侣。夫妻两人一直非常平淡低调,很少露面,张世更不愿让妻子曝光在大众视野中。

  • 广东省2023年4月高等教育自学考试报名报考时间安排

    广东省2023年4月高等教育自学考试将于4月15日至16日举行。报名报考有关事项安排如下。

  • 6日起市区公交运营全面恢复(103路公交车执行夏季运营时间)

    具体发车时刻为:102路公交车首班车由6时10分调整为5时50分发车,末班车由18时10分调整为18时40分发车;103路公交车首班车由6时10分调整为5时50分发车,末班车由18时10分调整为18时45分发车。京西公交公司工作人员提醒广大乘客,目前102路、103路公交车已恢复正常运营,发车间隔时间为8分钟。乘车时须全程佩戴口罩,并配合安检员进行体温检测,对未佩戴口罩或不配合检测的乘客,安检员有权拒绝其乘车。

  • 对于直男的表白套路(表白狂宠带回家)

    于是,金斩就想跟喻树来一场男人与男人之间的挑战。当金斩做好了决一死战的准备的时候,却在最后一步临时掉链子。就在那天,金斩写好了一张字条(战书),准备将手里头的字条递给喻树。还有一次,喻树和金斩被老师罚在花园里大扫除。结果......喻树为了把金斩衣服上的扣子给扣上去,强行把金斩按在地上,把扣子给扣上。只有喻树和金斩是男&男。

  • 同是养殖业 养殖业是实业吗

    在养猪业,2016年已经被称作“金猪年”,当前猪价高涨之势已在全国蔓延。“物以稀为贵”,现在的猪价很好地反映了供求关系。有能手预料,今年第二季度是本轮猪价周期顶部,之后会下行,但猪价有望全年维持在高位。形成强烈反差的是,同是养殖行业,鸡蛋价格却连连下跌。业内人士分析,蛋价持续下跌主要是因为2014年养鸡效益好,导致存栏蛋鸡数量增添,随后受禽流感影响,肉鸡、鸡蛋消费量减少,市场供求关系决心了价格走向。

  • 火影佐助提前毕业小说(佐助喜提鸡你太美套装)

    能量药水:恢复类道具,使用后可瞬间恢复30%的查克拉,并且无丝毫副作用。拥有一种神奇的功效,可以有效治疗一切用眼过度的症状。因为青鳞是人类和蛇人之后,因此拥有远古天蛇的碧蛇三花瞳,是一种奇异的瞳术。可以控制强大的蛇类,将其收入碧蛇三花瞳所开辟的空间中。相比于佐助来说,小樱明显更关心他砸出了什么东西。雷洛伸手将四个光团中的蓝色精粹取出。要是佐助现在穿上这件衣服,还不得被鸣人和牙笑死啊!