您的位置:首页 > 理论基础

【计算机视觉】【图像处理】图像数字化运算(Numpy)

2018-03-06 20:40 330 查看
Opencv的Python API是基于Numpy的。Numpy用来存储和处理多维数组,核心struct是ndarray。
关于numpy.array的使用手册详见:numpy.array的详细手册
下面详解了numpy.array接口、numpy.linalg接口、以及灰度图像和彩色图像的矩阵数字化操作。
1.构造ndarray对象

1.1构造二维的ndarray

代码
注:数组内的元素类型可以由zeros函数入参dtypes指定,可选类型有:uint8、int32、float32、float64等# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
z = numpy.zeros((2,4),numpy.uint8)#构造2×4的零矩阵
print(type(z))
print(z)执行结果
技巧:可以在"Variable explorer"窗口查看对象的name、tpye、size以及详细内容value。



1.2构造三维的ndarray

构造m×n×k的三维数组时,可以理解为构造m层个n×k二维数组。每个n×k二维数组占一层,一共m层个二维数组,每个二维数组尺寸大小事n×k。
m×n×k三维数组就是一个m层的堆叠数组,每层是一个尺寸大小为n×k的二维数组~~~~~
想象成3D堆叠内存也不错,一共m层,每层内存都是由n×k的内存颗粒组成的二维内存片
代码# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
a = numpy.array([
[[1,2,3,4],[5,6,7,8]],
[[11,12,13,14],[15,16,17,18]]
], numpy.float16)
print(type(a))
print(a)结果



1.3ndarray数组的尺寸shape

1.4ndarray数组的元素类型dtype

# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
a = numpy.array([
[[1,2,3,4],[5,6,7,8]],
[[11,12,13,14],[15,16,17,18]]
], numpy.float16)

print(a.shape) #(2, 2, 4)
print(a.dtype) #float16

2访问ndarray中的值

2.1访问二维ndarray中的值

假设有个二维数组a = [[1, 2, 3],[4, 5, 6]]

2.1.1访问第2行第3列的值,a[1,2]

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6]])
>>> print(a[2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: index 2 is out of bounds for axis 0 with size 2
>>> print(a[1,2])
6
>>>



2.1.2访问第2行,a[1,:]

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6]])
>>> print(a[1,:])
[4 5 6]
>>>



2.1.3访问第2列,a[:,1]

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6]])
>>> print(a[:,1])
[2 5]
>>>



2.1.4访问第2行上面且第二列左边的部分数据,a[0:1,0:1]

>>> import numpy
>>> a = numpy.array([[1,2,3],[4,5,6]])
>>> a[0:1, 0:1]
array([[1]])
>>>



2.2访问三维数组ndarray中的值

假设有3×2×4的三维数组,元素类型为numpy.float16



2.2.1访问此三维数组中所有二维数组的第2列

# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
#3×2×4三维数组
a = numpy.array([
[[1,2,3,4],[5,6,7,8]],
[[9,10,11,12],[13,14,15,16]],
[[17,18,19,20],[21,22,23,24]]
], numpy.float16)

ret = a[:,:,1] #访问所有二维数组中的第2列数据
print(ret)



2.2.2访问三维数组中的第2个二维数组

# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
#3×2×4三维数组
a = numpy.array([
[[1,2,3,4],[5,6,7,8]],
[[9,10,11,12],[13,14,15,16]],
[[17,18,19,20],[21,22,23,24]]
], numpy.float16)

ret = a[1,:,:] #访问此三维数组中的第2个二维数组
print(ret)



3矩阵的运算

3.1矩阵的加法 ret = src1 +src2

注意:
numpy.uint8类型时元素最大值是255,如果俩元素和x大于255,则最后和值会被%255后再-1得到值作为和值
运算规则:e = (e1 + e2)%255 - 1# -*- coding: utf-8 -*-
"""
@author: tom
"""

#ex_opencv_ndarray.py
import numpy
src1 = numpy.array([[255,2,3,4],[5,6,7,8]], numpy.uint8)
src2 = numpy.array([[2,1,1,1],[2,2,2,2]], numpy.uint8)

ret = src1 + src2 #加法
print(ret)



3.2矩阵的减法

运算规则:e = (e1 - e2)%255 + 1# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src1 = numpy.array([[255,2,3,4],[5,6,7,8]], numpy.uint8)
src2 = numpy.array([[1,1,1,1],[2,2,2,2]], numpy.uint8)

ret =src2 - src1#加法
print(ret)


3.3矩阵的点乘运算

ret = a1 * a2
或者
ret = numpy.multipy(a1, a2)
注:最后每个位置的元素乘值要符合以下运算规则:
运算规则:e = (e1 * e2)%255 - 1
# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src1 = numpy.array([[255,2,3,4],[5,6,7,8]], numpy.uint8)
src2 = numpy.array([[2,1,1,1],[2,2,2,2]], numpy.uint8)

ret =src1*src2#点乘
print(ret)



3.4矩阵的点除

a1 = a1.astype(numpy.float32) #改变a1的元素数据类型
ret = a1/a2
运算规则:
1)40/0=inf
2)40.0/0 = inf
3)40/0.0 = inf
4)40.0/0.0 = inf# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src1 = numpy.array([[255,2,3,4],[5,6,7,8]], numpy.uint8)
src2 = numpy.array([[0,0,0,0],[1,1,1,1]], numpy.uint8)

ret1 = src1/src2
print(ret1)

src1 = src1.astype(numpy.float16)#改变src1的数据类型为float16
ret2 = src1/src2
print(ret2)


3.5矩阵的乘法运算

矩阵乘只能使用numpy.dot(a1, a2)函数!# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src1 = numpy.array([[1,2,3,4],[5,6,7,8]], numpy.uint8)
src2 = numpy.array([[0,0,0,0],[1,1,1,1],[0,0,0,0],[1,1,1,1]], numpy.uint8)

ret = numpy.dot(src1, src2) #矩阵乘
print(ret)


3.6矩阵元素的幂运算

ret = numpy.power(src, 2) 
ret = numpy.power(src, 2.0)
这俩结果都是一样的~,都是对矩阵中的元素进行幂运算~~~~# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src = numpy.array([[1,2,3,4],[5,6,7,8]], numpy.float16)

ret1 = numpy.power(src, 2)#每个元素求幂的2次方
ret2 = numpy.power(src, 2.0)#对矩阵求幂运算

print(ret1)
print(ret2)


3.7方阵的逆

A=(aij)n×n
方阵逆 = numpy.linalg.inv(A)# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src = numpy.array([[1,2],[3,4]], numpy.uint8)

m,n = src.shape
if m == n:
ret = numpy.linalg.inv(src) #方阵的逆
print(ret)
else:
print("src is not n×n matrix!")


3.8方阵的行列式

方阵才有行列式  = numpy.linalg.det(src)# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src = numpy.array([[1,2],[3,4]], numpy.uint8)

m,n = src.shape
if m == n:
ret=numpy.linalg.det(src)
print(ret)
else:
print("src is not n×n matrix!")


3.9伴随矩阵
伴随矩阵 = 方阵的逆阵 乘 方阵的行列式# -*- coding: utf-8 -*-
"""
@author: tom
"""

import numpy
src = numpy.array([[1,2],[3,4]], numpy.uint8)

m,n = src.shape
if m == n:
ret1=numpy.linalg.inv(src)
ret2=numpy.linalg.det(src)
bansui = ret1 * ret2
else:
print("src is not n×n matrix!")


4图像数字化

4.1将灰度图像转化为ndarray

# -*- coding: utf-8 -*-
"""

@author: tom
"""

import sys
import numpy
import cv2

#main function
if __name__=="__main__":
#input image,然后转换为array
if len(sys.argv) > 1:
img = cv2.imread(sys.argv[1], cv2.IMREAD_GRAYSCALE)
#show image
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
img = cv2.imread("A:\data\lena_gray.jpg", cv2.IMREAD_GRAYSCALE)
#show image
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
print ("usage:python img2array.py imagefile")



4.2将彩色图像转化为ndarray

4.2.1得到彩色图像的三维矩阵img



4.2.2得到彩色图像中的三个颜色通道并显示

# -*- coding: utf-8 -*-
"""

@author: tom
"""

import sys
import numpy
import cv2

img = cv2.imread("A:\data\lena_color.jpg", cv2.IMREAD_COLOR)
#show image
cv2.imshow("img", img)

#img = BGR
img_b = img[:,:,0]
img_g = img[:,:,1]
img_r = img[:,:,2]

cv2.imshow("b", img_b)
cv2.imshow("g", img_g)
cv2.imshow("r", img_r)

cv2.waitKey(0)
cv2.destroyAllWindows()
print ("usage:python img2array.py imagefile")



this's all, enjoy it~~~
(end)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: