精华内容
下载资源
问答
  • 数字图像处理图片库

    热门讨论 2012-10-20 21:27:56
    最全的数字图处理相关图片 最典型的图片 有bmp gray color 等标准图片
  • 数字图像处理图片库,比如lenna和拍照的男人等经典图片素材
  • 数字图像处理通用图片素材,包括Lena、Cameraman、Couple等经典图片的灰度&RGB图。
  • 包括常用的数字图像处理的标准图,包括lena,cameraman等等经典图片
  • Html5图片图像处理JS

    2016-05-18 00:28:34
    基于html5的JS图片图像处理库 简单快捷的API 多图层操作 与PS对应的17种图层混合模式 多种基本滤镜处理效果 多种组合风格效果
  • 今天,我们先来介绍其中之一,pillow,用于图像处理。首先展示一下需要处理的图像。1.jpg1.打开图片首先是open方法,open方法用于加载已存在的图像文件。当然,记得资源用完之后要关闭资源,使用close()方法。from ...

    Python已成为主流的编程语言之一,也是大多数软件工程师必备的技能之一,究其原因是因为其强大的第三方库。今天,我们先来介绍其中之一,pillow,用于图像处理。首先展示一下需要处理的图像。

    1.jpg

    1.打开图片

    首先是open方法,open方法用于加载已存在的图像文件。当然,记得资源用完之后要关闭资源,使用close()方法。from PILimport Image

    f = Image.open("1.jpg")

    print(f.size,f.format)

    f.close()

    结果如下:

    执行结果

    其中format属性指定图片的类型,size指定图片的大小。如果图片不能被打开,那么将会出现OSError。如果想要查看打开的图片可以使用show()方法,当你使用方法时,图片会使用需系统的图片浏览器打开。当你想要保存你的图片时,使用save()方法。

    2.裁剪图片

    pillow裁剪图片通过设定图片的region来截取图片,主要通过crop方法实现,crop包含一个元组参数,由四个值组成,分别指定图像左侧,上侧,右侧,下侧的位置,从而设定截取图片的区域。如下例。with Image.open("1.jpg")as f:

    print(f,f.format,f.size,f.mode)

    box = [900,100,1300,700]

    r = f.crop(box)

    print(r)

    try:

    r.save("2.gif","GIF")

    except Exception as e:

    print(e)

    上述代码,通过box设定了截取的区域,然后使用save方法保存图片,便得到了结果,但需要注意的是,box的四个元组的值要符合图片的规范,例如左侧值小于右侧值,否侧会抛出ValueError。裁剪结果如下:

    裁剪结果

    对于裁剪,还可以拓展一些功能,就是将图片分解然后重新拼接,下面就是一个例子。from PILimport Image

    def roll(image, delta):

    """Roll an image sideways."""

    xsize, ysize = image.size

    delta = delta % xsize

    if delta ==0:return image

    part1 = image.crop((0,0, delta, ysize))

    part1.show()

    part2 = image.crop((delta,0, xsize, ysize))

    part2.show()

    image.paste(part1, (xsize-delta,0, xsize, ysize))

    image.paste(part2, (0,0, xsize-delta, ysize))

    return image

    f = Image.open("1.jpg")

    f = roll(f,200)

    f.show()

    f.close()

    上面代码就将图片分成两部分,然后通过paste方法,重新组装成一个图片,paste方法有两个参数,第一个参数为图片对象,第二个参数为图片要覆盖的区域region。实现的结果如下。

    组装结果

    展开全文
  • 第 1 章 基本的图像操作和处理本章讲解操作和处理图像的基础知识,将通过大量...1.1 PIL:Python图像处理类库PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图...

    第 1 章 基本的图像操作和处理

    本章讲解操作和处理图像的基础知识,将通过大量示例介绍处理图像所需的 Python 工具包,并介绍用于读取图像、图像转换和缩放、计算导数、画图和保存结果等的基本工具。这些工具的使用将贯穿本书的剩余章节。

    1.1 PIL:Python图像处理类库

    PIL(Python Imaging Library Python,图像处理类库)提供了通用的图像处理功能,以及大量有用的基本图像操作,比如图像缩放、裁剪、旋转、颜色转换等。PIL 是免费的,可以从http://www.pythonware.com/products/pil/ 下载。

    利用 PIL 中的函数,我们可以从大多数图像格式的文件中读取数据,然后写入最常见的图像格式文件中。PIL 中最重要的模块为 Image。要读取一幅图像,可以使用:

    from PIL import Image

    pil_im = Image.open('empire.jpg')

    上述代码的返回值 pil_im 是一个 PIL 图像对象。

    图像的颜色转换可以使用 convert() 方法来实现。要读取一幅图像,并将其转换成灰度图像,只需要加上 convert('L'),如下所示:

    pil_im = Image.open('empire.jpg').convert('L')

    图 1-1:用 PIL 处理图像的例子

    1.1.1 转换图像格式

    通过 save() 方法,PIL 可以将图像保存成多种格式的文件。下面的例子从文件名列表(filelist)中读取所有的图像文件,并转换成 JPEG 格式:

    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

    PIL 的 open() 函数用于创建 PIL 图像对象,save() 方法用于保存图像到具有指定文件名的文件。除了后缀变为“.jpg”,上述代码的新文件名和原文件名相同。PIL 是个足够智能的类库,可以根据文件扩展名来判定图像的格式。PIL 函数会进行简单的检查,如果文件不是 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')]

    现在,回到 PIL。

    1.1.2 创建缩略图

    使用 PIL 可以很方便地创建图像的缩略图。thumbnail() 方法接受一个元组参数(该参数指定生成缩略图的大小),然后将图像转换成符合元组参数指定大小的缩略图。例如,创建最长边为 128 像素的缩略图,可以使用下列命令:

    pil_im.thumbnail((128,128))

    1.1.3 复制和粘贴图像区域

    使用 crop() 方法可以从一幅图像中裁剪指定区域:

    box = (100,100,400,400)

    region = pil_im.crop(box)

    该区域使用四元组来指定。四元组的坐标依次是(左,上,右,下)。PIL 中指定坐标系的左上角坐标为(0,0)。我们可以旋转上面代码中获取的区域,然后使用 paste() 方法将该区域放回去,具体实现如下:

    region = region.transpose(Image.ROTATE_180)

    pil_im.paste(region,box)

    1.1.4 调整尺寸和旋转

    要调整一幅图像的尺寸,我们可以调用 resize() 方法。该方法的参数是一个元组,用来指定新图像的大小:

    out = pil_im.resize((128,128))

    要旋转一幅图像,可以使用逆时针方式表示旋转角度,然后调用 rotate() 方法:

    out = pil_im.rotate(45)

    上述例子的输出结果如图 1-1 所示。最左端是原始图像,然后是灰度图像、粘贴有旋转后裁剪图像的原始图像,最后是缩略图。

    1.2 Matplotlib

    我们处理数学运算、绘制图表,或者在图像上绘制点、直线和曲线时,Matplotlib 是个很好的类库,具有比 PIL 更强大的绘图功能。Matplotlib 可以绘制出高质量的图表,就像本书中的许多插图一样。Matplotlib 中的 PyLab 接口包含很多方便用户创建图像的函数。Matplotlib 是开源工具,可以从 http://matplotlib.sourceforge.net/ 免费下载。该链接中包含非常详尽的使用说明和教程。下面的例子展示了本书中需要使用的大部分函数。

    1.2.1 绘制图像、点和线

    尽管 Matplotlib 可以绘制出较好的条形图、饼状图、散点图等,但是对于大多数计算机视觉应用来说,仅仅需要用到几个绘图命令。最重要的是,我们想用点和线来表示一些事物,比如兴趣点、对应点以及检测出的物体。下面是用几个点和一条线绘制图像的例子:

    from PIL import Image

    from pylab import *

    # 读取图像到数组中

    im = array(Image.open('empire.jpg'))

    # 绘制图像

    imshow(im)

    # 一些点

    x = [100,100,400,400]

    y = [200,500,200,500]

    # 使用红色星状标记绘制点

    plot(x,y,'r*')

    # 绘制连接前两个点的线

    plot(x[:2],y[:2])

    # 添加标题,显示绘制的图像

    title('Plotting: "empire.jpg"')

    show()

    上面的代码首先绘制出原始图像,然后在 x 和 y 列表中给定点的 x 坐标和 y 坐标上绘制出红色星状标记点,最后在两个列表表示的前两个点之间绘制一条线段(默认为蓝色)。该例子的绘制结果如图 1-2 所示。show() 命令首先打开图形用户界面(GUI),然后新建一个图像窗口。该图形用户界面会循环阻断脚本,然后暂停,直到最后一个图像窗口关闭。在每个脚本里,你只能调用一次show() 命令,而且通常是在脚本的结尾调用。注意,在 PyLab 库中,我们约定图像的左上角为坐标原点。

    图像的坐标轴是一个很有用的调试工具;但是,如果你想绘制出较美观的图像,加上下列命令可以使坐标轴不显示:

    axis('off')

    上面的命令将绘制出如图 1-2 右边所示的图像。

    图 1-2:Matplotlib 绘图示例。带有坐标轴和不带坐标轴的包含点和一条线段的图像

    在绘图时,有很多选项可以控制图像的颜色和样式。最有用的一些短命令如表 1-1、表 1-2 和表 1-3 所示。使用方法见下面的例子:

    plot(x,y) # 默认为蓝色实线

    plot(x,y,'r*') # 红色星状标记

    plot(x,y,'go-') # 带有圆圈标记的绿线

    plot(x,y,'ks:') # 带有正方形标记的黑色虚线

    表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] 的像素值施加同一个阈值,所以首先需要将图像灰度化:

    from PIL import Image

    from pylab import *

    # 读取图像到数组中

    im = array(Image.open('empire.jpg').convert('L'))

    # 新建一个图像

    figure()

    # 不使用颜色信息

    gray()

    # 在原点的左上角显示轮廓图像

    contour(im, origin='image')

    axis('equal')

    axis('off')

    像之前的例子一样,这里用 PIL 的 convert() 方法将图像转换成灰度图像。

    图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。该(灰度)图像的直方图可以使用hist() 函数绘制:

    figure()

    hist(im.flatten(),128)

    show()

    hist() 函数的第二个参数指定小区间的数目。需要注意的是,因为 hist() 只接受一维数组作为输入,所以我们在绘制图像直方图之前,必须先对图像进行压平处理。flatten() 方法将任意数组按照行优先准则转换成一维数组。图 1-3 为等轮廓线和直方图图像。

    图 1-3:用 Matplotlib 绘制图像等轮廓线和直方图

    1.2.3 交互式标注

    有时用户需要和某些应用交互,例如在一幅图像中标记一些点,或者标注一些训练数据。PyLab库中的 ginput() 函数就可以实现交互式标注。下面是一个简短的例子:

    from PIL import Image

    from pylab import *

    im = array(Image.open('empire.jpg'))

    imshow(im)

    print 'Please click 3 points'

    x = ginput(3)

    print 'you clicked:',x

    show()

    上面的脚本首先绘制一幅图像,然后等待用户在绘图窗口的图像区域点击三次。程序将这些点击的坐标 [x, y] 自动保存在 x 列表里。

    1.3 NumPy

    NumPy(http://www.scipy.org/NumPy/)是非常有名的 Python 科学计算工具包,其中包含了大量有用的思想,比如数组对象(用来表示向量、矩阵、图像等)以及线性代数函数。NumPy 中的数组对象几乎贯穿用于本书的所有例子中 1 数组对象可以帮助你实现数组中重要的操作,比如矩阵乘积、转置、解方程系统、向量乘积和归一化,这为图像变形、对变化进行建模、图像分类、图像聚类等提供了基础。

    1PyLab 实际上包含 NumPy 的一些内容,如数组类型。这也是我们能够在 1.2 节使用数组类型的原因。

    NumPy 可以从 http://www.scipy.org/Download 免费下载,在线说明文档(http://docs.scipy.org/doc/numpy/)包含了你可能遇到的大多数问题的答案。关于 NumPy 的更多内容,请参考开源书籍 [24]。

    1.3.1 图像数组表示

    在先前的例子中,当载入图像时,我们通过调用 array() 方法将图像转换成 NumPy 的数组对象,但当时并没有进行详细介绍。NumPy 中的数组对象是多维的,可以用来表示向量、矩阵和图像。一个数组对象很像一个列表(或者是列表的列表),但是数组中所有的元素必须具有相同的数据类型。除非创建数组对象时指定数据类型,否则数据类型会按照数据的类型自动确定。

    对于图像数据,下面的例子阐述了这一点:

    im = array(Image.open('empire.jpg'))

    print im.shape, im.dtype

    im = array(Image.open('empire.jpg').convert('L'),'f')

    print im.shape, im.dtype

    控制台输出结果如下所示:

    (800, 569, 3) uint8

    (800, 569) float32

    每行的第一个元组表示图像数组的大小(行、列、颜色通道),紧接着的字符串表示数组元素的数据类型。因为图像通常被编码成无符号八位整数(uint8),所以在第一种情况下,载入图像并将其转换到数组中,数组的数据类型为“uint8”。在第二种情况下,对图像进行灰度化处理,并且在创建数组时使用额外的参数“f”;该参数将数据类型转换为浮点型。关于更多数据类型选项,可以参考图书 [24]。注意,由于灰度图像没有颜色信息,所以在形状元组中,它只有两个数值。

    数组中的元素可以使用下标访问。位于坐标 i、j,以及颜色通道 k 的像素值可以像下面这样访问:

    value = im[i,j,k]

    多个数组元素可以使用数组切片方式访问。切片方式返回的是以指定间隔下标访问该数组的元素值。下面是有关灰度图像的一些例子:

    im[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行

    im[:,i] = 100 # 将第 i 列的所有数值设为100

    im[:100,:50].sum() # 计算前100 行、前 50 列所有数值的和

    im[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)

    im[i].mean() # 第 i 行所有数值的平均值

    im[:,-1] # 最后一列

    im[-2,:] (or im[-2]) # 倒数第二行

    注意,示例仅仅使用一个下标访问数组。如果仅使用一个下标,则该下标为行下标。注意,在最后几个例子中,负数切片表示从最后一个元素逆向计数。我们将会频繁地使用切片技术访问像素值,这也是一个很重要的思想。

    我们有很多操作和方法来处理数组对象。本书将在使用到的地方逐一介绍。你可以查阅在线文档或者开源图书 [24] 获取更多信息。

    1.3.2 灰度变换

    将图像读入 NumPy 数组对象后,我们可以对它们执行任意数学操作。一个简单的例子就是图像的灰度变换。考虑任意函数 f,它将 0...255 区间(或者 0...1 区间)映射到自身(意思是说,输出区间的范围和输入区间的范围相同)。下面是关于灰度变换的一些例子:

    from PIL import Image

    from numpy import *

    im = array(Image.open('empire.jpg').convert('L'))

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

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

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

    第一个例子将灰度图像进行反相处理;第二个例子将图像的像素值变换到 100...200 区间;第三个例子对图像使用二次函数变换,使较暗的像素值变得更小。图 1-4 为所使用的变换函数图像。图 1-5 是输出的图像结果。你可以使用下面的命令查看图像中的最小和最大像素值:

    print int(im.min()), int(im.max())

    图 1-4:灰度变换示例。三个例子中所使用函数的图像,其中虚线表示恒等变换

    图 1-5:灰度变换。对图像应用图 1-4 中的函数:f(x)=255-x 对图像进行反相处理(左);f(x)=(100/255)x+100 对图像进行变换(中);f(x)=255(x/255)2 对图像做二次变换(右)

    如果试着对上面例子查看最小值和最大值,可以得到下面的输出结果:

    2 255

    0 253

    100 200

    0 255

    array() 变换的相反操作可以使用 PIL 的 fromarray() 函数完成:

    pil_im = Image.fromarray(im)

    如果你通过一些操作将“uint8”数据类型转换为其他数据类型,比如之前例子中的 im3 或者 im4,那么在创建 PIL 图像之前,需要将数据类型转换回来:

    pil_im = Image.fromarray(uint8(im))

    如果你并不十分确定输入数据的类型,安全起见,应该先转换回来。注意,NumPy 总是将数组数据类型转换成能够表示数据的“最低”数据类型。对浮点数做乘积或除法操作会使整数类型的数组变成浮点类型。

    1.3.3 图像缩放

    NumPy 的数组对象是我们处理图像和数据的主要工具。想要对图像进行缩放处理没有现成简单的方法。我们可以使用之前 PIL 对图像对象转换的操作,写一个简单的用于图像缩放的函数。把下面的函数添加到 imtool.py 文件里:

    def imresize(im,sz):

    """ 使用PIL 对象重新定义图像数组的大小"""

    pil_im = Image.fromarray(uint8(im))

    return array(pil_im.resize(sz))

    我们将会在接下来的内容中使用这个函数。

    1.3.4 直方图均衡化

    图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。

    在这种情况下,直方图均衡化的变换函数是图像中像素值的累积分布函数(cumulative distribution function,简写为 cdf,将像素值的范围映射到目标范围的归一化操作)。

    下面的函数是直方图均衡化的具体实现。将这个函数添加到 imtool.py 里:

    def histeq(im,nbr_bins=256):

    """ 对一幅灰度图像进行直方图均衡化"""

    # 计算图像的直方图

    imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)

    cdf = imhist.cumsum() # cumulative distribution function

    cdf = 255 * cdf / cdf[-1] # 归一化

    # 使用累积分布函数的线性插值,计算新的像素值

    im2 = interp(im.flatten(),bins[:-1],cdf)

    return im2.reshape(im.shape), cdf

    该函数有两个输入参数,一个是灰度图像,一个是直方图中使用小区间的数目。函数返回直方图均衡化后的图像,以及用来做像素值映射的累积分布函数。注意,函数中使用到累积分布函数的最后一个元素(下标为 -1),目的是将其归一化到 0...1 范围。你可以像下面这样使用该函数:

    from PIL import Image

    from numpy import *

    im = array(Image.open('AquaTermi_lowcontrast.jpg').convert('L'))

    im2,cdf = imtools.histeq(im)

    图 1-6 和图 1-7 为上面直方图均衡化例子的结果。上面一行显示的分别是直方图均衡化之前和之后的灰度直方图,以及累积概率分布函数映射图像。可以看到,直方图均衡化后图像的对比度增强了,原先图像灰色区域的细节变得清晰。

    图 1-6:直方图均衡化示例。左侧为原始图像和直方图,中间图为灰度变换函数,右侧为直方图均衡化后的图像和相应直方图

    图 1-7:直方图均衡化示例。左侧为原始图像和直方图,中间图为灰度变换函数,右侧为直方图均衡化后的图像和相应直方图

    1.3.5 图像平均

    图像平均操作是减少图像噪声的一种简单方式,通常用于艺术特效。我们可以简单地从图像列表中计算出一幅平均图像。假设所有的图像具有相同的大小,我们可以将这些图像简单地相加,然后除以图像的数目,来计算平均图像。下面的函数可以用于计算平均图像,将其添加到 imtool.py 文件里:

    def compute_average(imlist):

    """ 计算图像列表的平均图像"""

    # 打开第一幅图像,将其存储在浮点型数组中

    averageim = array(Image.open(imlist[0]), 'f')

    for imname in imlist[1:]:

    try:

    averageim += array(Image.open(imname))

    except:

    print imname + '...skipped'

    averageim /= len(imlist)

    # 返回uint8 类型的平均图像

    return array(averageim, 'uint8')

    该函数包括一些基本的异常处理技巧,可以自动跳过不能打开的图像。我们还可以使用 mean() 函数计算平均图像。mean() 函数需要将所有的图像堆积到一个数组中;也就是说,如果有很多图像,该处理方式需要占用很多内存。我们将会在下一节中使用该函数。

    1.3.6 图像的主成分分析(PCA)

    PCA(Principal Component Analysis,主成分分析)是一个非常有用的降维技巧。它可以在使用尽可能少维数的前提下,尽量多地保持训练数据的信息,在此意义上是一个最佳技巧。即使是一幅 100×100 像素的小灰度图像,也有 10 000 维,可以看成 10 000 维空间中的一个点。一兆像素的图像具有百万维。由于图像具有很高的维数,在许多计算机视觉应用中,我们经常使用降维操作。PCA 产生的投影矩阵可以被视为将原始坐标变换到现有的坐标系,坐标系中的各个坐标按照重要性递减排列。

    为了对图像数据进行 PCA 变换,图像需要转换成一维向量表示。我们可以使用 NumPy 类库中的flatten() 方法进行变换。

    将变平的图像堆积起来,我们可以得到一个矩阵,矩阵的一行表示一幅图像。在计算主方向之前,所有的行图像按照平均图像进行了中心化。我们通常使用 SVD(Singular Value Decomposition,奇异值分解)方法来计算主成分;但当矩阵的维数很大时,SVD 的计算非常慢,所以此时通常不使用 SVD 分解。下面就是 PCA 操作的代码:

    from PIL import Image

    from numpy import *

    def pca(X):

    """ 主成分分析:

    输入:矩阵X ,其中该矩阵中存储训练数据,每一行为一条训练数据

    返回:投影矩阵(按照维度的重要性排序)、方差和均值"""

    # 获取维数

    num_data,dim = X.shape

    # 数据中心化

    mean_X = X.mean(axis=0)

    X = X - mean_X

    if dim>num_data:

    # PCA- 使用紧致技巧

    M = dot(X,X.T) # 协方差矩阵

    e,EV = linalg.eigh(M) # 特征值和特征向量

    tmp = dot(X.T,EV).T # 这就是紧致技巧

    V = tmp[::-1] # 由于最后的特征向量是我们所需要的,所以需要将其逆转

    S = sqrt(e)[::-1] # 由于特征值是按照递增顺序排列的,所以需要将其逆转

    for i in range(V.shape[1]):

    V[:,i] /= S

    else:

    # PCA- 使用SVD 方法

    U,S,V = linalg.svd(X)

    V = V[:num_data] # 仅仅返回前nun_data 维的数据才合理

    # 返回投影矩阵、方差和均值

    return V,S,mean_X

    该函数首先通过减去每一维的均值将数据中心化,然后计算协方差矩阵对应最大特征值的特征向量,此时可以使用简明的技巧或者 SVD 分解。这里我们使用了 range() 函数,该函数的输入参数为一个整数 n,函数返回整数 0...(n-1) 的一个列表。你也可以使用 arange() 函数来返回一个数组,或者使用 xrange() 函数返回一个产生器(可能会提升速度)。我们在本书中贯穿使用range() 函数。

    如果数据个数小于向量的维数,我们不用 SVD 分解,而是计算维数更小的协方差矩阵 XXT 的特征向量。通过仅计算对应前 k(k 是降维后的维数)最大特征值的特征向量,可以使上面的 PCA 操作更快。由于篇幅所限,有兴趣的读者可以自行探索。矩阵 V 的每行向量都是正交的,并且包含了训练数据方差依次减少的坐标方向。

    我们接下来对字体图像进行 PCA 变换。fontimages.zip 文件包含采用不同字体的字符 a 的缩略图。所有的 2359 种字体可以免费下载 2。假定这些图像的名称保存在列表 imlist 中,跟之前的代码一起保存传在 pca.py 文件中,我们可以使用下面的脚本计算图像的主成分:

    from PIL import Image

    from numpy import *

    from pylab import *

    import pca

    im = array(Image.open(imlist[0])) # 打开一幅图像,获取其大小

    m,n = im.shape[0:2] # 获取图像的大小

    imnbr = len(imlist) # 获取图像的数目

    # 创建矩阵,保存所有压平后的图像数据

    immatrix = array([array(Image.open(im)).flatten()

    for im in imlist],'f')

    # 执行 PCA 操作

    V,S,immean = pca.pca(immatrix)

    # 显示一些图像(均值图像和前 7 个模式)

    figure()

    gray()

    subplot(2,4,1)

    imshow(immean.reshape(m,n))

    for i in range(7):

    subplot(2,4,i+2)

    imshow(V[i].reshape(m,n))

    show()

    注意,图像需要从一维表示重新转换成二维图像;可以使用 reshape() 函数。如图 1-8 所示,运行该例子会在一个绘图窗口中显示 8 个图像。这里我们使用了 PyLab 库的 subplot() 函数在一个窗口中放置多个图像。

    图 1-8:平均图像(左上)和前 7 个模式(具有最大方差的方向模式)

    1.3.7 使用pickle模块

    如果想要保存一些结果或者数据以方便后续使用,Python 中的 pickle 模块非常有用。pickle模块可以接受几乎所有的 Python 对象,并且将其转换成字符串表示,该过程叫做封装(pickling)。从字符串表示中重构该对象,称为拆封(unpickling)。这些字符串表示可以方便地存储和传输。

    我们来看一个例子。假设想要保存上一节字体图像的平均图像和主成分,可以这样来完成:

    # 保存均值和主成分数据

    f = open('font_pca_modes.pkl', 'wb')

    pickle.dump(immean,f)

    pickle.dump(V,f)

    f.close()

    在上述例子中,许多对象可以保存到同一个文件中。pickle 模块中有很多不同的协议可以生成 .pkl 文件;如果不确定的话,最好以二进制文件的形式读取和写入。在其他 Python 会话中载入数据,只需要如下使用 load() 方法:

    # 载入均值和主成分数据

    f = open('font_pca_modes.pkl', 'rb')

    immean = pickle.load(f)

    V = pickle.load(f)

    f.close()

    注意,载入对象的顺序必须和先前保存的一样。Python 中有个用 C 语言写的优化版本,叫做cpickle 模块,该模块和标准 pickle 模块完全兼容。关于 pickle 模块的更多内容,参见pickle 模块文档页 http://docs.python.org/library/pickle.html。

    在本书接下来的章节中,我们将使用 with 语句处理文件的读写操作。这是 Python 2.5 引入的思想,可以自动打开和关闭文件(即使在文件打开时发生错误)。下面的例子使用 with() 来实现保存和载入操作:

    # 打开文件并保存

    with open('font_pca_modes.pkl', 'wb') as f:

    pickle.dump(immean,f)

    pickle.dump(V,f)

    # 打开文件并载入

    with open('font_pca_modes.pkl', 'rb') as f:

    immean = pickle.load(f)

    V = pickle.load(f)

    上面的例子乍看起来可能很奇怪,但 with() 确实是个很有用的思想。如果你不喜欢它,可以使用之前的 open 和 close 函数。

    作为 pickle 的一种替代方式,NumPy 具有读写文本文件的简单函数。如果数据中不包含复杂的数据结构,比如在一幅图像上点击的点列表,NumPy 的读写函数会很有用。保存一个数组 x 到文件中,可以使用:

    savetxt('test.txt',x,'%i')

    最后一个参数表示应该使用整数格式。类似地,读取可以使用:

    x = loadtxt('test.txt')

    最后,NumPy 有专门用于保存和载入数组的函数。你可以在上面的在线文档里查看关于 save()和 load() 的更多内容。

    展开全文
  • 数字图像处理 国际标准图片库 很全哦 主要有128x128和512x512两种格式 该有的都有了 希望对大家有帮助
  • Sanselan 是一个纯 Java 的图形,可以读写各种格式的图像文件,包括快速解析图片信息例如大小/颜色/icc以及元数据等。尽管因为是Java开发的,在处理速度上会稍微慢一 些,但具备良好的可移植性。虽然尚未发布1.0 ...

    Sanselan 是一个纯 Java 的图形库,可以读写各种格式的图像文件,包括快速解析图片信息例如大小/颜色/icc以及元数据等。尽管因为是Java开发的,在处理速度上会稍微慢一 些,但具备良好的可移植性。虽然尚未发布1.0 版本,但是已经有多个项目在使用 Sanselan 来处理图像文件。

    该项目目前还是 Apache 组织的一个孵化项目。

    示例代码:

    File file = someFile;

    BufferedImage image_3 = Sanselan.getBufferedImage(file);

    InputStream is = someInputStream;

    BufferedImage image_4 = Sanselan.getBufferedImage(is);

    // Write an image.

    BufferedImage image = someImage;

    File dst = someFile;

    ImageFormat format = ImageFormat.IMAGE_FORMAT_PNG;

    Map optional_params = new Hashtable();

    Sanselan.writeImage(image, dst, format, optional_params);

    OutputStream os = someOutputStream;

    Sanselan.writeImage(image, os, format, optional_params);

    // get the image's embedded ICC Profile, if it has one.

    byte icc_profile_bytes[] = Sanselan.getICCProfileBytes(imageBytes);

    ICC_Profile icc_profile = Sanselan.getICCProfile(imageBytes);

    // get the image's width and height.

    Dimension d = Sanselan.getImageSize(imageBytes);

    // get all of the image's info (ie. bits per pixel, size, transparency, etc.)

    ImageInfo image_info = Sanselan.getImageInfo(imageBytes);

    if (image_info.getColorType() == ImageInfo.COLOR_TYPE_GRAYSCALE)

    System.out.println("Grayscale image.");

    if (image_info.getHeight() > 1000)

    System.out.println("Large image.");

    // try to guess the image's format.

    ImageFormat image_format = Sanselan.guessFormat(imageBytes);

    image_format.equals(ImageFormat.IMAGE_FORMAT_PNG);

    // get all metadata stored in EXIF format (ie. from JPEG or TIFF).

    // org.w3c.dom.Node node = Sanselan.getMetadataObsolete(imageBytes);

    IImageMetadata metdata = Sanselan.getMetadata(imageBytes);

    // print a dump of information about an image to stdout.

    Sanselan.dumpImageFile(imageBytes);

    // get a summary of format errors.

    FormatCompliance format_compliance = Sanselan

    .getFormatCompliance(imageBytes);

    http://www.oschina.net/p/sanselan/similar_projects?lang=22&sort=view

    展开全文
  • Python图像处理库:Pillow 初级教程。Image类Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。使用Image模块中的...

    Python图像处理库:Pillow 初级教程。

    Image类

    Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。

    使用Image模块中的open函数打开一张图片:

    >>> from PIL import Image

    >>> im = Image.open("lena.ppm")

    如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容

    >>> from __future__ import print_function

    >>> print(im.format, im.size, im.mode)

    PPM (512, 512) RGB

    format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;size属性是一个tuple,表示图像的宽和高(单位为像素);mode属性为表示图像的模式,常用的模式为:L为灰度图,RGB为真彩色,CMYK为pre-press图像。

    如果文件不能打开,则抛出IOError异常。

    当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片:

    >>> im.show()

    ps:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用xv进行显示。如果没有安装xv,该函数甚至不能工作。但是该方法非常便于debug和test。(windows中应该调用默认图片查看器打开)

    读写图片

    Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。

    Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。

    图片转成jpg格式

    from __future__ import print_function

    import os, sys

    from PIL import Image

    for infile in sys.argv[1:]:

    f, e = os.path.splitext(infile)

    outfile = f + ".jpg"

    if infile != outfile:

    try:

    Image.open(infile).save(outfile)

    except IOError:

    print("cannot convert", infile)

    save函数的第二个参数可以用来指定图片格式,如果文件名中没有给出一个标准的图像格式,那么第二个参数是必须的。

    创建缩略图

    from __future__ import print_function

    import os, sys

    from PIL import Image

    size = (128, 128)

    for infile in sys.argv[1:]:

    outfile = os.path.splitext(infile)[0] + ".thumbnail"

    if infile != outfile:

    try:

    im = Image.open(infile)

    im.thumbnail(size)

    im.save(outfile, "JPEG")

    except IOError:

    print("cannot create thumbnail for", infile)

    必须指出的是除非必须,Pillow不会解码或raster数据。当你打开一个文件,Pillow通过文件头确定文件格式,大小,mode等数据,余下数据直到需要时才处理。

    这意味着打开文件非常快,与文件大小和压缩格式无关。下面的程序用来快速确定图片属性:

    确定图片属性

    from __future__ import print_function

    import sys

    from PIL import Image

    for infile in sys.argv[1:]:

    try:

    with Image.open(infile) as im:

    print(infile, im.format, "%dx%d" % im.size, im.mode)

    except IOError:

    pass

    裁剪、粘贴、与合并图片

    Image类包含还多操作图片区域的方法。如crop()方法可以从图片中提取一个子矩形

    从图片中复制子图像

    box = im.copy() #直接复制图像

    box = (100, 100, 400, 400)

    region = im.crop(box)

    区域由4-tuple决定,该tuple中信息为(left, upper, right, lower)。 Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点,所以上例中截取的图片大小为300*300像素^2。

    处理子图,粘贴回原图

    region = region.transpose(Image.ROTATE_180)

    im.paste(region, box)

    将子图paste回原图时,子图的region必须和给定box的region吻合。该region不能超过原图。而原图和region的mode不需要匹配,Pillow会自动处理。

    另一个例子

    Rolling an image

    def roll(image, delta):

    "Roll an image sideways"

    image = image.copy() #复制图像

    xsize, ysize = image.size

    delta = delta % xsize

    if delta == 0: return image

    part1 = image.crop((0, 0, delta, ysize))

    part2 = image.crop((delta, 0, xsize, ysize))

    image.paste(part2, (0, 0, xsize-delta, ysize))

    image.paste(part1, (xsize-delta, 0, xsize, ysize))

    return image

    分离和合并通道

    r, g, b = im.split()

    im = Image.merge("RGB", (b, g, r))

    对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。

    几何变换

    Image类有resize()、rotate()和transpose()、transform()方法进行几何变换。

    简单几何变换

    out = im.resize((128, 128))

    out = im.rotate(45) # 顺时针角度表示

    置换图像

    out = im.transpose(Image.FLIP_LEFT_RIGHT)

    out = im.transpose(Image.FLIP_TOP_BOTTOM)

    out = im.transpose(Image.ROTATE_90)

    out = im.transpose(Image.ROTATE_180)

    out = im.transpose(Image.ROTATE_270)

    transpose()和象的rotate()没有性能差别。

    更通用的图像变换方法可以使用transform()

    模式转换

    convert()方法

    模式转换

    im = Image.open('lena.ppm').convert('L')

    图像增强

    Filter

    ImageFilter模块包含很多预定义的增强filters,通过filter()方法使用

    应用filters

    from PIL import ImageFilter

    out = im.filter(ImageFilter.DETAIL)

    像素点处理

    point()方法通过一个函数或者查询表对图像中的像素点进行处理(例如对比度操作)。

    像素点变换

    # multiply each pixel by 1.2

    out = im.point(lambda i: i * 1.2)

    上述方法可以利用简单的表达式进行图像处理,通过组合point()和paste()还能选择性地处理图片的某一区域。

    相关报道:

    最近时间有些紧, 源码 阅读 系列更新有些慢。鉴于Controller中代码比较少,本次Blog先更新该文件的源码分析。 在经过路由分发之后,实际的应用Controller接管用户的所有请求,并负责与用户数据的交互。CI中所有的应用控制器都应该是CI_Controller的子类(除非 更多

    由于需要项目需要管理微博平台内容,集成登录微博管理平台功能,所以在抓取网页基础上探索了一下浏览器模拟登 更多

    展开全文
  • 使用python完成图像处理或者计算机视觉的任务时,常常需要一个封装好的图像读取和简单处理的。很多朋友会使用opencv的python接口或者skimage等等模块,不过还有一个很不错的选择,那就是PIL(Python Image Library)...
  • pythonpython 使用OpenCV实现图像处理发布时间:2019-01-03 11:55:40作者:wangjian浏览量:998点赞量:0OpenCV是一个C++,目前流行的计算机视觉编程,用于实时处理计算机视觉方面的问题,它涵盖了很多计算机视觉...
  • 冈萨雷斯《数字图像处理》第三版全书图片库,适合于从事数字图像处理的人员。
  • 文章目录CS2 使用Python图像处理库Pillow处理图像文件CS2.1 安装PillowCS2.2 打开和显示图像CS2.3 图像的基本操作CS2.4 批量图像格式转换CS2.5 批量创建略缩图CS2.6 批量图像加文字水印CS2.7 批量图像加图片水印CS...
  • 图像处理库

    2019-09-24 10:26:59
     PyAV Summary: PyAV is a Pythonic binding for FFmpeg. Install: ...imageio Summary: 强大而简单的图片/视频读写, 不包含图像处理相关操作, 专注于读写 Home: https://imageio...
  • 数字图像处理(冈萨雷斯)书本全部完整原图片库
  • PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准了。PIL功能非常强大,但API却非常简单易用。由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字...
  • 图像处理学习者和研究者使用的图像素材,标准
  • 数字图像图片库

    2017-03-03 22:32:45
    数字图像处理专业,图像处理专用图片
  • ImageEnhance模块提供了一些用于图像增强的类。一、ImageEnhance模块的接口所有的增强类都实现了一个通用的接口,包括一个方法:enhancer.enhance(factor) ⇒ image该方法返回一个增强过的图像。变量factor是一个...
  • PIL:Python Imaging Library,已经是Python平台事实上的图像处理标准了。PIL功能非常强大,但API却非常简单易用。由于PIL仅支持到Python 2.7,加上年久失修,于是一群志愿者在PIL的基础上创建了兼容的版本,名字...
  • Photoshop图像处理期末参考试题 2 一单项选择题 本题中的两个图片从放大镜放大到足够大后的情况可以判定 图片 图片 图片图片的格式可能相同 图片是矢量图像 图片最基本组成单位是数学公式 D 图片是矢量图像 2下列...
  • 1. 介绍PIL(Python Image Library)是python的第三方图像处理库,但是由于其强大的功能与众多的使用人数,几乎已经被认为是python官方图像处理库了。其官方主页为:PIL。 PIL历史悠久,原来是只支持python2.x的版本的...
  • Python图像处理库

    千次阅读 2017-07-06 23:51:43
    Pillow为Python解释器添加了图像处理功能。它提供广泛的文件格式支持,高效的内部表示,以及相当强大的图像处理功能。 功能特点 图像存档Pillow是写图像存档和图像批处理应用程序的理想选择。您可以使用该...
  • Grafika PHP图像处理库

    2018-10-14 11:41:34
    Grafika是一个PHP图像处理库,是基于Imagick和GD,可以用于改变图片大小,剪裁,比较,添加水印等等功能。还有感知哈希,高级图像过滤,绘制贝塞尔曲线等功能,可谓非常强大。
  • python图像处理库PIL高清晰保存缩放图片 2016年01月08日 16:24:11天地一扁舟阅读数 13834更多 个人分类:python 原文地址:http://saepy.sinaapp.com/topic/66/在sae-python上使用pil-image-获取较高质量图片的...
  • 图像处理标准图像,包括44张图片,其中16张彩色图片,28张灰度图。包括Female、Airplane、Tank等。
  • python 图像处理 PIL

    2021-03-19 10:51:10
    # 读入图片,默认为RGB顺序,读出的变量img类型为Image类型, size为(width,height),但是为彩色三通道图像 img = Image.open("tmp.jpg") #显示图像 img.show() #返回图像的格式,'JPG' print(img.format) #返回...
  • 选择一个图像处理库吧有时候我搞不懂为什么现在很多人搞深度学习一上来就研究CNN,RNN,这些可以说是最简单的,真正细节的东西你直接就忽略了。你可能会否认,那我问你一个很简单的问题?VGG官方的版本对图片是怎么...
  • Java图像处理Thumbnails的使用 Thumbnails简介 Thumbnailator是一个优秀的图片处理的Google开源类库,处理图片效果比Java API的好,可以用于图片缩放,裁剪,加水印等。目前任不断更新。质量比较有保证。 Maven...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,052
精华内容 1,220
关键字:

图像处理图片库