用python处理图片(4):图像中像素访问
前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都是把图片转换成矩阵来进行更加复杂的操作。
在以后,只要是在python中进行数字图像处理,都需要导入这两个包:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
打开图像并转化为矩阵,并显示:
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('d:/lena.jpg')) #打开图像并转化为数字矩阵
plt.figure("dog")
plt.imshow(img)
plt.axis('off')
plt.show()
调用numpy中的array()函数可以将PIL对象转化为数组对象
查看图片信息,可用如下方法:
print img.shape
print img.dtype
print img.size
print type(img)
如果是RGB图像,那么转换为array后,就变成来一个rows*cols*channels的三维矩阵,因此,我们可以使用img[i,j,k]来访问像素值。
打开图像,随机添加椒盐噪声
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('d:/ex.jpg'))
#随机生成5000个椒盐
rows,cols,dims=img.shape
for i in range(5000):
x=np.random.randint(0,rows)
y=np.random.randint(0,cols)
img[x,y,:]=255
plt.figure("beauty")
plt.imshow(img)
plt.axis('off')
plt.show()
例2:将lena图像二值化,像素值大于128的变为1,否则变为0
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
img=np.array(Image.open('d:/pic/lena.jpg').convert('L'))
rows,cols=img.shape
for i in range(rows):
for j in range(cols):
if (img[i,j]<=128):
img[i,j]=0
else:
img[i,j]=1
plt.figure("lena")
plt.imshow(img,cmap='gray')
plt.axis('off')
plt.show()
如果要对多个像素进行操作,可以使用数组切片方式访问。切片方式返回的是以指定间隔下标访问该数组的像素值。下面有关灰度图像的例子:
img[i,:] =im[j,:] #将第j行的数值赋给第i行
img[:,i] =100 #第i列所有数值设为100
img[:100,:50].sum() #计算前100行,前50列所有数值的和
img[50:100,50:100]#50~100行,50~100列
img[i].mean()#第i行所有数值的平均值
img[:,-1]#最后一列
img[-2,:](or im[-2]) #倒数第二行