计算机视觉 第一章基本的图像操作和处理

1.1  Pillow:Python图像处理类库

        Pillow库提供了非常灵活的图像处理功能,可以轻松地完成以下任务

        \bullet图像的基本操作,如打开、保存、裁剪、缩放、旋转图像等;

        \bullet图像的颜色空间转换;

        \bullet图像的滤镜和增强功能,例如模糊、锐化等;

        \bullet在图像上绘制简单的图形和文字。

        Pillow中最重要的模块为Image,要读取一幅图,可以使用:

from PIL import Image
pil_im = Image.open('xiaozhou.jpg').convert('L')

        上述代码的返回值pil_im是一个PIL图像对象,convert()用于实现图像颜色的转换,转换成灰度图像,则用convert('L')表示。

        1.1.1  转换图像格式

        通过save()方法,Pillow可以将图像保存成多种格式的文件。

from PIL import Image
import os

for infile in filelist:
    outfile = os.path.splitext(infile)[0] + ".jpg"
    if infile != outfile:
        try:
            Image.open(infile).save(outfile)
        except IOError:
            print "cannot convert",infile

        Pillow函数会进行简单的检查,如果文件不是JPEG格式,会自动将其转换成JPEG格式;如果转换失败,它会在控制台输出一条报告失败的消息。

        创建一个包含文件夹中所有图像文件的文件列表,先新建一个名为imtools.py(我们将一些经常使用的图像操作存储其中)的文件。

import os
def get_imlist(path):
    """返回目录中所有JPG图像的文件名列表"""
    return [os.path.join(path,f) for f in os.listdir(path) if f.endswith('.jpg')]

        导入os模块,该模块提供与操作系统交互的功能,比如文件和目录操作。这段代码的作用是遍历指定目录 path,并返回一个包含所有 .jpg 图像文件的完整路径的列表。

        1.1.2  创建缩略图

        thumbnail()方法接收一个指定生成缩略图大小的元组参数,将图像转换成符合元组参数指定大小的缩略图。

pil_im.thumnail((128,128))

        1.1.3  复制和粘贴图像区域

        使用crop()方法可以从一幅图像中裁剪指定区域,该区域用四元组来指定,坐标以此(左,上,右,下),Pillow中指定坐标系的左上角坐标(0,0):

box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTAT_180)
pil_im.paste(region,box)

        1.1.4  调整尺寸和旋转

        resize()方法用来指定新图像的大小,调用rotate()方法进行逆时针旋转。

out = pil_im.resize((128,128))
out2 = pil_im.rotate(45)

1.2  Matplotlib

        1.2.1  绘制图像、点和线

        Matplotlib可以绘制点和线,来表示一些事物,比如兴趣点、对应点以及检测出的物体。

from PIL import Image
from pylab import *

#读取图像到数组中
im = array(Image.open('xiaozhou.jpg')

#绘制图像
imshow(im)

#一些点
x = [100,100,400,400]
y = [200,500,200,500]

#使用红色星状标记绘制点
plot(x,y,'r*')

#绘制连接前两个点的线
plot(x[:2],y[:2])

#添加标题,显示绘制的图像
title('Plotting:"xiaozhou.jpg"')
show()

        使用 Matplotlib 的 imshow 函数显示图像数据。此时,图像会显示在一个 Matplotlib 图形窗口中。使用红色星状标记('r*')在图像上绘制这些点。绘制连接前两个点的线段。x[:2]和 y[:2]选择了前两个点的坐标。这段代码首先读取并显示图像,然后在图像上绘制指定的点和线段,并在图形窗口中添加标题,最终,图形窗口展示了图像及其上的标记和线条。下图是绘制的图像

图1.1  Matplotlib绘图示例

        在绘制图像时,可以控制图像的颜色和样式

表1-1 用PyLab库绘图的基本颜色格式命令
颜色
'b'蓝色'g'绿色
'r'红色'c'青色
'm'品色'y'黄色
'k'黑色'w'白色
表1-2 用PyLab库绘图的基本线型格式命令
线型
'-'实线
‘--’虚线
‘:’点线
表1-3 用PyLab库绘图的基本绘制标记格式命令
标记
'.''o'圆圈
's'正方形'*'星形
'+'加号'x'叉号

1.2.2  图像轮廓和直方图

        绘制图像的轮廓需要对每个坐标[x,y]的像素值施加一个阈值,所以首先要将图像灰度化。图像的直方图用来表征该图像像素的分布情况,用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。

from PIL import Image
from pylab import *

#读取图像到数组中
im = array(Image.open('xiaozhou.jpg').convert('L'))

#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点的左上角显示轮廓图像
contour(im,origin='image')
axis('equal')
axis('off')
show()

figure()
hist(im.flatten(),128)
show()

        contour(im,origin='image')绘制输入图像的轮廓图。origin='image' 参数将图像的原点设置在左上角(通常情况下,原点默认在左下角)。axis('equal')确保 x 和 y 轴具有相同的缩放比例,以保持图像的实际比例。上述代码运行的结果如下图。

图1.2  用Matplotlib绘制图像等轮廓线
图1.3  用Matplotlib绘制直方图

1.3  NumPy

        NumPy(Numerical Python的缩写)是一个广泛使用的Python库,主要用于进行数值计算。它为Python提供了一个强大的N维数组对象,并提供了许多用于操作这些数组的函数和工具。

        1.3.1  图像数组表示

        NumPy中的数组对象是多维的,可以用来表示向量、矩阵和图像。一个数组对象很像一个列表,但是数组所有的元素必须具有相同的数据类型。除非创建数组对象时指定数据类型,否则数据类型会按照数据的类型自动确定。

im = array(Image.open('xiaozhou.jpg'))
print(im.shape,im.dtype)

im1 = array(Image.open('xiaozhou.jpg').convert('L'),'f')
print(im1.shape,im1.dtype)

控制台输出的结果如下

(2000, 2999, 3) uint8
(2000, 2999) float32

        每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表 示数组元素的数据类型。

        1.3.2  灰度变换

        考虑到任意函数f,它将[0,255]区间映射到自身,也就是说输出区间的范围和输入区间的范围相同。

from PIL import Image
from pylab import *

im1 = array(Image.open('blue_sky.jpg').convert('L'))

im2 = 255 - im1 #对图像进行反相处理

im3 = (100.0/255) * im1 + 100  #将图像像素变换到100...200区间

im4 = 255.0 * (im1/255.0)**2 #对图像像素求平方后得到的图像

运行结果如下图所示

图1.4  对图像进行反相处理
图1.5  将图像像素变换到[100,200]区间
图1.6  对图像做二次变换

        1.3.3  图像缩放

def imresize(im,sz):
    """使用PIL对象重新定义图像数组的大小"""
    pil_im = Image.fromarray(uint8(im))
    return array(pil_im.resize(sz))

       首先,将输入的图像数组 im 转换为 uint8 数据类型,以确保图像像素值在0到255之间,这是PIL库处理图像时所需的格式;再将NumPy数组转换为PIL图像对象,赋值给变量 pil_im;最后使用给定的尺寸 sz 调整图像的大小,并返回一个新的PIL图像对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值