Scikit-image (skimage) 是一款基于SciPy的图像处理工具,它提供有用的类和函数来处理图片。其中最常用的函数是imread、imshow、imsave等,是一套非常简单易用的图像处理工具。skimage的安装也非常简单,只需 pip install scikit-image即可。实现skimage的循环显示图片只需要使用for循环进行遍历即可。具体示例代码如下:
```
import skimage.io as io
import os
import matplotlib.pyplot as plt
path = "./images/"
files = os.listdir(path)
for file in files:
img_path = os.path.join(path, file)
img = io.imread(img_path)
plt.imshow(img)
plt.axis("off")
plt.show()
```
以上代码实现了循环读取文件夹中的图片,然后将图片显示出来。这里我们使用matplotlib.pyplot的imshow函数,并选择off模式显示坐标轴来显示图片。接下来我们将从多个角度分析skimage如何循环显示图片。
一、imread函数解析
我们可以使用以下代码来查看imread函数的注释
```
import skimage.io as io
help(io.imread)
```
可得到以下注释:
```
read an image from a file as an array
Parameters
----------
fname : str
Image file name, e.g. ``test.jpg`` or URL.
plugin : str | None
Name of plugin to use or None to auto detect from file extension.
as_gray : bool
Convert to greyscale (default False).
Returns
-------
arr : ndarray (M, N) or (M, N, 3) or (M, N, 4)
The different colour bands/channels are stored in the
third dimension, such that a grey-image is MxN, an
RGB-image MxNx3 and an RGBA-image MxNx4.
```
从函数源码中可知,imread函数将图片读取为一个ndarray数组类型的数据,如果读取的图片为灰度图,则返回的是M * N大小的数组,如果读取的图片为彩色图,则返回的是M * N * 3大小的数组,其中,第三个维度存储了RGB三个通道的信息,即颜色属性信息。在我们实现循环显示图片中,for循环遍历了一个文件夹中的所有图片,对于每张图片,我们都将其读取为一个ndarray数组类型的数据。由于图片文件较大,因此占用较多的内存,而多张图片的读取则会占用更多的内存,因此需要使用with...as语句来控制内存的释放,使用完之后可以自动清理内存。
二、显示图片解析
我们可以使用以下代码来查看matplotlib.pyplot.imshow函数的注释:
```
import matplotlib.pyplot as plt
help(plt.imshow)
```
得到以下注释:
```
Display data as an image; i.e. on a 2D regular raster.
The input may either be actual RGB(A) data, or 2D scalar data, which
will be rendered as a pseudocolor image. For displaying a grayscale
image set up the colormapping using the parameters cmap='gray',
vmin=0, vmax=255.
The number of pixels used to render an image is set by the axes size
and the dpi of the figure. This can lead to aliasing artifacts when
the image is resampled because the displayed pixel size doesn't
match the true pixel size. The resampling can be controlled via the
*interpolation* parameter and/or :rc:`image.interpolation`.
Parameters
----------
X : array_like, shape (n, m) or (n, m, 3) or (n, m, 4)
Display the image in X to current axis. X may be a float array,
a uint8 array (image of 0-255), or a PIL image. If X is an
array, matplotlib may squeeze the passed array, reverting
1 dimensional arrays to scalars. If you are using a color
images set the last dimension to 3.
Returns
-------
out : AxesImage
The AxesImage object returned by the call.
Notes
-----
Unless *extent* is used, pixel centers will be located at integer
coordinates. In other words: the origin will coincide with the center
of pixel (0, 0).
Examples
--------
single image:
>>> img = np.zeros((100, 100))
>>> img[25:75, 25:75] = 255
>>> plt.imshow(img)
multiple images:
>>> img1 = np.zeros((100, 100))
>>> img2 = img1.copy()
>>> img2[25:75, 25:75] = 255
>>> img3 = np.zeros((100, 100))
>>> img3[50:100, 50:100] = 255
>>> fig, axs = plt.subplots(1, 3, figsize=(10, 3))
>>> axs[0].imshow(img1)
>>> axs[1].imshow(img2)
>>> axs[2].imshow(img3)
```
我们可以看到,在matplotlib.pyplot.imshow函数中,第一个参数X可以传入一个ndarray数组类型的数据,并以图像的方式显示。对于灰度图,将其colormap设置为'gray'即可实现灰度显示。在我们的代码实现中,使用了for循环遍历文件夹中的多张图片,每次循环通过imread函数读取一张图片,并使用imshow函数进行显示,直至显示所有图片。循环显示图片并不会对显示的效率产生性能瓶颈,因此在实际处理图片时,可以考虑使用该方式进行图片的遍历操作。