精华内容
下载资源
问答
  • Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如open、save、conver、show…等功能。 open类 Image.open(file) ⇒ image Image.open(file, mode) ⇒ image ...

    Image模块

    Image模块是在Python PIL图像处理中常见的模块,对图像进行基础操作的功能基本都包含于此模块内。如opensaveconvershow…等功能。

    open类

    Image.open(file) ⇒ image
    Image.open(file, mode) ⇒ image

    要从文件加载图像,使用 open() 函数, 在 Image 模块:

    @zhangziju
    from PIL import Image             ##调用库
    im = Image.open("E:\mywife.jpg")  ##文件存在的路径
    im.show()             

    需要知道的是在win的环境下im.show的方式为win自带的图像显示应用。打开并确认给定的图像文件。这个是一个懒操作;该函数只会读文件头,而真实的图像数据直到试图处理该数据才会从

    文件读取(调用load()方法将强行加载图像数据)。如果变量mode被设置,那必须是“r”。用户可以使用一个字符串(表示文件名称的字符串)或者文件对象作为变量file的值。

    文件对象必须实现read(),seek()和tell()方法,并且以二进制模式打开。

    Save类

    im.save(outfile,options…)
    im.save(outfile, format, options…)

     若要保存文件,则使用 Image 类的 save() 方法,此时保存文件的文件名就变得十分重要了,除非指定格式,否则这个库将会以文件名的扩展名作为格式保存。

    使用给定的文件名保存图像。如果变量format缺省,如果可能的话,则从文件名称的扩展名判断文件的格式。该方法返回为空。关键字options为文件编写器提供一些额外的指令。

    如果编写器不能识别某个选项,它将忽略它。用户可以使用文件对象代替文件名称。在这种情况下,用户必须指定文件格式。文件对象必须实现了seek()、tell()和write()方法,

    且其以二进制模式打开。如果方法save()因为某些原因失败,这个方法将产生一个异常(通常为IOError异常)。如果发生了异常,该方法也有可能已经创建了文件,并向文件写入了一些数据。

    如果需要的话,用户的应用程序可以删除这个不完整的文件。

    @zhangziju 
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im)
    im.save("E:\mywife.png") ## 将"E:\mywife.jpg"保存为"E:\mywife.png"
    im = Image.open("E:\mywife.png") ##打开新的png图片
    print(im.format, im.size, im.mode)

     

    如下图,在指定路径下可看到新保存的png格式的图片。

    format类

    im.format ⇒ string or None

     这个属性标识了图像来源,如果图像不是从文件读取它的值就是None。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.format) ## 打印出格式信息
    im.show()

     如下图可以看到其format为”JPEG”。

    Mode类

    im.mode ⇒ string

     图像的模式,常见的mode 有 “L” (luminance) 表示灰度图像,“RGB”表示真彩色图像,和 “CMYK” 表示出版图像,表明图像所使用像素格式。如下表为常见的nodes描述:

     modes       描述
    1         1位像素,黑和白,存成8位的像素
    L         8位像素,黑白
    P         8位像素,使用调色板映射到任何其他模式
    RGB       3× 8位像素,真彩
    RGBA       4×8位像素,真彩+透明通道
    CMYK       4×8位像素,颜色隔离
    YCbCr       3×8位像素,彩色视频格式
    I         32位整型像素
    F         32位浮点型像素

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.mode) ## 打印出模式信息
    im.show()

     如下图为图片的mode为“RGB”模式。

    convert类

    im.convert(mode)⇒ image

     将当前图像转换为其他模式,并且返回新的图像。当从一个调色板图像转换时,这个方法通过这个调色板来转换像素。如果不对变量mode赋值,该方法将会选择一种模式,

    在没有调色板的情况下,使得图像和调色板中的所有信息都可以被表示出来。当从一个颜色图像转换为黑白图像时,PIL库使用ITU-R601-2 luma转换公式:

    L = R * 299/1000 + G * 587/1000 + B * 114/1000

     当转换为2位图像(模式“1”)时,源图像首先被转换为黑白图像。结果数据中大于127的值被设置为白色,其他的设置为黑色;这样图像会出现抖动。如果要使用其他阈值,更改阈值127,可以使用方法point()。为了去掉图像抖动现象,可以使用dither选项。

     from PIL import Image 
    im = Image.open("E:\mywife.jpg") 
    new_im = im.convert('P') 
    print(new_im.mode) 
    new_im.show()

     

    如下,将图像转换为“P”模式。

    对比原始图像。

    im.convert(“P”,**options) ⇒ image

       
    这个与第一个方法定义一样,但是当“RGB”图像转换为8位调色板图像时能更好的处理。可供选择的选项为:

    Dither=. 控制颜色抖动。默认是FLOYDSTEINBERG,与邻近的像素一起承担错误。不使能该功能,则赋值为NONE。

    Palette=. 控制调色板的产生。默认是WEB,这是标准的216色的“web palette”。要使用优化的调色板,则赋值为ADAPTIVE。

    Colors=. 当选项palette为ADAPTIVE时,控制用于调色板的颜色数目。默认是最大值,即256种颜色

    im.convert(mode,matrix) ⇒ image

    使用转换矩阵将一个“RGB”图像转换为“L”或者“RGB”图像。变量matrix为4或者16元组。

     from PIL import Image im = Image.open("E:\mywife.jpg") print(im.mode)
    rgb2xyz = (0.412453,0.357580, 0.180423, 0,
               0.212671,0.715160, 0.072169, 0,
               0.019334,0.119193, 0.950227, 0 )
    new_im = im.convert("L", rgb2xyz)
    print(new_im.mode)
    new_im.show()

     

    转换后效果

    Size类

    im.size ⇒ (width, height)

     图像的尺寸,按照像素数计算,它的返回值为宽度和高度的二元组(width, height)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size) ## 打印出尺寸信息
    im.show()

     

     如下图所示为图片的尺寸信息,750*560。

    Palette类

    im.palette ⇒ palette or None

    颜色调色板表格。如果图像的模式是“P”,则返回ImagePalette类的实例;否则,将为None。
    如下为对非“P”模式下的图像进行palette信息显示。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.palette)

     

    易知,返回值为空,none 

     

    对图像进行convert操作,转换成“P”模式

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    new_im = im.convert('P')
    print(new_im.mode)
    print(new_im.palette)

    则返回值为ImagePalette类的实例。如下:

    Info类

    im.info ⇒ dictionary

    存储图像相关数据的字典。文件句柄使用该字典传递从文件中读取的各种非图像信息。大多数方法在返回新的图像时都会忽略这个字典;

    因为字典中的键并非标准化的,对于一个方法,它不能知道自己的操作如何影响这个字典。如果用户需要这些信息,需要在方法open()返回时保存这个字典。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.info) 

     

     new类

     Image.new(mode,size) ⇒ image
    Image.new(mode, size,color) ⇒ image

     使用给定的变量mode和size生成新的图像。Size是给定的宽/高二元组,这是按照像素数来计算的。对于单通道图像,变量color只给定一个值;对于多通道图像,变量color给定一个元组(每个通道对应一个值)。

    在版本1.1.4及其之后,用户也可以用颜色的名称,比如给变量color赋值为“red”。如果没有对变量color赋值,图像内容将会被全部赋值为0(为黑色)。如果变量color是空,图像将不会被初始化,即图像的内容全为0。这对向该图像复制或绘制某些内容是有用的。
    如下为将图像设置为128x128大小的红色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128), "#FF0000")
    n_im.show()

     显示效果如下:

    如下图像为128x128大小的黑色图像,因为变量color不赋值的话,图像内容被设置为0,即黑色。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128))
    n_im.show()

     

    图像为128x128大小的绿色图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    n_im= Image.new("RGB", (128, 128),"green")
    n_im.show()

    Copy类

    im.copy() ⇒ image

     拷贝这个图像。如果用户想粘贴一些数据到这张图,可以使用这个方法,但是原始图像不会受到影响。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_copy = im.copy()

     

     图像im_copy和im完全一样。

    Crop类

    im.crop(box) ⇒ image

    从当前的图像中返回一个矩形区域的拷贝。变量box是一个四元组,定义了左、上、右和下的像素坐标。用来表示在原始图像中截取的位置坐标,如box(100,100,200,200)就表示在原始图像中以左上角为坐标原点,

    截取一个100*100(像素为单位)的图像,为方便理解,如下为示意图box(b1,a1,b2,a2)。作图软件为Visio2016。这是一个懒操作。对源图像的改变可能或者可能不体现在裁减下来的图像中。

    为了获取一个分离的拷贝,对裁剪的拷贝调用方法load()。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box = (300, 100, 700, 700) ##确定拷贝区域大小
    region = im.crop(box) ##将im表示的图片对象拷贝到region中,大小为
    box region.show()

     

     如下图为box截取的图像区域显示。

    Paste类

    im.paste(image,box)

    将一张图粘贴到另一张图像上。变量box或者是一个给定左上角的2元组,或者是定义了左,上,右和下像素坐标的4元组,或者为空(与(0,0)一样)。如果给定4元组,被粘贴的图像的尺寸必须与区域尺寸一样。如果模式不匹配,被粘贴的图像将被转换为当前图像的模式。

    @zhangziju 
    from PIL import Image 
    im = Image.open("E:\mywife.jpg") 
    box=[0,0,100,100] 
    im_crop = im.crop(box) 
    print(im_crop.size,im_crop.mode) 
    im.paste(im_crop, (100,100)) ##(100,100,0,0) 
    im.paste(im_crop, (400,400,500,500)) 
    im.show()

    如下图为paste操作:

    Filter类

    im.filter(filter) ⇒ image

     返回一个使用给定滤波器处理过的图像的拷贝。具体参考图像滤波在ImageFilter 模块的应用,在该模块中,预先定义了很多增强滤波器,可以通过filter( )函数使用,

    预定义滤波器包括:BLUR、CONTOUR、DETAIL、EDGE_ENHANCE、EDGE_ENHANCE_MORE、EMBOSS、FIND_EDGES、SMOOTH、SMOOTH_MORE、SHARPEN。

    其中BLUR就是均值滤波,CONTOUR找轮廓,FIND_EDGES边缘检测,使用该模块时,需先导入。

    @zhangziju 
    from PIL import Image
    from PIL import ImageFilter ## 调取ImageFilter imgF = Image.open("E:\mywife.jpg") bluF = imgF.filter(ImageFilter.BLUR) ##均值滤波 conF = imgF.filter(ImageFilter.CONTOUR) ##找轮廓 edgeF = imgF.filter(ImageFilter.FIND_EDGES) ##边缘检测 imgF.show() bluF.show() conF.show() edgeF.show()

    滤波处理下的gakki~

    Blend类

    Image.blend(image1,image2, alpha) ⇒ image

     使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。

    合成公式为:out = image1 (1.0 - alpha) + image2 alpha

     若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回第二张图像的拷贝。对变量alpha的值无限制。

    @zhangziju 
    from PIL import Image im1 = Image.open("E:\mywife.jpg") im2 = Image.open("E:\mywife2.jpg") print(im1.mode,im1.size) print(im2.mode,im2.size) im = Image.blend(im1, im2, 0.2) im.show()

     

     需保证两张图像的模式和大小是一致的,如下为显示im1和im2的具体信息。

    im1和im2按照第一张80%的透明度,第二张20%的透明度,合成为一张。

     

    Split

     im.split() ⇒ sequence

     返回当前图像各个通道组成的一个元组。例如,分离一个“RGB”图像将产生三个新的图像,分别对应原始图像的每个通道(红,绿,蓝)。

    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    print(r.mode)
    print(r.size)
    print(im.size)

     

    Composite类

    Image.composite(image1,image2, mask) ⇒ image

     复合类使用给定的两张图像及mask图像作为透明度,插值出一张新的图像。变量mask图像的模式可以为“1”,“L”或者“RGBA”。所有图像必须有相同的尺寸。

    @zhangziju 
    from PIL import Image im1 = Image.open("E:\mywife.jpg") im2 = Image.open("E:\mywife2.jpg") r,g,b = im1.split() ##分离出r,g,b print(b.mode) print(im1.mode,im1.size) print(im2.mode,im2.size) im = Image.composite(im1,im2,b) im.show()

     b.mode为”L”,两图尺寸一致。

    最终效果

    Eval类

    Image.eval(image,function) ⇒ image

     使用变量function对应的函数(该函数应该有一个参数)处理变量image所代表图像中的每一个像素点。如果变量image所代表图像有多个通道,那变量function对应的函数作用于每一个通道。注意:变量function对每个像素只处理一次,所以不能使用随机组件和其他生成器。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    def fun01(x):
        return x*0.3
    
    def fun02(y):
        return y*2.0
    
    im1_eval = Image.eval(im, fun01) 
    im2_eval = Image.eval(im, fun02) 
    im1_eval.show() 
    im2_eval.show()

     

     在函数fun01和fun02下的图像显示。

    Merge类

    Image.merge(mode,bands) ⇒ image

    合并类使用一些单通道图像,创建一个新的图像。变量bands为一个图像的元组或者列表,每个通道的模式由变量mode描述。所有通道必须有相同的尺寸。
    变量mode与变量bands的关系: 

    len(ImageMode.getmode(mode).bands)= len(bands)

    @zhangziju 
    from PIL import Image 
    im1 = Image.open("E:\mywife.jpg") 
    im2 = Image.open("E:\mywife2.jpg") 
    r1,g1,b1 = im1.split() 
    r2,g2,b2 = im2.split() 
    print(r1.mode,r1.size,g1.mode,g1.size) 
    print(r2.mode,r2.size,g2.mode,g2.size) 
    new_im=[r1,g2,b2] print(len(new_im)) 
    im_merge = Image.merge("RGB",new_im) 
    im_merge.show()

     打印信息显示

    merge操作

    Draft类

    im.draft(mode,size)

     配置图像文件加载器,使得返回一个与给定的模式和尺寸尽可能匹配的图像的版本。

    @zhangziju 
    from PIL import Image 
    im = Image.open("E:\mywife.jpg") 
    print(im.size,im.mode) 
    new_im = im.draft("L", (200,200)) 
    print(new_im.size,new_im.mode) 
    new_im.show()

     关键信息显示

    转换效果

    Getbands类

    im.getbands()⇒ tuple of strings

     返回包括每个通道名称的元组。例如,对于RGB图像将返回(“R”,“G”,“B”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbands())

     

     

    Getbbox类

    im.getbbox() ⇒ 4-tuple or None

     计算图像非零区域的包围盒。这个包围盒是一个4元组,定义了左、上、右和下像素坐标。如果图像是空的,这个方法将返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getbbox())

     

    Getdata类

    im.getdata() ⇒ sequence

       
    以包含像素值的sequence对象形式返回图像的内容。这个sequence对象是扁平的,以便第一行的值直接跟在第零行的值后面,等等。这个方法返回的sequence对象是PIL内部数据类型,它只支持某些sequence操作,

    包括迭代和基础sequence访问。使用list(im.getdata()),将它转换为普通的sequence。Sequence对象的每一个元素对应一个像素点的R、G和B三个值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    sequ = im.getdata()
    sequ0 = list(sequ)
    print(sequ0[0])
    print(sequ0[1])
    print(sequ0[2])

     

     可视化显示sequence0里面的数据。

    打印显示结果,与前面对比。

     

    Getextrema类

    im.getextrema() ⇒ 2-tuple

    返回一个2元组,包括该图像中的最小和最大值。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getextrema())

     

    该方法返回了R/G/B三个通道的最小和最大值的2元组。

    Getpixel类

    im.getpixel(xy) ⇒ value or tuple

     返回给定位置的像素值。如果图像为多通道,则返回一个元组。该方法执行比较慢;如果用户需要使用python处理图像中较大部分数据,可以使用像素访问对象(见load),或者方法getdata()。

    @zahngziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.getpixel((0,0)))
    print(im.getpixel((4,0)))
    r,g,b = im.split()
    print(b.getpixel((11,8)))   

     

    Histogram类

    im.histogram()⇒ list

     返回一个图像的直方图。这个直方图是关于像素数量的list,图像中的每个象素值对应一个成员。如果图像有多个通道,所有通道的直方图会连接起来(例如,“RGB”图像的直方图有768个值)。二值图像(模式为“1”)当作灰度图像(模式为“L”)处理。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    imhis = im.histogram()
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

     

    im.histogram(mask)⇒ list

    返回图像中模板图像非零地方的直方图。模板图像与处理图像的尺寸必须相同,并且要么是二值图像(模式为“1”),要么为灰度图像(模式为“L”)。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r,g,b = im.split()
    imhis = im.histogram()
    print(r.mode)
    print(len(imhis))
    print(imhis[0])
    print(imhis[150])
    print(imhis[300])

     

    Load类

    im.load()

    为图像分配内存并从文件中加载它(或者从源图像,对于懒操作)。正常情况下,用户不需要调用这个方法,因为在第一次访问图像时,Image类会自动地加载打开的图像。在1.1.6及以后的版本,方法load()返回一个用于读取和修改像素的像素访问对象。这个访问对象像一个二维队列,如:

     pix = im.load()
    print pix[x, y]
    pix[x, y] =value

     通过这个对象访问比方法getpixel()和putpixel()快很多。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    pix = im.load()
    print(pix[0,2])

     

    im.paste(colour,box)

     使用同一种颜色填充变量box对应的区域。对于单通道图像,变量colour为单个颜色值;对于多通道,则为一个元组。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste((256,256,0),(0,0,100,100))  ##(256,256,0)表示黄色
    im.show()

     

     

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.paste("blue",(0,0,100,100))   ##或者“blue”
    im.show()

     

    im.paste(image,box, mask)

     使用变量mask对应的模板图像来填充所对应的区域。可以使用模式为“1”、“L”或者“RGBA”的图像作为模板图像。模板图像的尺寸必须与变量image对应的图像尺寸一致。如果变量mask对应图像的值为255,则模板图像的值直接被拷贝过来;

    如果变量mask对应图像的值为0,则保持当前图像的原始值。变量mask对应图像的其他值,将对两张图像的值进行透明融合,如果变量image对应的为“RGBA”图像,即粘贴的图像模式为“RGBA”,则alpha通道被忽略。用户可以使用同样的图像作为原图像和模板图像。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    box=[300,300,400,400]
    im_crop =im.crop(box)
    r,g,b =im_crop.split()
    im.paste(im_crop, (200,200,300,300), r)
    im.show()

     

    Putdata类

    im.putdata(data)
    im.putdata(data, scale, offset)

     从sequence对象中拷贝数据到当前图像,从图像的左上角(0,0)位置开始。变量scale和offset用来调整sequence中的值:

     pixel = value*scale + offset

     如果变量scale忽略,则默认为1.0。如果变量offset忽略,则默认为0.0。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    r, g, b = im.split()
    print(
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    r.putdata([1, 2, 3, 4]),
    r.getpixel((0, 0)),
    r.getpixel((1, 0)),
    r.getpixel((2, 0)),
    r.getpixel((3, 0)),
    ) 

     

    Resize类

    im.resize(size) ⇒ image
    im.resize(size, filter) ⇒ image

    返回改变尺寸的图像的拷贝。变量size是所要求的尺寸,是一个二元组:(width, height)。变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。

    在当前的版本中bilinear和bicubic滤波器不能很好地适应大比例的下采样(例如生成缩略图)。用户需要使用ANTIALIAS,除非速度比质量更重要。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    region = im.resize((400, 400))     ##重新设定大小
    region.show()

    很明显由于大小的重新设定,图片的显示效果有所转变,gakki依然美腻~ 

     

    Rotate类

    im.rotate(angle) ⇒ image
    im.rotate(angle,filter=NEAREST, expand=0) ⇒ image

     返回一个按照给定角度顺时钟围绕图像中心旋转后的图像拷贝。变量filter是NEAREST、BILINEAR或者BICUBIC之一。如果省略该变量,或者图像模式为“1”或者“P”,则默认为NEAREST。变量expand,如果为true,表示输出图像足够大,可以装载旋转后的图像。如果为false或者缺省,则输出图像与输入图像尺寸一样大。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im_45 = im.rotate(45)
    im_30 = im.rotate(30, Image.NEAREST,1)
    print(im_45.size,im_30.size)
    im_45.show()
    im_30.show()

    Seek类

    im.seek(frame)

    在给定的文件序列中查找指定的帧。如果查找超越了序列的末尾,则产生一个EOFError异常。当文件序列被打开时,PIL库自动指定到第0帧上。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.mode)
    im_gif.show()    ##第0帧
    im_gif.seek(3)
    im_gif.show()
    im_gif.seek(9)
    im_gif.show()

     来来来~这是gakki原图欣赏下~

    查找帧seek()的效果如下:

     

    Tell类

    im.tell() ⇒ integer

     返回当前帧所处位置,从0开始计算。

    @zhangziju
    from PIL import Image
    im_gif = Image.open("E:\mywife.gif")
    print(im_gif.tell())
    im_gif.seek(8)
    print(im_gif.tell())

     

    Thumbnail类

    im.thumbnail(size)
    im.thumbnail(size, filter)

     修改当前图像,使其包含一个自身的缩略图,该缩略图尺寸不大于给定的尺寸。这个方法会计算一个合适的缩略图尺寸,使其符合当前图像的宽高比,调用方法draft()配置文件读取器,最后改变图像的尺寸。

    变量filter应该是NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果省略该变量,则默认为NEAREST。注意:在当前PIL的版本中,滤波器bilinear和bicubic不能很好地适应缩略图产生。

    用户应该使用ANTIALIAS,图像质量最好。如果处理速度比图像质量更重要,可以选用其他滤波器。这个方法在原图上进行修改。如果用户不想修改原图,可以使用方法copy()拷贝一个图像。这个方法返回空。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.thumbnail((100,100))

     

     Transform类

    im.transform(size,method, data) ⇒ image
    im.transform(size, method, data, filter) ⇒ image

     

          使用给定的尺寸生成一张新的图像,与原图有相同的模式,使用给定的转换方式将原图数据拷贝到新的图像中。在当前的PIL版本中,参数method为EXTENT(裁剪出一个矩形区域),AFFINE(仿射变换),QUAD(将正方形转换为矩形),

    MESH(一个操作映射多个正方形)或者PERSPECTIVE。变量filter定义了对原始图像中像素的滤波器。在当前的版本中,变量filter为NEAREST、BILINEAR、BICUBIC或者ANTIALIAS之一。如果忽略,或者图像模式为“1”或者“P”,该变量设置为NEAREST。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.EXTENT, (0, 0, 500, 500))
    print(imtra.size)
    imtra.show()

     

    im.transform(size,EXTENT, data) ⇒ image
    im.transform(size, EXTENT, data, filter) ⇒ image

         从图像中裁剪一个区域。变量data为指定输入图像中两个坐标点的4元组(x0,y0,x1,y1)。输出图像为这两个坐标点之间像素的采样结果。例如,如果输入图像的(x0,y0)为输出图像的(0,0)点,(x1,y1)则与变量size一样。

        这个方法可以用于在当前图像中裁剪,放大,缩小或者镜像一个任意的长方形。它比方法crop()稍慢,但是与resize操作一样快。

    im.transform(size, AFFINE, data) ⇒ image
    im.transform(size, AFFINE,data, filter) ⇒ image 

     对当前的图像进行仿射变换,变换结果体现在给定尺寸的新图像中。变量data是一个6元组(a,b,c,d,e,f),包含一个仿射变换矩阵的第一个两行。输出图像中的每一个像素(x,y),新值由输入图像的位置(ax+by+c, dx+ey+f)的像素产生,使用最接近的像素进行近似。这个方法用于原始图像的缩放、转换、旋转和裁剪。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.AFFINE, (1,2,3,2,1,4))
    print(imtra.size)
    imtra.show()

     

    im.transform(size,QUAD, data) ⇒ image
    im.transform(size, QUAD, data, filter) ⇒ image

     输入图像的一个四边形(通过四个角定义的区域)映射到给定尺寸的长方形。变量data是一个8元组(x0,y0,x1,y1,x2,y2,x3,y3),它包括源四边形的左上,左下,右下和右上四个角。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.QUAD, (0,0,0,500,600,500,600,0))
    print(imtra.size)
    imtra.show()

    im.transform(size,PERSPECTIVE, data) ⇒ image
    im.transform(size, PERSPECTIVE, data, filter) ⇒ image

     对当前图像进行透视变换,产生给定尺寸的新图像。变量data是一个8元组(a,b,c,d,e,f,g,h),包括一个透视变换的系数。对于输出图像中的每个像素点,新的值来自于输入图像的位置的(a x + b y + c)/(g x + h y + 1), (d x+ e y + f)/(g x + h y + 1)像素,使用最接近的像素进行近似。这个方法用于原始图像的2D透视。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    print(im.size)
    imtra = im.transform((200, 200), Image.PERSPECTIVE, (1,2,3,2,1,6,1,2))
    print(imtra.size)
    imtra.show()

     

    wocao!!!gakki不见了!!!

    Transpose类

    im.transpose(method)⇒ image

     返回当前图像的翻转或者旋转的拷贝。变量method的取值为:FLIP_LEFT_RIGHT,FLIP_TOP_BOTTOM,ROTATE_90,ROTATE_180,或ROTATE_270。

    @zhangziju
    from PIL import Image
    im = Image.open("E:\mywife.jpg")
    im.rotate(45)                             #逆时针旋转 45 度角。
    im.transpose(Image.FLIP_LEFT_RIGHT)       #左右对换。
    im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
    im.transpose(Image.ROTATE_90)             #旋转 90 度角。
    im.transpose(Image.ROTATE_180)            #旋转 180 度角。
    im.transpose(Image.ROTATE_270)            #旋转 270 度角。

     

     

    参考链接:https://blog.csdn.net/zhangziju/article/details/79123275

     

    转载于:https://www.cnblogs.com/moying-wq/p/10982135.html

    展开全文
  • ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件。在 github:https://github.com/Image-Py/imagepy上,不仅有关于这款图像处理软件的详细介绍,还有一些使用示例,雷锋网 AI 科技评论接下来将详细...

    ImagePy 是一款 python 开源图像处理框架,其 UI 界面支持开放插件。在 github:https://github.com/Image-Py/imagepy上,不仅有关于这款图像处理软件的详细介绍,还有一些使用示例,雷锋网 AI 科技评论接下来将详细介绍这一开源图像处理框架。

    ImagePy 是一款基于 imagej 等插件的图像处理框架,它可以与 scipy.ndimage、scikit-image、opencv、simpleitk、mayavi 以及任何基于 numpy 的库进行组合使用,其地址为 http://imagepy.org。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    简介

    ImagePy 是用 python 编写的开源图像处理框架。它的 UI 接口、图像数据结构和表数据结构分别是基于 wxpython、numpy 和 pandas 的。此外,它支持任何基于 numpy 和 pandas 的插件,这些插件可以轻松地在 scipy.ndimage、scikit-image、simpleitk、opencv 和其他图像处理库之间进行通信。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    概览,鼠标测量,几何变换,过滤,分割,计数等

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    如果你更喜欢 IJ 样式,请尝试使用「 Windows -> Windows Style 」来切换

    更多Python视频、源码、资料加群683380553免费获取

    ImagePy:

    • 具有用户友好的界面;

    • 可以读取/保存各种格式的图像数据;

    • 支持 ROI 设置、绘图、测量和其他鼠标操作;

    • 可以执行图像滤波、形态学操作和其他常规操作;

    • 可以进行图像分割、区域计数、几何测量和密度分析;

    • 能够对从图像中提取的参数进行相关的数据分析、滤波、统计分析等。

    这个项目的长期目标是成为 ImageJ 和 SPSS 的联合体。

    地址:

    https://academic.oup.com/bioinformatics/article-abstract/34/18/3238/4989871?redirectedFrom=fulltext

    安装:

    支持的系统:带有 python2.7 和 python3 及以上版本的 windows、linux、mac 系统。

    1. ImagePy 是一个基于 wxpython 的 ui 框架,它不能在 linux 上用 pip 进行安装。你需要下载和你的 linux 系统相匹配的 whl文件。

    2. 因为 ImagePy 会编写一些配置信息,因此,在 linux 和 mac 系统上,可能会存在权限问题,所以请从 sudo 命令开始。如果使用 pip 安装,请按照下面的方法来添加用户参数:pipsinstall--user imagepy。

    3. 如果在 anaconda 虚拟环境中安装 ImagePy,那么你可能会遇到这样的错误:这个程序需要屏幕访问权限。请使用 python 构建的框架来运行,并且只有在你已经登录到主显示器上时才这样做,如果遇到这个问题,请从 pythonw-m 镜像开始。

    基本操作:

    ImagePy 有一组非常丰富的特性,在这里,我们使用一个具体的示例向你展示 ImagePy 的这些特性。我们选择官方使用 scikit-image 来分割硬币的例子,因为这个例子简单而全面。

    打开图像

    菜单打开:file -> local samples -> coins,来打开 ImagePy 中的示例图像。ps:ImagePy 支持 bmp、jpg、png、gif、tif 和其他常用的文件格式。通过安装 ITK 插件,还可以读取/保存 dicom、nii 和其他格式的医学图像。如果安装了 opencv,还可以读/写 wmv、avi 和其他格式的视频。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    硬币

    过滤与分割

    选择一个复合滤波器对图像进行 sobel 梯度提取,然后使用上下阈值作为标记,最后在梯度图上进行 watersheds 分割。滤波和分割是图像处理工具包中的关键技术,也是最终测量成败的关键。还支持诸如自适应阈值、watersheds 等分割方法。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    Up And Down Watershed 分割

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    掩模

    二值化

    菜单打开:process -> binary -> binary fill holes

    分割后得到的掩模图像比较干净,但仍存在一些空洞和杂质,干扰了计数和测量。ImagePy 支持二进制操作,如腐蚀、膨胀、开环和闭环,以及轮廓提取、中心轴提取和距离转换。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    填洞

    几何滤波

    菜单打开:analysis -> region analysis -> geometry filter

    ImagePy 可以根据面积、周长、拓扑、稳定性和离心率等参数进行几何滤波。还可以使用多个条件进行筛选。每个数字可以是正的(或者负的),这表示所保存的对象的相应参数分别大于(或者小于)相对值。保存的对象将被设置为前色,拒绝的对象将被设置为背景色。在这个演示中,背景颜色设置为 100,以便查看有哪些对象被过滤掉了。一旦对结果满意,就将背景色设置为 0。此外,ImagePy 还支持灰度密度滤波、颜色滤波、颜色聚类等功能。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    几何滤波

    几何分析

    菜单打开:process -> region analysis -> geometry analysis count,计算面积并分析参数。通过选择 cov 选项,ImagePy 使用通过协方差计算的椭圆拟合每个区域。这里计算前面步骤中所示的参数,如面积、周长、离心率和稳定性。事实上,前一步的滤波正是对这一步的准备。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    几何分析

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    生成结果表(背景是黑色,以强调椭圆)

    按区域对表进行排序

    菜单打开:table -> statistic -> table sort by key

    选择主键作为区域,并选择 descend,表将按面积的降序排序。表是除了图像之外的另一项重要数据。从某种意义上来说,很多时候我们需要获得图像的相关信息,然后以表的形式对数据进行后续处理。ImagePy 支持表 I/O(xls、xlsx、csv)、过滤、切片、统计分析、排序等等(右键单击列标题来设置文本颜色、小数精度、行样式等)。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    图表

    菜单打开:table -> chart -> hist chart

    我们经常需要利用表格数据来绘制一个图表。这里,我们绘制了某个区域和其周边列的直方图。ImagePy 的表可以用于绘制常见的图表,如柱状图、饼图、直方图和散点图(基于 matplotlib)。该图表带有缩放、移动和其他功能,并可以保存为图像。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    直方图

    3D 表格

    菜单打开:kit3d -> viewer 3d -> 2d surface

    图像的表面重建。这幅图像显示了三种方式的重建结果,包括:sobel 梯度图、高阈值和低阈值。它显示了 Up And Down Watershed 是如何工作的:

    • 计算梯度;

    • 通过高低阈值标记硬币和背景;

    • 在 dem 图表上模拟上升 water 来形成分割线。

    ImagePy 可以完成图像的 3d 滤波、3d 轮廓构建、3d 拓扑分析、2d 表面重建和 3d 表面可视化。3d 视图可以被自由拖动、旋转,其结果可以保存为.stl 文件。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    3d 可视化

    宏记录和执行

    菜单打开:window -> develop tool suite

    宏记录器显示在开发工具面板中。我们已经手动完成了一个图像的分割。然而,用这种方式一下子处理超过 10 幅图像是非常乏味的。因此,假设在处理这些问题的时候,这些步骤具有高度的可重复性和健壮性,我们可以记录一个宏,以便将几个处理过程组合成一个单击程序。宏记录器与无线电记录器相似。打开后,它将记录操作的每个步骤。我们可以点击暂停按钮停止录制,也可以点击播放按钮开始录制。当宏运行时,所记录的命令将按照顺序执行,因此它具有简单性和可再现性。

    宏被保存到 .mc 文件中。将文件拖放到 ImagePy 底部的状态栏中,宏将自动执行。我们还可以将 .mc 文件复制到 ImagePy 文件目录下的菜单的子菜单中。当启动 ImagePy 时,宏文件将被解析为相应位置的菜单项。通过单击菜单,宏将被执行。

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    宏记录

    Workflow

    宏是一系列预定义的命令。通过将一系列固定操作记录到宏中,可以提高工作效率。然而,宏缺乏灵活性。例如,有时主要步骤是固定的,但是参数调优需要人工参与。在这种情况下,workflow 就可以解决这个问题。ImagePy 中的 workflow 是可视化的流程图,分为两个层次:章节和部分。本章对应于 workflow 中的矩形区域,并且该部分是矩形区域中的按钮,也是命令,并附有图形说明。右边的消息窗口将显示相应的功能描述,同时鼠标悬停在上面。单击右上角的“详细文档”,查看整个过程的说明文档。

    workflow 实际上是用 MarkDown(一种标记语言)编写的,但是在编写时你需要遵守以下规范:

    Title=====

    ## Chapter1

    1. Section1some coment for section1 ...

    2. ...

    ## Chapter 2

    ...

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    workflow

    滤波器插件

    在最后一节中,我们介绍了宏和 workflow,使用宏和 workflow 连接现有功能很方便。但有时我们需要创建新的特性。在本节中,我们将尝试向 ImagePy 添加一个新特性。ImagePy 可以轻松访问任何基于 numpy 的函数。让我们以 scikit-image 的 canny 操作符为例。

    示例代码如下:

    from skimage import feature

    from imagepy.core.engine import Filter

     

    class Plugin( Filter ):

    title = 'Canny'

    note = [ 'all' , 'auto_msk' , 'auto_snap' , 'preview' ]

    para = { 'sigma' : 1.0 , 'low_threshold' : 10 , 'high_threshold' : 20 }

    view = [ ( float , 'sigma' , ( 0 , 10 ) , 1 , 'sigma' , 'pix' ) ,

    ( 'slide' , 'low_threshold' , ( 0, 50 ) , 4 , 'low_threshold' ) ,

    ('slide' , 'high_threshold' , ( 0 , 50 ) , 4 , 'high_threshold' ) ]

     

    def run ( self , ips , snap , img , para = None ) :

    return feature.canny (snap , para[ 'sigma' ] , para[ 'low_threshold' ] ,

    para[ 'high_threshold' ] , mask = ips.get_msk ) * 255

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    Canny 滤波器示例

    创建自己的滤波器的步骤:

    1. 导入对应的库,通常是第三方库。

    2. 继承 filter 类。

    3. 标题将用作菜单的名称和参数对话框的标题,也用作宏记录的命令。

    4. 在 note 中告诉框架它需要为你做什么,是否进行类型检查、是否支持选择、是否支持 UNDO 等等。

    5. para 是一个参数字典,包含函数所需的参数。

    6. 为视图中的每个参数定义交互方法,框架将通过读取这些信息自动生成用于参数调优的对话框。

    7. 编写主函数 run。img 是当前图像,para 是用户的输入参数。如果在 note 中设置了 auto_snap,snap 将是 img 的一个副本。我们可以处理这个副本,将结果存储在 img 中。如果函数不支持指定的输出,我们还可以返回结果,框架将帮助我们将结果复制到 img 并显示它。

    8. 将文件保存为 xxx_plg.py,然后复制到菜单文件夹,重新启动 ImagePy。它将被作为菜单项加载。

    这个框架为我们做了什么?

    该框架以正式的方式把复杂的任务融合在一起,并帮助我们执行了:

    • 类型检查。如果当前图像类型不满足注释中的要求,则终止分析;

    • 根据参数,自动生成对话框以并检测输入的合法性;

    • 实时预览;

    • 自动 ROI 支持;

    • 撤消支持;

    • 并行化支持;

    • 图像堆栈支持;

    • 其它。

    如前所述,表是除了图像之外的另一种非常重要的数据类型。类似地,ImagePy 也支持表的扩展。这里我们给出在前面描述中使用的按键排序的示例。

    代码为:

    from imagepy.core.engine import Table

    import pandas as pd

     

    class Plugin( Table ) :

    title = 'Table Sort By Key'

    para = { 'major':None , 'minor' : None , 'descend' : False }

    view = [ ( 'field' , 'major' , 'major' , 'key' ) ,

    ( 'field' , 'minor' , 'minor' , 'key' ) ,

    ( bool , 'descend' , 'descend' ) ]

     

    def run( self , tps , data , snap , para = None ) :

    by = [ para[ 'major' ] , para[ 'minor' ] ]

    data.sort_values( by = [ i for i in by if i ! = 'None' ],

    axis = 0 , ascending = not para[ 'descend' ] , inplace = True )

    ImagePy——UI界面支持开放插件的Python开源图像处理框架

    表排序示例

    表是如何工作的

    与滤波器相同,表中还有标题(title)、注释(note)、参数(para)、视图(view)等参数。当插件运行时,框架将根据和视图生成一个对话框。在选择 para 之后,将它们与当前表一起传递给 run 函数处理。表数据是当前表中的一个 pandas.DataFrame 对象,存储在 tps 中。还可以从 tps 检索其他信息,例如 tps.rowmsk、tps.colmsk,以获得当前选定表的行和列掩码。

    其他类型的插件

    上述的滤波器和表是两个最重要的插件,但是 ImagePy 也支持一些其他类型的插件扩展。目前它支持的插件有九个,它们是:

    1. 滤波器:主要用于图像处理;

    2. simple:类似于滤波器,但关注图像的整体特性,如 ROI 的操作、假彩色的操作、面积的测量、或整个图像的三维分析、可视化等;

    3. free:独立于图像的操作。用于打开图像、关闭软件等;

    4. tool:使用鼠标在图表上进行交互,并在工具栏上显示小图标,如画笔;

    5. table:对表进行操作,如统计分析、排序、绘图等;

    6. widget:显示在面板中的小部件,如右侧的导航栏、宏记录器等;

    7. markdown:标记语言,单击时,将弹出一个单独的窗口来显示文档;

    8. macros:用于串行固定操作过程的命令序列文件;

    9. workflow:结合宏和 markdown 创建交互式指导过程。

    动机与目标

    python 是一种简单、优雅、强大的语言,并且具有非常丰富的科学计算相关的第三方库。一方面,基于通用矩阵结构和相应的规则,基于 numpy 的 scipy、scikit-image、scikit-learning 等科学计算库给科学研究带来了极大的便利。另一方面,通过科学计算、图像处理,可以高效准确地解决生物学、材料科学等科学研究中越来越多的问题。

    然而,仍然有许多研究人员缺乏编程技巧。因此,让更多的研究人员能够使用基于 numpy 的科学计算库是至关重要的。ImagePy 使不是程序员研究人员也能使用计算机进行科学计算,因此他们不需要关注 UI 和交互设计,只需要关注算法本身,最终加速开源工具构建甚至商业产品的孵化。同时,这些工具可以让更多不善于编程的人获取、推广和普及图像处理、统计学等科学知识。

    展开全文
  • G'MIC的Python绑定-图像处理的... G'MIC是一种语言处理框架,解释器和图像处理脚本语言。 这是加载gmic以及使用解释器评估一些G'MIC命令的方法。 import gmic gmic . run ( "sp earth blur 4 display" ) # On Linux a
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 目录图像处理一、OpenCV框架与图像插值算法1.1 OpenCV简介1.2 图像插值算法1.3 resize函数1.4 代码实现 图像处理 图像处理(image processing),用计算机...
  • 一、基本概念介绍 ...模式:图像的模式定义了图像的类型和像素的位宽。当前支持的模式有: 1 :1位像素,表示黑和白,但是存储的时候每个像素存储为8bit. L : 8位像素,表示黑和白。 P:8位像素,使...

    一、基本概念介绍

    1. 通道 :每张图片由一个或者多个数据通道构成,PIL允许在单张图片中合成相同维数和深度的多个通道。以RGB图像为例,每张图片都是由三个数据通道构成,分别为R、G、B通道。对于灰度图像只有一个通道。
    2. 模式:图像的模式定义了图像的类型和像素的位宽。当前支持的模式有:
      1 :1位像素,表示黑和白,但是存储的时候每个像素存储为8bit.
      L : 8位像素,表示黑和白。
      P:8位像素,使用调色板映射到其他模式。
      RGB : 3 * 8 位像素,为真彩色。
      RGBA : 4 * 8 位像素,颜色分离。
      YCbCr: 3 * 8 为像素,彩色视频格式。
      I :32位整型像素。
      F : 32位浮点型像素
    3. 尺寸:通过size属性可以获取图片的尺寸。这是一个二元组,包含水平和垂直方向上的像素数。
    4. 坐标系统:PIL使用的是笛卡尔坐标系统。坐标原点位于左上角。

    二、PIL基本操作

    from PIL import Image, ImageFilter 
    
    # 加载图片
    img = Image.open("图片名称.格式")
    
    # 获取尺寸这里宽在前,高在后面,size是一个二元组
    w, h = img.size
    
    # 显示图片
    img.show()
    
    # 显示模式RGB
    img.mode
    
    # 保存图片
    img.save("保存路径/图片名.格式")
    
    # 获取通道
    img.getbands()  # (‘R’,‘G’,‘B’)
    
    # 获取单独的每个通道, 每个通道输出的图片是黑白图片
    r, g, b = img.split()
    r.show()
    g.show()
    b.show()
    
    # 将图片转换为矩阵
    img = np.array(img) 
    # 因为图片默认的形状是H W C 所以这里输出是(1244,700,3)
    img.shape
    
    # 另外一种获取图片每个通道的方法,将图片转化为矩阵,进行切片,获取每个通道后,再将每个通道转换为图片显示出来。
    
    # 将转化为的矩阵进行切片
    r = img[:, :, 0] # R 通道
    # 切片也可以用这种方式[..., 0] 与上面的切片方式一样的原理
    g = img[:, :, 1] # G 通道
    b = img[:, :, 2] # B 通道
    # 将矩阵转化为图片
    r = Image.fromarray(r, 'L')
    r.show()
    g = Image.fromarray(g, 'L')
    g.show()
    g = Image.fromarray(g, 'L')
    g.show()
    
    # 图像增强(滤波)
    # 1. 轮廓滤波
    img = img.filter(ImageFilter.CONTOUR)
    # 2. 模糊效果
    img = img.filter(ImageFilter.BLUR)
    img.show()
    
    # 3. 自定义模糊效果
    img = img.filter(ImageFilter.BoxBlur(radius=28))
    img.show()
    
    # 4. 锐化图片
    img = img.filter(ImageFilter.DETAIL)
    img.show()
    
    # 5. 锐化(高清,边缘增强)
    img = img.filter(ImageFilter.EDGE_ENHANCE)
    img.show()
    
    # 6. 浮雕效果
    img = img.filter(ImageFilter.EMBOSS)
    img.show()
    
    # 7. 图片缩放,这种方式可以任意尺寸进行缩放,其中采样方式为:Image.ANTIALIAS 细节增强缩放,为了使得图片缩放后能够保持清晰
    img = img.resize((300, 600), Image.ANTIALIAS)
    img.show()
    
    # 8. 等比缩放
    img = img.thumbnail()
    # 这里无论传什么参数都是等比缩放,不影响
    img = img.thumbnail((w//5, h//2))
    img.show()
    
    # 9. 获取图片某一点处的像素点。彩色图片会得到(R,G,B)三个值
    img = img.getpixel((400, 500))
    print(img)
    
    
    # 10. 转换图片
    img = img.convert("L")
    img.show()
    
    # 11. 粘贴(两张图片合成一张图片)
    pic = Image.open("image/pic2.jpg")
    # paste (300,150)分别是left和upper
    img.paste(pic, (300, 150))
    img.show()
    
    # 12. 抠图,截取图片的某一部分pic.crop(left, upper, right, lower),左边的值小于右边的值,上边的值小于下边的值
    pic = pic.crop((330, 250, 380, 310))
    img.show()
    
    # 13. 旋转图片,负数是顺时针旋转,正数是逆时针旋转
    img = img.rotate(30)
    img.show()
    
    # 14. 查看每个像素点的数据
    img = img.getdata()
    ## 输出的是他们乘积大小的列表,元素为颜色值形如(255, 253, 255)(图片的宽*图片的高*图片的通道 ),单通道是一个值,三通道三个颜色值
    print(len(list(img)))
    
    # 15. 查看像素直方图
    # img = img.convert("RGB")
    data = np.array(img)
    # 16. 绘制直方图
    hist = img.histogram()
    # 输出的是每个像素值输出的次数
    print(hist)
    plt.subplot(2, 1, 1)
    plt.imshow(img)
    plt.subplot(2, 1, 2)
    #  hist(一维向量,bins表示坐标。有256个像素值,所以有256个横坐标坐标),纵坐标表示像素点出现的个数(也即:频率)
    #  将二维转化为一维,利用函数flatten()
    plt.hist(data.flatten(), bins=256)
    plt.show()
    
    
    
    展开全文
  • 加入极市专业CV交流群,与6000+来自...点击文末“阅读原文”立刻申请入群~作者:闫霄龙本文为极市原创,授权转载可联系小助手(Extreme-Vision)今天想给大家推荐一个非常好用的开源的图像处理工具ImagePy,作者之前...

    加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动!

    同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。点击文末“阅读原文”立刻申请入群~

    作者:闫霄龙

    本文为极市原创,授权转载可联系小助手(Extreme-Vision)

    今天想给大家推荐一个非常好用的开源的图像处理工具ImagePy,作者之前有在极市进行过图像处理的分享。

    ImagePy是基于Python开发的开源图像处理框架,采用wxpython界面基础,基于

    Numpy为核心图像数据结构,pandas为核心表格数据结构,并支持任何基于Numpy,pandas的插件扩展,可以方便的接入scipy.ndimage,scikit-image, simpleitk, opencv等算法库进行插件扩展。

    GitHub:https://github.com/Image-Py/imagepy

    214069227_1_20210126045210975_wm

    总览,鼠标测量,几何变换,滤波,分割,计数等

    214069227_2_20210126045211647_wm

    习惯ImageJ的用户可以在Windows > Windows Style进行风格切换

    特点:软件具有友好的用户操作界面,能读取,保存多种图像数据格式,支持ROI设定,绘图,测量等鼠标操作。能完成图像滤波,形态学运算等常规操作,可以很好的完成一些分割,区域计数,几何测量,密度分析相关的工作。并可以对分析结果进行数据筛选,过滤,统计等相关工作。(软件功能定位可以理解为ImageJ + SPSS,虽然目前尚未达到)

    论文:ImagePy: an open-source,Python-based and platform-independent software package for bioimage analysis

    链接:https://academic.oup.com/bioinformatics/article/34/18/3238/4989871

    论坛:ImagePy 是forum.image.sc的合作伙伴,任何关于ImagePy的开发及使用上的问题都可以在https://forum.image.sc讨论。

    安装过程可能遇到的问题

    系统支持:ImagePy支持Python2.7及3.x,但强烈推荐大家使用python3.ImagePy 是一个基于 wxpython 的 ui 框架,wxpython在linux 上不能用 pip 进行安装。你需要从https://extras.wxpython.org/wxPython4/extras/linux下载和你的 linux 系统相匹配的 whl文件。

    因为 ImagePy 会编写一些配置信息,因此,在 linux 和 mac 系统上,可能会存在权限问题,所以请从 sudo 命令启动。如果使用 pip 安装,请按照下面的方法来添加用户参数:pip install --user imagepy。

    如果在 anaconda 虚拟环境中安装 ImagePy,那么你可能会遇到这样的错误:This program needsaccess to the screen. Please run with a Framework build of python, and onlywhen you are logged in on the main display,如果遇到这个问题,请用pythonw-m imagepy启动。

    功能简介:

    ImagePy具有非常丰富的功能,而这里,我们仅仅用一个特定的例子,来对ImagePy进行一个初步的认识,我们这里选取scikit-image官方的硬币分割,相比之下,这个例子简单而全面。

    图像打开

    菜单:File > Local Samples > Coins,打开ImagePy的内置示例图像。ImagePy支持bmp, jpg, png, gif, tif等常见图像类型,支持xls, xlsx,csv表格格式,通过ITK插件,也可以获得dicom,nii等医学数据格式的读取存储功能,而通过OpenCV插件,可以获得wmv,avi等视频格式的读取存储功能。

    214069227_3_20210126045211975_wm

    滤波,分割

    菜单:Process > Hydrology > Up And Down Watershed,这里选用一个复合滤波器,对图像进行sobel梯度提取,然后通过上下阈值标定作为mark,在梯度图上进行分水岭分割。滤波,分割是图像处理过程中的核心技巧,是最终测量结果成败的关键,ImagePy支持常见的高斯,均值,中值,梯度,拉普拉斯,差分高斯等滤波,也包含自适应阈值,分水岭等分割方法。

    214069227_4_20210126045212506_wm

    214069227_5_2021012604521384_wm

    二值运算

    菜单:Process > Binary > Binary Fill Holes

    经过上述分割,我们得到了相对纯净的掩膜图像,但依然存在一些镂空,以及少许外界杂质,这些会对计数和测量造成干扰,我们对图像进行二值填充。ImagePy支持腐蚀,膨胀,开,闭等二值化基础操作,也支持骨架,中轴线提取,距离变换等操作。

    214069227_6_20210126045213553_wm

    区域过滤

    菜单:Analysis > Region Analysis > Geometry Filter,对区域进行过滤,这里可以简单的通过面积进行过滤,ImagePy的几何过滤可以通过面积,周长,拓扑,丰满度,偏心率等指标对区域进行过滤,可以输入复合条件,正数表示选择大于等于,负数表示选择小于,通过过滤的被设定为front color,没通过的设定为back color,back color设定为100可以清楚看到有哪些被滤掉了,如果确认符合要求,back color设定为0,即清除。同时ImagePy也支持灰度密度过滤,颜色过滤,色彩聚类等功能。

    214069227_7_20210126045213990_wm

    区域过滤(这里为了看清效果,area设定的较大,实际只需要过滤碎片)

    区域分析

    菜单:Process > Region Analysis > Geometry Analysis,对区域进行计数和指标分析,这里我们勾上cov,即对区域进行协方差椭圆拟合。ImagePy支持面积,周长,偏心率,丰满度等指标,其实上一步的过滤正是在这里的分析结果基础上进行的。

    214069227_8_20210126045214397_wm

    区域分析

    214069227_9_20210126045214881_wm

    生成结果表格(这里为了看清椭圆,把区域亮度降低了)

    按照面积排序

    菜单:Table > Statistic > Table Sort By Key,选择第一主键为area,勾上descend,即按照面积降序排列。表格是图像之外的另外一种重要的数据,某种意义上,很多时候我们都需要在图像上得到需要的信息后,以表格的形式对数据进行后期加工。ImagePy支持表格筛选,截取,统计,排序等功能。

    214069227_10_20210126045215397_wm

    在列头单击右键可以设定文字颜色,小数精度,线条样式等

    统计图表

    菜单:Table > Chart > Hist Chart,表格数据一个常见的需求是绘制图表,这里我们对面积,周长两列进行直方图统计,得到分布直方图。ImagePy的表格可以绘制折线图,饼状图,柱状图,散点图等常见的图表。图表自带缩放,移动等功能,也可以存储为图片。

    214069227_11_20210126045215772_wm

    统计直方图

    三维图

    菜单:Kit3D > Viewer 3D > 2D Surface,对图像进行表面重建,这里其实是分别重建了sobel梯度图,高阈值,低阈值三个结果。图上可以清楚的看懂Up And DownWatershed的工作原理,首先计算梯度,然后通过高低阈值标记硬币和背景,最终在dem图上模拟涨水,形成分割。ImagePy可以做图像的三维滤波,三维骨架,三维拓扑分析,也可以对数据进行二维表面重建,以及三维表面可视化。三维视图中可以自由拖动,旋转视角,图片结果也可以输出为stl文件。

    214069227_12_20210126045216245_wm

    三维可视乎

    宏录制与执行

    菜单:Window > Develop Tool Sute, 打开开发者工具,我们看到宏录制器。以上我们手工完成了一个图像数据分割,假设这些流程非常固定,并且很适合处理这类问题,而一次次的重复点击会让人审美疲劳。这种情况我们可以通过宏录制,来将若干过程捏合成一步。宏录制器类似一个录音机,打开时,我们每一步操作会形成一行记录。而我们可以点暂停键停止录制,点播放键执行。当宏运行是,会依次质心记录下来的命令,从而实现将若干步骤捏合成一步。

    我们将宏保存为一个.mc文件,将文件拖放到ImagePy最下方的状态栏,宏会自动被执行,我们还可以将mc文件拷贝到ImagePy文件目录下的menus的子目录下,文件启动时,宏文件会被在对应位置解析成一个菜单项,当我们点击菜单,宏也会执行。

    214069227_13_20210126045216678_wm

    宏录制

    工作流

    宏是一串固定的命令序列,通过将一系列固定的操作制作成宏,可以提高工作效率,但缺点是缺乏变通性,比如有时候我们的流程基本固定,但是一些细节,或者参数的设定上需要借助人工交互,这时候,工作流就可以很好的满足我们。工作流是一个流程图,分成,章,节,两个层次。章在流程图中对应于一个矩形区域,而节是矩形区域中的一个按钮,也是一条命令,并配有一段图文解释。当鼠标移动到按钮上,右侧的信息窗就会显示对应的功能说明。点击右上角的Detail Document,查看整个流程的文档。

    工作流的编写,实际上是一段MarkDown标记语言,但是需要按照规范编写,大致如下:

    Title

    ===

    ## Chapter1

    1. Section1

    some coment for section1 ...

    2. ...

    ## Chapter 2

    ...

    214069227_14_20210126045217131_wm

    工作流

    Filter插件

    以上我们介绍了宏和工作流,利用宏和工作流可以串联已有的功能,但不能制造新的功能,而这里我们试图为ImagePy添加一个新功能。ImagePy可以方便的接入任何基于Numpy的函数,我们以scikit-image的Canny算子为例。

    from skimage import feature

    from imagepy.core.engine import Filter

    class Plugin(Filter):

    title ='Canny'

    note =['all', 'auto_msk', 'auto_snap', 'preview']

    para ={'sigma':1.0, 'low_threshold':10, 'high_threshold':20}

    view =[(float, 'sigma', (0,10), 1,  'sigma','pix'),

    ('slide', 'low_threshold', (0,50), 4, 'low_threshold'),

    ('slide', 'high_threshold', (0,50), 4, 'high_threshold')]

    defrun(self, ips, snap, img, para = None):

    returnfeature.canny(snap, para['sigma'], para[low_threshold'],

    para['high_threshold'], mask=ips.get_msk())*255

    214069227_15_20210126045217600_wm

    滤波器的作用机制:引入需要的库,往往是第三方的库。

    继承Filter。

    Title,标题,将作为菜单的名称和参数对话框的标题,也作为宏录制的命令。

    Note,指明需要框架为你做什么,是否需要做类型检查,是否支持选区,是否支持撤销等。

    Para,参数字典,核心函数需要用到的参数

    View,参数视图,指明每个参数对应的交互方式,框架会根据这里的信息自动生成交互对话框。

    核心函数,img是当前图像,para参数交互结果,如果note里设定了auto_snap,则img也被复制到snap,我们可以对snap进行处理,将结果存放在img中,如果函数不支持指定输出,我们也可以return处理结果,框架会帮我们将结果拷贝给img并展示。

    将文件存储为xxx_plg.py,并拷贝到ImagePy > Menus目录下,重启,会被加载成一个菜单项。

    框架帮我们做了什么?

    框架将复杂的任务进行了形式上的统一,并且帮我们进行类型检查,如果当前图像类型不符合note中的要求,则终止分析,根据para,view自动生成对话框,检测输入合法性,对图像进行实时预览,自动提供ROI支持,撤销支持,并提供多通道支持,提供图像序列支持等。

    表格

    正如前面所说的,表格是图像之外另一种非常重要的数据,同样ImagePy也支基于表格的功能扩展,我们用前面用到过的按照住键排序的例子来做说明。

    from imagepy.core.engine import Table

    import pandas as pd

    class Plugin(Table):

    title ='Table Sort By Key'

    para ={'major':None, 'minor':None, 'descend':False}

    view =[('field', 'major', 'major', 'key'),

    ('field','minor', 'minor', 'key'),

    (bool,'descend', 'descend')]

    defrun(self, tps, data, snap, para=None):

    by = [para['major'], para['minor']]

    data.sort_values(by=[i for i in by if i!= 'None'],

    axis=0,ascending=not para['descend'], inplace=True)

    214069227_10_20210126045215397_wm

    Table的作用机制

    类比Filter,Table同样有title,note,para,view参数,当插件运行是框架通过para,view解析为对话框,交互完成后,参数和当表格会一起传递给run,run中对表格进行核心处理,data是当前表格对应的pandas.DataFrame对象,tps中存储了其他信息,比如tps.rowmsk,tps.colmsk可以拿到当前表格被选中的行列掩膜。

    其他插件类型

    上面介绍的Filter和Table是最重要的两种插件,但ImagePy也支持其他一些类型的插件扩展,目前有九种,他们是:

    1. Filter:主要用来对图像进行处理

    2. Simple:类似于Filter,但侧重与图像的整体特性,比如对ROI的操作,对假彩色的操作,区域测量,或者对整个图像栈进行的三维分析,可视化等。

    3. Free:用于不依赖图像的操作,比如打开图像,关闭软件等。

    4. Tool:借助鼠标在图上进行交互,将以小图标的形式出现在工具栏上,例如画笔。

    5. Table:对表格进行操作,例如统计,排序,出图。

    6. Widget:以面板形式展现的功能部件,例如右侧的导航栏,宏录制器等。

    7. Markdown:MarkDown标记语言,点击后会弹出独立窗口展示文档。

    8. Macros:命令序列文件,用于串联固定的操作流程。

    9. Workflow:工作流,宏和MarkDown的结合,用于制作交互式指引流程。

    开发意义

    Python是一门简单,优雅,强大的语言,并且在科学计算方面有非常丰富的第三方库,并且Numpy制定了良好的规范,建立在Numpy基础上的Scipy,scikit-image,scikit-learn等科学计算库给科研工作带来了极大的便利。另一方面,科学计算,图像处理在生物,材料等科研领域可以高效准确的解决越来越多的问题,然而依然有很多科研工作者编程能力比较薄弱,因此让Numpy系列的科学计算库造福更多科研工作者是一项非常有意义的工作。而ImagePy就是一座桥梁,尽可能的让科学计算工作者隔离自己不擅长的UI和交互设计,着重精力处理算法本身,并且可以快速形成工具甚至产品,而这些工作又可以让更多不擅长编程的科研工作者收益,推广和普及图像处理,统计等科学知识。

    展开全文
  • 万丈高楼平地起,搭好框架不用愁唠叨图片处理框架视频处理框架 唠叨 接续我的上一篇 小白入门机器视觉第一步 后,只要安装了其中的Python和Opencv,便可以拿些酷炫的程序跑跑,或是试试Opencv手册开始的例程,体验...
  • 一个月前,我将kaggle里面的food-101(101000张食物图片),数据包下载下来,想着实现图像识别,做了很长时间,然后自己电脑也带不动,不过好在是最后找各种方法实现出了识别,但是准确率真的非常低,我自己都分辨不...
  • Python图像处理之小波去噪原理:硬阈值VS软阈值

    千次阅读 多人点赞 2016-01-02 23:35:38
    在之前的文章中,我们已经体验了在Python中利用小波变换对图像进行去噪的效果,本文将更加侧重其背后的原理。特别地,我们将理清软阈值与硬阈值等相关...首先,下面所示为利用小波变换对图像做去噪处理的一个基本框架
  • PIL:(Python Imaging Library)是Python平台上的图像处理标准库,功能非常强大。pytesseract:图像识别库。我这里使用的是python3.6,PIL不支持python3所以使用如下命令pip install pytesseractpip install pillow...
  • 在本教程中,我们将学习如何使用Python语言执行图像处理。我们不会局限于单个库或框架;但是,我们将最常使用的是Open CV库。我们将先讨论一些图像处理,然后再继续介绍可以方便使用图像处理的不同应用程序/场景。...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 目录四、图像滤波4.1 简介 四、图像滤波 4.1 简介 ...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 目录五、图像阈值和二...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • 进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • OpenCV一个出色的开源框架,其中Open指的就是OpenSource,开源。而CV则是计算机视觉(Computer Vision)。依靠OpenCV背后开源社区背书,其不仅在过去实现了绝大多数计算机视觉所需要的基础算法,同时也能跟随时代发展...
  • 编辑:zero关注 搜罗最好玩的计算机视觉论文和应用,AI算法与图像处理 微信公众号,获得第一手计算机视觉相关信息本文转载自:公众号:AI公园作者:mdbloice编译:ronghuaiyang导读图像增强是CV领域非常常用的技术,...
  • PIL主要功能: 图像归档(Image Archives)。PIL非常适合于图像归档以及图像的批处理任务。你可以使用PIL创建缩略图,转换图像格式,打印图像等等。 图像展示(Image Display)。...图像处理(Image Process...
  • Python+OpenCV图像处理(一)——OpenCV框架与图像插值算法 Python+OpenCV图像处理(二)——几何变换 Python+OpenCV图像处理(三)——彩色空间互换 Python+OpenCV图像处理(四)——图像滤波 Python+OpenCV图像...
  • 进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来...
  • 进行深度学习时,对图像进行预处理的过程是非常重要的,使用pytorch或者TensorFlow时需要对图像进行预处理以及展示来观看处理效果,因此对python中的图像处理框架进行图像的读取和基本变换的掌握是必要的,接下来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 451
精华内容 180
热门标签
关键字:

python图像处理框架

python 订阅