Python图像灰度变换及图像数组操作


Posted in Python onJanuary 27, 2016

使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理

numpy简介:

NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量、矩阵、图像等)以及线性代数函数。

数组对象可以实现数组中重要的操作,比如矩阵乘积、转置、解方程系统、向量乘积和归一化。这为图像变形、对变化进行建模、图像分类、图像聚类等提供了基础。

在上一篇python基本图像操作中,当载入图像时,通过调用 array() 方法将图像转换成NumPy的数组对象。NumPy 中的数组对象是多维的,可以用来表示向量、矩阵和图像。通过对图像的数组进行直接操作,就可以完成很多图像处理。

numpy的相关知识网上有很多资料,作为python科学计算的基础,还是非常值得认真学习的。

使用图像数组进行基本图像操作:

认识图像数组:

通过下面这几个程序我们看一下图像与灰度图的图像数组,以及numpy数组的切片。

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#读取图片并转为数组
im = array(Image.open("./source/test.jpg"))
#输出数组的各维度长度以及类型
print im.shape,im.dtype
#输出位于坐标100,100,颜色通道为r的像素值
print im[100,100,0]
#输出坐标100,100的rgb值
print im[100,100]及类型
print im.shape,im.dtype

运行结果:

(600, 500, 3) uint8
64
[ 64 117 195]

我们看到的是一个三维数组,分别代表横坐标,纵坐标和颜色通道。

我们可以通过数组把红蓝通道交换

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#读取图片并转为数组
im = array(Image.open("./source/test.jpg"))
#红色通道
r = im[:,:,0]
#交换红蓝通道并显示
im[:,:,0] = im[:,:,2]
im[:,:,2] = r
imshow(im)
show()

这里用到了numpy数组的切片方式,关于numpy的资料网上有很多,就不过多叙述了。

运行结果:

 Python图像灰度变换及图像数组操作

在转为数组的过程中我们可以设定数据类型,同时灰度图的图像数组也是有意义的:

# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#读取图片,灰度化,并转为数组
im = array(Image.open("./source/test.jpg").convert('L'),'f')
#输出数组的各维度长度以及类型
print im.shape,im.dtype
#输出坐标100,100的值
print im[100,100]

运行结果:

(600, 500) float32
110.0

额外的参数‘f'将数组的数据类型转为浮点数

由于灰度图没有颜色信息,所以形状元组只有两个数值

*array()变换的相反操作可以使用PIL的fromarray()完成,如im = Image.fromarray(im)

图像数组的简单应用——灰度变换:

灰度图像:

灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度。

可以通过下面几种方法,将图像转换为灰度:

1.浮点算法:Gray=R*0.3+G*0.59+B*0.11

2.整数方法:Gray=(R*30+G*59+B*11)/100

3.移位方法:Gray =(R*76+G*151+B*28)>>8;

4.平均值法:Gray=(R+G+B)/3;

5.仅取绿色:Gray=G;

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。

之前已经使用过很多次了,使用python可以通过使用convert(‘L')来获得灰度图

灰度变换:

将图像读入 NumPy 数组对象后,我们可以对它们执行任意数学操作。一个简单的例子就是图像的灰度变换。即任意函数 f ,它将 0…255 区间(或者 0…1 区间)映射到自身。

下面程序中有一些简单的灰度变换:

#-*- coding: utf-8 -*-
from PIL import Image
from pylab import *
#读取图片,灰度化,并转为数组
im = array(Image.open("./source/test.jpg").convert('L'))
im2 = 255 - im # 对图像进行反相处理
im3 = (100.0/255) * im + 100 # 将图像像素值变换到 100...200 区间
im4 = 255.0 * (im/255.0)**2 # 对图像像素值求平方后得到的图像(二次函数变换,使较暗的像素值变得更小)
#2x2显示结果 使用第一个显示原灰度图
subplot(221)
title('f(x) = x')
gray()
imshow(im)
#2x2显示结果 使用第二个显示反相图
subplot(222)
title('f(x) = 255 - x')
gray()
imshow(im2)
#2x2显示结果 使用第三个显示100-200图
subplot(223)
title('f(x) = (100/255)*x + 100')
gray()
imshow(im3)
#2x2显示结果 使用第四个显示二次函数变换图
subplot(224)
title('f(x) =255 *(x/255)^2')
gray()
imshow(im4)
#输出图中的最大和最小像素值
print int(im.min()),int(im.max())
print int(im2.min()),int(im2.max())
print int(im3.min()),int(im3.max())
print int(im4.min()),int(im4.max())
show()

运行结果:

 Python图像灰度变换及图像数组操作

0 255
0 255
100 200
0 255

可以比较明显的看到灰度变换的结果,,第二张图被反相显示,第三张图像的暗部变亮,亮部变暗,其值被限制在100到200之间,其中最后一张图像通过二次函数变换使较暗的像素值变得更暗。

结语:

本篇博客介绍了python使用图像数组去进行图像操作的过程,包括几个简单的实例,通过数组我们可以对图像进行任意数学操作,是图像变形、图像分类、图像聚类等的基础,希望我的博客对大家有所帮助~

Python 相关文章推荐
Python Trie树实现字典排序
Mar 28 Python
Python中使用Boolean操作符做真值测试实例
Jan 30 Python
浅谈Python数据类型之间的转换
Jun 08 Python
详解python3实现的web端json通信协议
Dec 29 Python
Python使用内置json模块解析json格式数据的方法
Jul 20 Python
Python unittest单元测试框架总结
Sep 08 Python
对python中的 os.mkdir和os.mkdirs详解
Oct 16 Python
关于Python 中的时间处理包datetime和arrow的方法详解
Mar 19 Python
pandas中的ExcelWriter和ExcelFile的实现方法
Apr 24 Python
Python爬虫爬取博客实现可视化过程解析
Jun 29 Python
python中random模块详解
Mar 01 Python
python基础之停用词过滤详解
Apr 21 Python
让python在hadoop上跑起来
Jan 27 #Python
CentOS安装pillow报错的解决方法
Jan 27 #Python
python实现文本去重且不打乱原本顺序
Jan 26 #Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 #Python
Python函数中*args和**kwargs来传递变长参数的用法
Jan 26 #Python
python中的编码知识整理汇总
Jan 26 #Python
在MAC上搭建python数据分析开发环境
Jan 26 #Python
You might like
php下实现折线图效果的代码
2007/04/28 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
php 常用类整理
2009/12/23 PHP
php过滤所有恶意字符(批量过滤post,get敏感数据)
2014/03/18 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
2016/11/22 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
封装好的js判断操作系统与浏览器代码分享
2015/01/09 Javascript
Jquery EasyUI实现treegrid上显示checkbox并取选定值的方法
2016/04/29 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
JS遍历数组和对象的区别及递归遍历对象、数组、属性的方法详解
2016/06/14 Javascript
a标签跳转到指定div,jquery添加和移除class属性的实现方法
2016/10/10 Javascript
jsp 网站引入外部css或者js失效问题解决
2016/10/31 Javascript
使用微信内嵌H5网页解决JS倒计时失效问题
2017/01/13 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
JS实现的自动打字效果示例
2017/03/10 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
dts文件中删除一个node或属性的操作方法
2018/08/05 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
2018/08/30 Javascript
解决vue无法设置滚动位置的问题
2018/10/07 Javascript
node使用request请求的方法
2019/12/20 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
[43:14]Liquid vs Optic 2018国际邀请赛淘汰赛BO3 第二场 8.21
2018/08/22 DOTA
[55:11]完美世界DOTA2联赛PWL S2 SZ vs LBZS 第一场 11.26
2020/11/30 DOTA
python实现根据文件关键字进行切分为多个文件的示例
2018/12/10 Python
详解python和matlab的优势与区别
2019/06/28 Python
Python作用域与名字空间原理详解
2020/03/21 Python
Html5实现移动端、PC端 刮刮卡效果
2016/06/30 HTML / CSS
HTML5 客户端数据库简易使用:IndexedDB
2019/12/19 HTML / CSS
大学生个人推荐信范文
2013/11/25 职场文书
导师就业推荐信范文
2014/05/22 职场文书
八荣八耻的活动方案
2014/08/16 职场文书
民主生活会对照检查材料思想汇报
2014/09/27 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
Python语言中的数据类型-序列
2022/02/24 Python