PIL简单图片处理(上)
自己看了下python,本来想照教程上一点一点学的,学了一会发现好没劲(教程本身质量很好),学python就是为了好玩,为什么还这么按部就班勒?果断google下python的爬虫(开始目的是这个),按照一很简单的demo,自己也写了个很简单的小程序(urllib2+re),爬美女吧的美女图片。其实爬图片本身并不难(一会儿就爬了一千都张),难的是图片质量参差不齐,怎么加以区别。质量包括图片本身的分辨率和图片的‘美感’,于是突然就想到了图像识别,把那些不美(搞笑图片和长的不美)的去掉,而且说干就干,虽然也是小白
google下python图片操作,了解到PIL(python Image Lib),去官网下。windows版官方只有32位版,如果是64位的python好像还不兼容。。。我用的mac,下的源码。装之前还要装依赖,教程可以参考这里。中间遇到了‘include <X11/Xlib.h>’
,可以参考这里。而且win版好像的show函数好像有问题,得改源码。。。反正各种问题,毕竟这么老了,感觉官方也放弃了,不过够用就行了
PIL装好之后, 就可以开工了。当然啦,图像识别也不可能是一步到位的事,毕竟不是那么简单嘛
首先就是对图片处理有个简单的概念。一张图片是由若干像素组成,而一个像素则由很多分量(通道)组成,每种分量大小的共同作用于一个像素,而成千上万个像素则组成了宏观上的图片,分量数和每个分量的位数共同决定了图片的位数。比如一张分辨率为1920*1080的美女图片,每一行就有1920个像素,每一列有1080个像素,那么总共就有1920X1080个像素。而一个像素最常见的是由R(red),G(green),B(blue)分量(通道)组成。而每一个分量一般用8位bit来表示,所以每一个分量就有2^8 = 256(0~255)种可能。分量数为3,每个分量有8位,图片就为3X8=24位。而有一种32位的图就是在24位的上加上一个alpha(透明度)分量,比如png格式的图片就可以表示一张背景透明的图。现在我们可以计算下,一张这样24位,1920*1080分辨率的图片的大小了。1920X1080*24 ~ 6MB,可是我们一般遇到的图片都不会有这么大,那是压缩之后的结果,jpeg就是一种压缩率可以很高的图片格式,而且是有损压缩(据说损失的都不重要)。
有了图片的基础知识之后,接下来就可以开始了。图片的处理也就是将某些指定的像素设为特定的值而已了
下面举个小demo:
预期效果:对称效果,让图片的左边与右边对称,可以恶搞别人
示例代码:
import PIL from Image def mirror(im): width,height = im.size half = int(width/2) for x in range(half): for y in range(height): origin = im.getpixel((width-x-1,y)) im.putpixel((x,y),origin) return im imageurl = './images/xg.jpg' image = Image.open(imageurl) image.show() image = mirror(image) image.show()
效果:
在来一张上下的