PIL初探

作者: 非鱼2018 | 来源:发表于2019-10-12 23:06 被阅读0次

    1.获取图像信息以及转换

    from PIL import Image,ImageFilter
    
    im=Image.open('demo.jpg')
     print(im.size)
    # #(640, 1138)
     #获得给定位置的像素
     pix=im.load()
    print(pix[0,0])
    #也可以使用gitpixel方法
    print(im.getpixel((0,0)))
    
    #转换为黑白图像
    im2=im.convert('L')
    im2.show()
    #制作缩略图
    im.thumbnail((128,128), Image.ANTIALIAS)
    im.show()
    
    #裁减,坐标必须为int,分别代表左下右上的值
    cut_img=img.crop((0,0,120,120))
    #滤镜使用
    im=Image.open('demo.jpg')
    im2= im.filter(ImageFilter.BLUR)                ##均值滤波
    im3= im.filter(ImageFilter.CONTOUR)             ##找轮廓
    im4= im.filter(ImageFilter.FIND_EDGES)         ##边缘检测
    im2.save('mohu.jpg')
    im3.save('luokuo.jpg')
    im4.save('bianyuan.jpg')
    

    2.将图像拼接成多多个图像拼接

    原图: demo.jpg
    拼接后: big_demo.jpg
    #先缩小或裁减
    im=Image.open('demo.jpg')
    small_img=im.resize((120,120))
    # small_img.show()
    print(small_img.size)
    #裁减,坐标必须为int,分别代表左下右上的值
    cut_img=small_img.crop((0,0,120,120))
    cut_img.show()
    print(cut_img.size)
    im2=Image.new('RGB',(240,240))
    print(im2.size)
    #分别粘贴左,上,右,下
    im2.paste(small_img,(0,0,120,120))
    im2.paste(small_img,(120,0,240,120))
    im2.paste(small_img,(0,120,120,240))
    im2.paste(small_img,(120,120,240,240))
    im2.show()
    im2.save('big_demo.jpg')
    

    优化下,可以自定义行数和列数拼接

    #获得原始图片大小
    im=Image.open('demo.jpg')
    small_img=im.resize((120,120))
     w,h=small_img.size
     print(w,h)
     rows=6
     colunms=4
     im2=Image.new('RGB',(int(w*colunms),int(h*rows)))
     print(im2.size)
     for i in range(rows):
         for j in range(colunms):
             im2.paste(small_img,(int(j*w),int(i*h),int(j+1)*w,int(i+1)*h))
     im2.show()
    

    3.从本地文件夹读取多张图片并拼接

     import os
     image_path="d:\\temp_dir\\"
     imgs_paths=[image_path+i for i in os.listdir(image_path)]
     #获得本地文件夹图像并缩小的副本
     img_resizes=[Image.open(i).resize((256,256)).copy() for i in imgs_paths]
     #使用new方法新建空图像
     big_img=Image.new('RGB',(768,768))
     index=0
     for i in range(3):
         for j in range(3):
            #big_img.paste(Image.open(paset_imgs[index]),(int(j*256),int(i*256),int(j+1)*256,int(i+1)*256))
             big_img.paste(img_resizes[index], (int(j * 256), int(i * 256), int(j + 1) * 256, int(i + 1) * 256))
            index=index+1
     big_img.show()
    
    效果: big2.jpg

    4.blend方法

    使用给定的两张图像及透明度变量alpha,插值出一张新的图像。这两张图像必须有一样的尺寸和模式。
    合成公式为:out = image1 (1.0 - alpha) + image2 alpha
    若变量alpha为0.0,返回第一张图像的拷贝。若变量alpha为1.0,将返回

    
     im1=Image.open('0.jpg')
     im2=Image.open('1.jpg')
     im = Image.blend(im1, im2, 0.40)
     im.show()
    
    #split方法,分割出3个图像,分别为r ,g,b
     im = Image.open("demo.jpg")
     r,g,b = im.split()
     r.show()
     g.show()
     print(r.mode)
    

    5.composite方法

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

    im1=Image.open('0.jpg')
    im2=Image.open('1.jpg')
    r,g,b = im1.split()
    im = Image.composite(im1,im2,b)
    im.show()
    print(im.getbbox())
    

    6.transfrom 转换图像

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

     from PIL import Image
     im = Image.open("demo.jpg")
     print(im.size)
     imtra = im.transform((500, 500), Image.EXTENT, (0,0,300,300))
    # #转换图片大小为500*500,区域为整个图像,相当于resize,EXTENT代表矩形裁减
    # #imtra = im.transform((500, 500), Image.EXTENT, im.getbbox())
     print(imtra.size)
     imtra.show()
    

    7.镜像及旋转

     im=Image.open('demo.jpg')
     im2=im.rotate(45,expand=True)
     im2.show()
     im3=im.transpose(Image.FLIP_TOP_BOTTOM)       #上下对换。
     im3.show()
    

    8.point增加图片亮度

     im=Image.open('demo.jpg')
     out = im.point(lambda i: i * 1.5 + 10)
     im.show()
     out.show()
     out.save('demo1.jpg')
    

    参考资料:https://blog.csdn.net/leemboy/article/details/83792729
    http://www.effbot.org/imagingbook/image.htm

    相关文章

      网友评论

          本文标题:PIL初探

          本文链接:https://www.haomeiwen.com/subject/qrgeyctx.html