【计算机视觉】【图像处理】图像数字化运算(Numpy)
2018-03-06 20:40
330 查看
Opencv的Python API是基于Numpy的。Numpy用来存储和处理多维数组,核心struct是ndarray。
关于numpy.array的使用手册详见:numpy.array的详细手册
下面详解了numpy.array接口、numpy.linalg接口、以及灰度图像和彩色图像的矩阵数字化操作。
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。
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)结果
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)
"""
@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)
或者
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)
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)
"""
@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)
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)
方阵逆 = 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!")
"""
@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!")
this's all, enjoy it~~~
(end)
关于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.float162.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)
相关文章推荐
- 【计算机视觉】【图像处理】阈值分割---二值图的逻辑运算
- 图像处理与计算机视觉:基础,经典以及最近发展(1)序
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- 图像处理与计算机视觉:基础,经典以及最近发展(3)计算机视觉中的信号处理与模式识别
- 牛人的博客(机器学习,图像处理,计算机视觉)
- 计算机视觉与图像处理学习笔记(一)
- 图像处理与计算机视觉基础,经典以及最近发展
- 图像处理与计算机视觉的 topics
- 图像处理与计算机视觉:基础,经典以及最近发展
- 图像处理与计算机视觉基础,经典以及最近发展
- 图像处理和计算机视觉中的经典论文
- 图像处理和计算机视觉中的经典论文(转)
- 图像处理与计算机视觉 基础、经典以及最近发展
- OpenCV3计算机视觉Python语言实现(三):使用OpenCV3处理图像
- 计算机视觉与图像处理相关的国内外重要期刊汇总
- 图像处理与计算机视觉 基础、经典以及最近发展
- 图像处理与计算机视觉:基础,经典以及最近发展
- 4.图像处理与计算机视觉:基础,经典以及最近发展 图像处理与分析
- [置顶] Python计算机视觉Learning(一)-- Python图像处理类库--PIL
- Matlab计算机视觉/图像处理工具箱推荐