python图像数组操作与灰度变换

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

使用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的资料网上有很多,就不过多叙述了。

运行结果:

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

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

运行结果:

0 255
0 255
100 200
0 255

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

结语:

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

时间: 2024-08-13 19:54:48

python图像数组操作与灰度变换的相关文章

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

Python图像灰度变换及图像数组操作 作者:MingChaoSun 字体:[增加 减小] 类型:转载 时间:2016-01-27我要评论 这篇文章主要介绍了Python图像灰度变换及图像数组操作的相关资料,需要的朋友可以参考下 使用python以及numpy通过直接操作图像数组完成一系列基本的图像处理 numpy简介: NumPy是一个非常有名的 Python 科学计算工具包,其中包含了大量有用的工具,比如数组对象(用来表示向量.矩阵.图像等)以及线性代数函数. 数组对象可以实现数组中重要的操

Python Cookbook(第3版)中文版:15.11 用Cython写高性能的数组操作

15.11 用Cython写高性能的数组操作? 问题? 你要写高性能的操作来自NumPy之类的数组计算函数.你已经知道了Cython这样的工具会让它变得简单,但是并不确定该怎样去做. 解决方案? 作为一个例子,下面的代码演示了一个Cython函数,用来修整一个简单的一维双精度浮点数数组中元素的值. # sample.pyx (Cython) cimport cython @cython.boundscheck(False) @cython.wraparound(False) cpdef clip

python二维图像输出操作大全(非常全)!

//2019.07.141.matplotlib模块输出函数图像应用时主要用的是它的ptplot模块,因此在导入使用该模块时可以直接用以下语句:import matplotlib.pyplot as plt2.matplotlib模块输出图线时它得到坐标轴数值以及标题正常默认是英文形式,而如果需要在转换成为中文形式并且需要正常输出负号则需要用以下两句python语句设置一下,这样便可以正常输出中英文两种形式标题与带负号的坐标数值:plt.rcParams["font.sans-serif&quo

Python 列表(list)操作

创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_start = sample_list[0] end_value = sample_list[-1] 删除列表的第一个值 del sample_list[0] 在列表中插入一个值 sample_list[0:0] = ['sample value'] 得到列表的长度 list_length = len(sa

Halcon学习(三)赋值与数组操作

assign : 对数据赋值,对数组的初始化.但不能对数组中的某一个值进行赋值. 举例:Tuple1 := [1,0,3,4,5,6,7,8,9]    // 对数组进行初始化 Val := sin(1.2) + cos(1.2)        // 对某一个值进行赋值 Tuple2 := []                           // 数组定义 assign_at : 对数组中的某一个值进行赋值. 举例:Tuple1[1] := 2                       

Python: 大型数组运算

需要在大数据集(比如数组或网格) 上面执行计算,涉及到数组的重量级运算操作,可以使用NumPy 库. 下面是一个简单的小例子,展示标准列表对象和NumPy 数组对象之间的差别 >>> x = [1, 2, 3, 4] >>> y = [5, 6, 7, 8] >>> x * 2 [1, 2, 3, 4, 1, 2, 3, 4] >>> x + 10 Traceback (most recent call last): File &qu

OpenCV基础(二)---图像像素操作

图像像素操作 通过访问图像的像素,对灰度图像和RGB图像进行反差. 例如,在灰度图像中,某一个像素值为,pixel_value. 那么反差后的pixel_value = 255 - pixel_value. 对RGB图像处理类似,差别在于要对每一个颜色通道进行反差. 方法1: 1 #include <opencv2/opencv.hpp> 2 #include <iostream> 3 4 using namespace cv; 5 using namespace std; 6 7

利用numpy实现多维数组操作图片

1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白色   :接下来我们还是来看代码: 1 import cv2 as cv 2 import numpy as np 3 4 5 def access_piexls(image): 6 print(image.shape) #获取图像的形状大小 7 height=image.shape[0] #图像的

PHP:数组操作函数array_count_values()的实现

    PHP作为一门弱类型的脚本语言,其变量无需声明,即用即得,其数组更是与其他强类型语言相差巨大,比如PHP数组中的关联键和数值键,其中最有趣的莫过于关联键了,这是在C++或JAVA中无法见到的,而且PHP还提供诸多强大的数组操作函数,比如   array_values()//可以剥离数组中的关联键和数值键,或得有其元素的值所组成的数组 array_keys()//获得所有的关联键和数值键  利用这两个函数就可以非常方便简单的实现  array_count_values()函数  思路就是先