PIL处理图片信息
最近遇到了图片处理的一些问题,python提供了一些库可以很方便地帮助我们解决这些问题,在这里把我这几天的学习总结一下。
一、提取图片的RGB值

1、非代码:如果只是为了提取某张图片或者某个像素点的RGB值,用qq的截图工具就可以看到,如果不嫌麻烦也可以用下万能的Photoshop...但是我是一枚程序媛!
2、python实现
(1)先安装PIL库,windows下直接下载exe文件执行即可,linux、mac下easy_install、pip一下
——PIL:Python Imaging Library,基本可以看作Python平台事实上的图像处理标准库。
(2)代码:因为是一张图片,就取一个位置的RGB值即可
load方法 返回对象的像素值,也可以用来修改像素值
from PIL import Image
im = Image.open('6,jpg')
pix=im.load()
pix[0,0]
二、基于rgb分量的最低位的隐写术
隐写术,顾名思义,就是把一些信息以隐含的方式写在图片信息当中。基于rgb分量最低位的隐写术一种比较简单也比较常见的方式。
1、RGB:彩色图像用3个字节来分别记录RGB三种颜色在一个像素点中的亮度,一个字节8个比特位,表示的值从0~255,0即最暗,也就是完全不显示这种颜色,255为最亮,RGB(0,0,0)为纯黑,RGB(255,255,255)为纯白。上述提到的隐写术就是改变某一个颜色分量最低的比特位,最低的比特位对图像整体的影响最小,改变一位换算成十进制也就是加减1,比如从223变成了224或者222,影响极其小。
2、基于rgb分量最低位的隐写术:以红色分量为例,即是操纵“红色亮度”字节最后一个比特位。譬如我们想把’A’隐藏进来的话,就可以把A转成16进制的0x61再转成二进制的01100001,再修改为红色通道的最低位为这些二进制串。
3、python实现
from PIL import Image
def f(pixel):
if pixel%2 == 1:
return 255
return 0
im=Image.open('145.png')
im.getdata()
r,g,b=im.split()
newImg = Image.eval(r, f)
newImg.save("115.png","PNG")
newImg.show()
(1)Image.getdata()方法:返回一个图像内容的像素值序列。不过,这个返回值是 PIL 内部的数据类型,只支持确切的序列操作符,包括迭代器和基本序列方法。我们可以通过 list(im.getdata()) 为其生成普通的序列。此步骤也可以替换为im.load()
(2)自定义的f方法,即是对像素点进行处理,如果低位为1,则设置为白色,若为0,则设置为红色
(3)Image.eval : 使用带一个参数的函数作用于给定图片的每一个像素。如果给定的图片有超过一个的 频段(band),则该函数也会作用于每一个频段。
在上述代码中,f指定了函数,r指定了红色频段(band),所以这个函数会作用于红色频段,如果低位为1,置为白色,如果为0,置为黑色。
然而,这是为什么呢?
三、同图搜索
1、安装python-Levenshtein库,这个库提供了一些计算字串相似度的方法
(1)先下载安装VCForPython
(2)再下载python-Levenshtein的源码,python setup.py install安装
2、把图片hash成一段指纹,这个指纹和图片的大小、格式、明暗均无关,只和图片的内容本身有关。
下面是一个完整的代码,image2文件夹包含30张图片,image1文件夹包含5000+张图片,对于image2中的每一张图片,image2中均有一张与其对应,找出这些图片。
关于具体算法,提供一个资料,里面有更加详细的解释 http://blog.jobbole.com/65914/
解释一点,为什么不是直接比较两个图片的hash值是否相等,而是用到了Levenshtein.hamming()方法,是因为图片之间因为各种原因,最终生成的hash值并不完全一致,实际处理过程中允许一些小的差异,所以计算了一下两个hash值的汉明距离,代码的第43行设置了一个最外层循环,k值代表的就是汉明距离,从1开始,如果两个hash图片的汉明距离小于这个k值那就记录下来;如果当前的k值导致有些图片还不能找到相同图片,那就加大k的值继续计算。这里有一点,如果已经找到了就不要用之后的更新了,肯定是k值越小情况下找到的图片越准。
from PIL import Image
import os
import Levenshtein def dhash(image,hash_size=8):
image=image.convert('L').resize((hash_size+1,hash_size),Image.ANTIALIAS,) pixels=list(image.getdata())
difference=[]
for row in range(hash_size):
for col in range(hash_size):
left=image.getpixel((col,row))
right=image.getpixel((col+1,row))
difference.append(left>right) decimal_value=0
hex_string=[]
for index,value in enumerate(difference):
if value:
decimal_value+=2**(index%8)
if(index % 8)==7:
hex_string.append(hex(decimal_value)[2:].rjust(2,''))
decimal_value=0
return ''.join(hex_string) source=[]
for i in range(1,31):
if os.path.exists('./image2/'+str(i)+'.jpg'):
image=Image.open('./image2/'+str(i)+'.jpg')
else:
image=Image.open('./image2/'+str(i)+'.png')
source.append(dhash(image))
print len(source)
des=[]
for i in range(1,5693):
if os.path.exists('./image1/'+str(i)+'.jpg'):
image=Image.open('./image1/'+str(i)+'.jpg')
else:
image=Image.open('./image1/'+str(i)+'.png')
des.append(dhash(image))
print len(des)
res=[0]*31
for k in range(1,15):
for i in range(len(source)):
if res[i+1]!=0:
continue
for j in range(len(des)):
if Levenshtein.hamming(des[j],source[i])<k:
res[i+1]=j+1
print i+1,j+1
break
四、提供一下我的安装包:http://pan.baidu.com/s/1sktCtmH
PIL处理图片信息的更多相关文章
- 支付宝AR红包引出Python中的PIL小试
这两天支付宝AR红包火了,周围的同学全在玩.可是我一直在想这个原理是什么?通过请教大神和思考,知道了它有两个限定条件:GPS地理位置和图片的识别.所以,只要我们有了这两个限定条件,就不难进行该红包的破 ...
- 关于PIL库的一些概念
关于PIL库的一些概念 pil能处理的图片类型pil可以处理光栅图片(像素数据组成的的块). 通道一个图片可以包含一到多个数据通道,如果这些通道具有相同的维数和深度,Pil允许将这些通道进行叠加 模式 ...
- python,pil库的小应用
<pre>#euraxluo 5.15 #obj_1#跳一跳的外挂 from PIL import Image import subprocess import time import r ...
- python,使用PIL库对图片进行操作
在做识别验证码时,需要对验证码图片进行一些处理,所以就学习了一下PIL的知识,下面是我总结的一些常用方法. 注明:图片的操作都需要Image库,所以要使用import Image导入库 1.打开图片 ...
- python PIL 图像处理
python PIL 图像处理 This blog is from: https://www.jianshu.com/p/e8d058767dfa Image读出来的是PIL的类型,而skimage. ...
- Python PIL Image图片显示系列
1. PIL Image图片显示 在使用PIL函数中的Image方法读取图片时,对于图片的shape,可能有不少宝宝存在疑惑.是什么疑惑了?就是image = Image.open(image_pat ...
- 使用Python保存屏幕截图(不使用PIL)
起因 在极客学院讲授<使用Python编写远程控制程序>的课程中,涉及到查看被控制电脑屏幕截图的功能. 如果使用PIL,这个需求只需要三行代码: from PIL import Image ...
- Mac osx 安装PIL出现Some externally hosted files were ignored (use --allow-external PIL to allow).
出现这个问题Some externally hosted files were ignored (use --allow-external PIL to allow)的主要原因是PIL的一些依赖库还没 ...
- 使用Python中PIL图形库进行截屏
目的:通过使用Python的一个图形库PIL(Python Image Library)对屏幕进行截图 步骤: 1.下载PIL(路径)并安装 2.新建文件“截屏.py”,右键Edit with IDL ...
随机推荐
- C++ 类中成员函数分析
概述之前对成员变量的分布进行了整理,今天就对成员函数进行整理. 1.非静态成员函数C++的设计准则之一就是:非静态成员函数至少和一般的非成员函数的执行效率相同. 为了实现上衣准则,编译器会对非静态成员 ...
- BZOJ2115:[WC2011]Xor——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=2115 https://www.luogu.org/problemnew/show/P4151 这道 ...
- HDU3652:B-number——题解
http://acm.hdu.edu.cn/showproblem.php?pid=3652 题目大意:给一个数n,求1-n所有满足下列条件的数的个数: 1.包含一个子串为“13” 2.能被13整除. ...
- bzoj1052: [HAOI2007]覆盖问题(二分+构造)
貌似又写出了常数挺优(至少不劣)的代码>v< 930+人AC #49 写了个O(nlogn)貌似比一些人O(n)还快2333333 这题还是先二分答案,check比较麻烦 显然正方形一定以 ...
- 【数论数学】【P2152】【SDOI2009】Super GCD
传送门 Description Sheng bill有着惊人的心算能力,甚至能用大脑计算出两个巨大的数的GCD(最大公约 数)!因此他经常和别人比赛计算GCD.有一天Sheng bill很嚣张地找到了 ...
- ZOJ1586:QS Network (最小生成树)
QS Network 题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586 Description: In th ...
- Spark Streaming 的一些问题
Spark Streaming 的一些问题,做选型前关注这些问题可以有效的降低使用风险. checkpoint checkpoint 是个很好的恢复机制.但是方案比较粗暴,直接通过序列化的机制写入到文 ...
- java中String字符串的替换函数:replace与replaceAll的区别
例如有如下x的字符串 String x = "[kllkklk\\kk\\kllkk]";要将里面的“kk”替换为++,可以使用两种方法得到相同的结果 replace(CharSe ...
- 用好printf和scanf
转载自:http://hi.baidu.com/wuxicn/item/f648fe1970f86917e3f98682 在C中,printf系列函数(fprintf, sprintf...)和sca ...
- 链表系列 - [LeetCode] 链表的交错重排L1,Ln,L2,Ln-1 ....
其实一开始并没有想到时间上O(n)的方法,想到了也是空间复杂度是O(n)的(需要用到栈或者递归):链表分两段,用栈记录第一段的遍历过程. 后来经提示想到了,可以将第二段链表逆序.从而不需要额外的辅助空 ...