用python处理图片实现图像中的像素访问


Posted in Python onMay 04, 2018

前面的一些例子中,我们都是利用Image.open()来打开一幅图像,然后直接对这个PIL对象进行操作。如果只是简单的操作还可以,但是如果操作稍微复杂一些,就比较吃力了。因此,通常我们加载完图片后,都是把图片转换成矩阵来进行更加复杂的操作。

python中利用numpy库和scipy库来进行各种数据操作和科学计算。我们可以通过pip来直接安装这两个库

pip install numpy
pip install scipy

以后,只要是在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]来访问像素值。

例1:打开图片,并随机添加一些椒盐噪声

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()

用python处理图片实现图像中的像素访问

例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()

用python处理图片实现图像中的像素访问

如果要对多个像素点进行操作,可以使用数组切片方式访问。切片方式返回的是以指定间隔下标访问 该数组的像素值。下面是有关灰度图像的一些例子:

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 列(不包括第 100 行和第 100 列)
img[i].mean() # 第 i 行所有数值的平均值
img[:,-1] # 最后一列
img[-2,:] (or im[-2]) # 倒数第二行

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现dnspod自动更新dns解析的方法
Feb 14 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
python opencv之SURF算法示例
Feb 24 Python
python删除某个字符
Mar 19 Python
Python 画出来六维图
Jul 26 Python
python序列化与数据持久化实例详解
Dec 20 Python
pytorch 批次遍历数据集打印数据的例子
Dec 30 Python
python操作yaml说明
Apr 08 Python
python3.6使用SMTP协议发送邮件
May 20 Python
python批量生成条形码的示例
Oct 10 Python
Python Tkinter实例——模拟掷骰子
Oct 24 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
用python处理图片之打开\显示\保存图像的方法
May 04 #Python
Python 创建空的list,以及append用法讲解
May 04 #Python
浅谈python中字典append 到list 后值的改变问题
May 04 #Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 #Python
对python中的pop函数和append函数详解
May 04 #Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 #Python
对python append 与浅拷贝的实例讲解
May 04 #Python
You might like
php 禁止页面缓存输出
2009/01/07 PHP
php面向对象全攻略 (七) 继承性
2009/09/30 PHP
PHP中使用crypt()实现用户身份验证的代码
2012/09/05 PHP
CodeIgniter中使用cookie的三种方式详解
2014/07/18 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
thinkPHP分页功能实例详解
2017/05/05 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
onpropertypchange
2006/07/01 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
jquery下操作HTML控件的实现代码
2010/01/12 Javascript
该如何加载google-analytics(或其他第三方)的JS
2010/05/13 Javascript
jQuery表单获取和失去焦点输入框提示效果的实例代码
2013/08/01 Javascript
jQuery函数map()和each()介绍及异同点分析
2014/11/08 Javascript
Javascript设计模式理论与编程实战之简单工厂模式
2015/11/03 Javascript
三种AngularJS中获取数据源的方式
2016/02/02 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/10/05 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
完美解决手机网页中输入框被输入法遮挡的问题
2017/12/19 Javascript
vue项目实战总结篇
2018/02/11 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js实现全选和全不选
2020/07/28 Javascript
跟老齐学Python之编写类之一创建实例
2014/10/11 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
在Python中定义一个常量的方法
2018/11/10 Python
python pandas获取csv指定行 列的操作方法
2019/07/12 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
2020/01/14 Python
浅析python中的del用法
2020/09/02 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
法国设计制造的扫帚和刷子:Andrée Jardin
2018/12/06 全球购物
党建示范点实施方案
2014/03/12 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
三好学生评选事迹材料(2016精选版)
2016/02/25 职场文书
小学生作文写作技巧100例,非常实用!
2019/07/08 职场文书
详解Vue router路由
2021/11/20 Vue.js
JVM的类加载器和双亲委派模式你了解吗
2022/03/13 Java/Android