今日精选:使用 SKimage 的图像预处理

2023-04-06 10:57:00 来源:磐创AI

介绍


(相关资料图)

图像是视觉对象的二维表示,例如照片、绘画或素描。在数字成像中,图像存储为像素值数组,其中每个像素代表图像亮度和颜色的样本。每个像素的颜色可以由一个或多个通道表示,如传统彩色图像中的红色、绿色和蓝色 (RGB) 通道。在本文中,你将学习各种图像预处理技术。

图像可以使用计算机算法进行处理,以改变它们的外观或提取信息。图像处理技术包括调整大小、裁剪、旋转、过滤和阈值化等操作。这些操作是对像素值执行的,以修改图像或提取有关其内容的信息。图像处理用于许多应用程序,包括计算机视觉、医学成像和数字艺术。

通过使用 SKimage 学习图像预处理,你将能够:

了解图像预处理在图像分析和机器学习中的重要性。了解如何使用各种 SKimage 函数进行图像过滤、增强、恢复和转换。应用降噪、边缘检测和图像阈值处理等图像预处理技术来提高图像质量。执行常见的图像预处理任务,例如图像大小调整、裁剪和旋转。使用特征提取技术从图像中提取有意义的信息。为图像分析应用程序实施对象检测算法。目录了解图像数据处理图像的步骤理解图像中的变换如何加载图像?如何可视化图像?图像预处理—调整图像大小图像预处理—重塑图像图像预处理—图像旋转图像预处理—图像裁剪图像预处理—图像翻转图像预处理—亮度处理了解图像数据

让我们来看一张可以分解为数字矩阵的图像,其中每个数字代表强度。这个强度可以取 0(代表黑色)和 255(代表白色)之间。因此,单色图像可以由单个矩阵表示。

但是当它是下面的彩色图像时我们该怎么办呢?

如果我们必须表示一个图像,我们会将其分成三个不同颜色的三个图像:红色、绿色和蓝色。我们可以将每种颜色的强度存储在两个单独的矩阵中。

因此图像将被分解为三个矩阵:一个用于红色,一个用于绿色,一个用于蓝色,这样我们就可以用 N*M*3 矩阵表示图像。

任何 n * m 像素宽的图像都可以在计算机中的任何位置定义为矩阵 NM*3。

在处理图像数据时,通常会将图像转换为数字表示形式,例如矩阵,以便计算机算法可以对其进行处理。图像的数字表示称为数字图像,可以使用数学运算来处理数字图像中的数据以执行不同的图像处理任务。

总的来说,理解图像数据对于使用图像处理算法和从图像中提取信息是必要的。

处理图像的步骤

以下是在 Python 中处理图像所涉及的常见步骤:

导入库:你需要导入将用于处理图像的库,例如 NumPy 和 OpenCV。加载图像:你可以使用 OpenCV 中的 imread 函数加载图像。预处理:根据图像和所需的结果,你可能需要执行预处理步骤,例如调整大小、灰度化或阈值化。操作像素:你可以使用 NumPy 数组操纵图像的像素,以执行裁剪、旋转和进行基于颜色的选择等操作。过滤:你可以使用不同的过滤器来平滑或锐化图像,例如高斯或中值过滤器。边缘检测:可以使用 Canny 等方法执行的边缘检测用于识别图像中对象之间的边界。理解图像中的变换

图像中的变换指的是应用于图像的数学运算,以改变其外观或从中提取有用信息。可以应用许多类型的变换到图像中,包括:

几何变换:这些变换会改变图像中像素之间的空间关系,例如旋转、缩放和平移。颜色变换:这些变换会改变图像的颜色属性,例如亮度、对比度和饱和度。过滤:过滤是指从图像中去除噪声或增强其特征的过程,如平滑或锐化。边缘检测:可以使用 Canny 等方法执行的边缘检测用于识别图像中对象之间的边界。特征提取:这是指使用 Harris 角点检测或 SIFT 等算法从图像中提取有意义的信息(如角点或关键点)的过程。

这些转换是使用数学算法执行的,可以在 Python 或 MATLAB 等软件中实现。转换对于图像处理至关重要,并且在计算机视觉、医学图像分析和面部识别等应用中至关重要。

现在我们将开始加载图像并使用 Scikit-Image 库对图像进行一些操作。

如何加载图像?

根据所使用的编程语言和工具,有多种加载图像的方法。下面介绍几种常用的方法:

使用图像处理库:许多图像处理库,如 OpenCV、Pillow 和 Scikit-Image,都提供将图像加载到内存中的功能。例如,你可以使用 imread 函数在 OpenCV 中加载图像。使用图像文件阅读器:你可以使用特定于文件格式(如 JPEG 或 PNG)的函数或类从文件中读取图像数据。例如,你可以使用 Python 中的 imageio 库来读取图像文件。从 URL 加载:你可以从 URL 下载图像,然后将其加载到内存中。

将图像上传到内存后,你可以使用图像处理库提供的函数对其进行各种操作,如调整大小、裁剪、颜色转换和过滤。

以下是如何使用 Python 中的 scikit-image (skimage) 库加载图像的示例:

originating from Skimage Import IO

# Open the image

io.imread("image.jpg") = image

# Show the image

io.imshow(image)

io.show()

在此示例中,skimage 库的 io 模块中的 imread 函数用于将图像文件 image.jpg 加载到内存中。然后使用 io 模块中的 imshow 函数显示生成的图像数据,然后调用“io.show()”来显示图像。imshow 函数自动调整显示图像并处理颜色通道和纵横比等问题。

如何可视化图像?

可视化图像涉及在屏幕或输出设备上显示图像数据。可视化图像取决于所使用的编程语言和工具。下面介绍几种常用的方法:

使用图像处理库:许多图像处理库,如 OpenCV、Pillow 和 scikit-image,都提供显示图像的功能。例如,你可以使用 imshow 函数在 OpenCV 中显示图像。使用绘图库:你可以使用绘图库(如 Python 中的 Matplotlib)来显示图像。例如,你可以使用 Matplotlib Pyplot 模块中的 imshow 函数在 Python 中显示图像。

显示图像后,你可以通过放大和缩小、平移和重新调整显示设置来与其进行交互。

以下是如何使用 Python 中的 scikit-image (skimage) 库可视化图像的示例:

from skimage import io

import matplotlib.pyplot as  plt

# Load the image

image = io.imread("image.jpg")

# Display the image

plt.imshow(image)

plt.show()

在这个例子中,使用skimage库的“io”模块中的imread函数将一个名为image.jpg的图像文件加载到内存中。然后使用matplotlib.pyplot模块的imshow函数显示结果图像数据,随后调用plt.show()函数来显示图像。

图像预处理—调整图像大小

Python 的“scikit-image”(skimage) 库提供了几个调整图像大小的函数。为此,一个常用的功能是“transform”模块中的“resize”函数。

这是使用 skimage 调整图像大小的示例:

import skimage

from skimage import io,  transform

# Load the image

image = io.imread(“example.jpg”)

resized_image = transform.resize(image, (300, 300))

# Save the resized image

io.imsave(“resized_image.jpg”, resized_image)

在这个例子中,使用 io 模块的 imread 函数读取原始图像。然后,使用 resize 函数将图像调整为大小为 (300, 300) 像素。最后,使用 imsave 函数保存调整大小后的图像。

图像预处理—重塑图像

在Python中,"scikit-image"(skimage)库提供了几个用于重塑图像的函数。以下是使用skimage重塑图像的示例:

# import colour sub-module

from skimage import color

# reading the image

image = imread('index.png')

# converting image to grayscale

grayscale_image = color.rgb2gray(image)

grayscale_image.shape

import numpy as np

new_shape = (grayscale_image.shape[0]*grayscale_image.shape[1])

# reshape 

image2 = np.reshape(grayscale_image, new_shape)

image2.shape

如果将 4 x 4 二维图像转换为一维图像,我们将有 4×4=16 个值。

图像预处理—图像旋转

图像旋转是指以指定角度围绕其中心旋转图像。在scikit-image中,你可以使用transform模块的rotate函数旋转图像。以下是Python中的一个示例:

import numpy as np

from skimage import io

from skimage.transform import rotate

# Load an image

image = io.imread("image.jpg")

# Rotate the image by 180 degrees

rotated_image = rotate(image, angle=180, resize=True)

# Save the rotated image

io.imsave("rotated_image.jpg", rotated_image)

在这个例子中,rotate函数被用来将输入图像旋转180度。rotate函数的第一个参数是输入图像,angle参数指定了旋转角度(以度为单位)。

图像预处理—图像裁剪

图像裁剪是通过指定裁剪区域来提取图像的一部分。在scikit-image中,可以使用切片和索引来裁剪图像。以下是Python示例:

import numpy as np

from skimage import io

# Load an image

image = io.imread("image.jpg")

rows, cols = image.shape[:2]

cropped_image = image[rows//4:-rows//4, cols//4:-cols//4]

# Save the cropped image

io.imsave("cropped_image.jpg", cropped_image)

在这个例子中,首先使用imread函数加载输入图像。裁剪区域通过沿两个维度对图像进行切片来指定,因此删除了行和列的前四分之一和后四分之一。

图像预处理——图像翻转

可以使用 OpenCV 库中的“cv2.flip”函数执行 Python 中的图像翻转。“cv2.flip”函数有两个参数:输入图像和翻转代码。翻转代码指定要执行的翻转,可以是以下值之一:

cv2.FLIP_HORIZONTAL:水平翻转图像cv2.FLIP_VERTICAL:垂直翻转图像cv2.FLIP_BOTH:水平和垂直翻转图像

翻转可以认为是旋转的延伸,允许左右和上下翻转图像。

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

# reading the image

image = imread('index.png')

image = np.array(image)

imshow(image)

plt.title('Original Image')

现在,如果你必须再次翻转图像,该怎么办?

让我们假设我们要进行从左到右的翻转。我可以使用“fliplr()”函数轻松完成此操作,重新读取图像并进行翻转。

# flip image left-to-right

flipLR = np.fliplr(image)

plt.imshow(flipLR)

plt.title('Left to Right Flipped')

这些是翻转图像的方法。

图像预处理—亮度处理

可以使用图像库执行 Python 中的亮度操作。图片库提供了曝光模块,其中包含调整gamma的功能,可以用来改变图片的亮度。

可以使用不同亮度的图像使模型对光照条件的变化具有鲁棒性;这对于在室外照明下工作的系统很重要,例如交通信号灯上的闭路电视摄像头。

from skimage.exposure import adjust_gamma

# read the image

image = imread('index.png')

plt.title('Original Image')

imshow(image)

我要改变gamma值,这会改变图像的强度。所以,这是明亮的图像。

# brighten the image

bright = adjust_gamma(image,gamma=0.5,gain=1)

imshow(bright)

plt.title('Brightened IMage')

结论

Scikit-image 是一个流行的图像处理 Python 库,它提供了处理图像的工具和函数。以下是用于图像处理的图像的一些关键特征的总结:

Image I/O:image提供了读写图片到磁盘的函数,包括imread读取图片和imsave保存图片。图像恢复:图像提供了用于恢复退化图像的算法,包括去除噪声和校正模糊或失真的功能。图像分析:image 提供分析图像属性的函数,包括直方图、梯度幅度和纹理分析。图像可视化:图像提供了用于可视化图像及其属性的函数,包括绘制和显示图像、直方图和图像数据的其他可视化表示。

原文标题 : 使用 SKimage 的图像预处理

标签: