文章标题

用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]) #倒数第二行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值