• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用 Python 进行图像处理

我们可以通过不同的采集设备来获取照片。例如,使用皮肤镜检索黑色素瘤(皮肤癌)图像。我们使用数码相机或智能手机为自己或朋友拍照。但是,有时我们会注意到图片中的一些问题,例如模糊,这可能是由于使用的采集设备造成的。

但是,在这种情况下该怎么办?您收到了一些医学图像进行分析,您无法选择重新拍摄这些图像。即使您重新拍摄图像,您看到的分辨率也不会改变,您面临的任何其他问题也不会改变。图像处理在这种情况下发挥作用。

图像处理:对数字化图像的分析和处理,尤其是为了提高其质量。— 牛津词典

这里的“数字化图像”是指图像经过计算机处理的事实。在这个游戏中使用计算机意味着使用编程语言

在本教程中,我将向您展示如何使用 python 编程语言对图像执行图像处理任务。

scikit 图像

我们将用于执行图像处理任务的库是scikit-image. 根据论文scikit-image: image processing in Python:

scikit-image 是一个图像处理库,它实现了用于研究、教育和工业应用的算法和实用程序。它是在自由的 Modified BSD 开源许可下发布的,提供了一个以 Python 编程语言编写的完善的 api,由一个活跃的国际合作者团队开发。

我们需要做的第一件事是安装scikit-image。可以在下载页面上找到安装库的说明,在本教程中,我将向您展示如何在 macOS 机器上安装库,因为这是我目前在编写本教程时使用的。

与scikit-image外部库一样,我们要做的第一件事就是安装该库。为此,我将使用pip,它是(基于维基百科):

一个包管理系统,用于安装和管理用 Python 编写的软件包。许多包都可以在Python 包索引 (PyPI)中找到。

您可以按照Python 打包用户指南中提到的步骤进行安装pip,但如果您有Python 2.7.9和更高版本,或者Python 3.4更高版本,那么您已经拥有了pip!

scikit-image现在可以通过键入以下命令来简单地安装:

pip install scikit-image

我们现在已经安装了库,并准备好享受一些图像处理的乐趣!

我们将在本教程中使用的测试图像是比萨店插图。继续下载它,或者只是使用您选择的图像。图像如下所示:

使用 Python 进行图像处理  第1张

图像的尺寸

有时我们需要知道图像的尺寸(更多关于过滤部分的内容)。一旦我们使用该imread()方法将图像从文件加载到内存中,我们可以借助shape属性轻松获取图像尺寸。

这种技术有效的原因是scikit-image模块中的图像由NumPy数组表示。这是一个例子:

from skimage import io
 
img = io.imread('baboon.png')
 
# Outputs: (512, 512, 3)
print(img.shape)
 
# Outputs: 786432
print(img.size)

shape 属性为我们提供了一个元组,其中第一个元素是图像的高度,第二个元素是图像的宽度,第三个元素表示通道数。在我们的例子中,baboon.png图像具有红色、绿色和蓝色值的三个通道,因此我们得到了值 3。

这是一个加载另一个图像的示例:

from skimage import io
 
img = io.imread('pizzeria.png')
 
# (1271, 3200, 3)
print(img.shape)
 
# 12201600
print(img.size)

您还可以通过将函数中的第二个参数的值设置为 来将图像加载为as_gray灰度。该属性告诉我们数组中元素的数量。在灰度图像的情况下,该值等于图像中的像素数。这是一个例子:imread()Falsesize

from skimage import io
 
img = io.imread('pizzeria.png', as_gray=True)
 
# Outputs: (1271, 3200)
print(img.shape)
 
# Outputs: 4067200
print(img.size)

操作单个像素

您可以轻松地修改使用 scikit-image 库加载的任何图像的单个像素。应该牢记一些约定。

当直接访问图像的像素时,第一个值表示行号,第二个值表示列号。原点或对应的位置img[0, 0]是图像的左上角。您可以使用 line 将第 200 行和第 200 列的像素设为蓝色img[200, 200] = [0, 0,  255]。

也可以一起修改一组像素。这是一个为我们的图像添加红色边框的示例。

from skimage import io
 
img = io.imread('pizzeria.png')
 
# First 50 Rows
img[:50,0] = [255, 0, 0]
 
# First 50 Columns
img[:,:50] = [255, 0, 0]
 
# Last 50 Rows
img[-50:,0] = [255, 0, 0]
 
# Last 50 Columns
img[:,-50:] = [255, 0, 0]
 
io.imsave('red-border.png', img)

这是结果:

使用 Python 进行图像处理  第2张

彩色转灰度

在本节中,我们希望将原始彩色比萨店图像转换为灰度2D 图像(黑白)。这可以使用以下脚本简单地完成:

from skimage import io
 
img = io.imread('pizzeria.png', as_gray=True)
io.imsave('pizzeria-gray.png', img)

我们只是简单地传递as_gray了我们在上一节中学True到的imread()方法。

该imsave()方法接受文件名和图像数组作为其第一个和第二个参数。默认情况下,该方法还会检查您保存的图像是否具有低对比度,并在出现这种情况时向您发出警告。

另一种制作图像灰度的方法是借助rgb2gray()颜色模块中的方法。我们只需传递一个表示我们图像的数组作为第一个参数。输出为我们提供了一个表示灰度图像的新数组。最终亮度计算是通过对不同通道使用以下权重来完成的。

L = 0.2125*R + 0.7154*G + 0.0721*B

这是创建灰度图像的 Python 代码:

from skimage import io, color
 
img = io.imread('pizzeria.png')
img_grayscale = color.rgb2gray(img)
 
io.imsave('gray-pizzeria.png', img_grayscale)

为了显示新的灰度图像,在脚本末尾添加以下内容:

show_grayscale = io.imshow(img_grayscale)
io.show()

结果如下所示:

使用 Python 进行图像处理  第3张

对图像应用滤镜

在图像处理中,执行过滤以对图像进行一些增强。一般来说,过滤包括以下操作:边缘增强、锐化和平滑。

在本节中,我将向您展示如何将Sobel 过滤器应用于我们的图像,并查看执行此类操作后输出的样子。

在我们的图像上应用 Sobel 过滤器的脚本如下所示:

from skimage import io, filters
 
img = io.imread('pizzeria.png')
sobel_a = filters.sobel(img)
 
io.imsave('sobel-filter.png', sobel_a)

在尝试执行上述脚本时,您很可能会收到警告。我们无法应用该操作,因为图像必须是 2D 图像。此问题的一种解决方案是使用第二个参数并设置as_gray为True. 此操作的输出如下所示:

使用 Python 进行图像处理  第4张

您可以应用许多其他过滤器,例如用于模糊的高斯过滤器。它接受许多参数,第一个是源图像,第二个是高斯滤波器的标准偏差。您可以传递单个值或一系列值(每个轴一个)。这里有两个例子:

from skimage import io, color, filters
 
img = io.imread('pizzeria.png')
gaussian_a = filters.gaussian(img, 10)
gaussian_b = filters.gaussian(img, [20, 1])
 
io.imsave('gaussian-filter-10.png', gaussian_a)
io.imsave('gaussian-filter-20-1.png', gaussian_b)

以下是将标准差为 10 的高斯滤波器应用于比萨店图像的结果:

使用 Python 进行图像处理  第5张

以下是对垂直轴和水平轴应用标准差为 20 和 1 的高斯滤波器的结果:

使用 Python 进行图像处理  第6张

现在,让我们看看如何将阈值过滤器应用于我们的图像。首先,我们使用该threshold_mean()方法根据图像中所有灰度值的平均值计算阈值。之后,我们将图像二值化并将像素设置为True或False取决于它们是否高于阈值。img_as_ubyte()然后使用该方法将此二进制图像转换为 8 位 uint 数据。

from statistics import mean
from skimage import io, filters, util
 
img = io.imread('pizzeria.png', as_gray=True)
 
mean_threshold = filters.threshold_mean(img)
 
# Outputs: 0.5637301749456196
print(mean_threshold)
 
 
binary = img > mean_threshold
binary = util.img_as_ubyte(binary)
 
io.imsave('threshold-filter.png', binary)

上面的代码为我们的图像生成以下结果:

使用 Python 进行图像处理  第7张

结论

有许多图像处理操作,scikit-imagePython 库为我们提供了许多可以对图像执行的有趣操作。您可以在scikit-image 网站上看到更多使用此库的图像处理操作。


文章目录
  • scikit 图像
  • 图像的尺寸
  • 操作单个像素
  • 彩色转灰度
  • 对图像应用滤镜
  • 结论
  • 发表评论