我们可以通过不同的采集设备来获取照片。例如,使用皮肤镜检索黑色素瘤(皮肤癌)图像。我们使用数码相机或智能手机为自己或朋友拍照。但是,有时我们会注意到图片中的一些问题,例如模糊,这可能是由于使用的采集设备造成的。
但是,在这种情况下该怎么办?您收到了一些医学图像进行分析,您无法选择重新拍摄这些图像。即使您重新拍摄图像,您看到的分辨率也不会改变,您面临的任何其他问题也不会改变。图像处理在这种情况下发挥作用。
图像处理:对数字化图像的分析和处理,尤其是为了提高其质量。— 牛津词典
这里的“数字化图像”是指图像经过计算机处理的事实。在这个游戏中使用计算机意味着使用编程语言。
在本教程中,我将向您展示如何使用 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
我们现在已经安装了库,并准备好享受一些图像处理的乐趣!
我们将在本教程中使用的测试图像是比萨店插图。继续下载它,或者只是使用您选择的图像。图像如下所示:
图像的尺寸
有时我们需要知道图像的尺寸(更多关于过滤部分的内容)。一旦我们使用该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)
这是结果:
彩色转灰度
在本节中,我们希望将原始彩色比萨店图像转换为灰度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()
结果如下所示:
对图像应用滤镜
在图像处理中,执行过滤以对图像进行一些增强。一般来说,过滤包括以下操作:边缘增强、锐化和平滑。
在本节中,我将向您展示如何将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. 此操作的输出如下所示:
您可以应用许多其他过滤器,例如用于模糊的高斯过滤器。它接受许多参数,第一个是源图像,第二个是高斯滤波器的标准偏差。您可以传递单个值或一系列值(每个轴一个)。这里有两个例子:
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 的高斯滤波器应用于比萨店图像的结果:
以下是对垂直轴和水平轴应用标准差为 20 和 1 的高斯滤波器的结果:
现在,让我们看看如何将阈值过滤器应用于我们的图像。首先,我们使用该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)
上面的代码为我们的图像生成以下结果:
结论
有许多图像处理操作,scikit-imagePython 库为我们提供了许多可以对图像执行的有趣操作。您可以在scikit-image 网站上看到更多使用此库的图像处理操作。
发表评论