当前位置: 首页 > news >正文

numpy在数字图像处理中的应用

本文主要介绍numpy在数字图像处理中的应用,其中包括:矩阵创建、矩阵转换、基本操作、矩阵运算、元素获取、读取显示图像、简单绘图、

文章目录

  • 矩阵创建
  • 矩阵转换
  • 基本操作
  • 矩阵运算
  • 元素获取
  • 读取显示图像
  • 简单绘图

三个重要属性

A.dtype, A.shape, A.ndim

首先写一个读取灰色or彩色图像的函数

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR)) #通道转换
    plt.plot()
apple = cv.imread('./pic/apple.jpg') 
show(apple)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y20Yri5W-1661935440262)(output_60_0.png)]

apple = cv.imread('./pic/apple.jpg',0) #0表示读成灰度图 
show(apple)

在这里插入图片描述

创建矩阵

np.array([[1]])
np.uint8([1])
np.arange(2,10,2)
np.linspace(0, 2*pi, 100)
A = np.zeros((4,3), dtype=np.uint8)
B = np.ones((2,2), dtype=np.float32)
I = np.eye(4)
I2 = np.identity(6)
C = np.random.randint(0, 10, (4,4))

矩阵转换

A.reshape()
A.flatten(), A.ravel()
A.T
A.transpose()
np.hstack([A, B])

最大值、最小值、平均值

A.max()
A.min()
A.mean()
np.max()
np.min()
np.mean()

数学运算

np.power(A, 2)
np.sqrt()
np.log(), np.log2(), np.log10()
A.dot(x)

图片读写及显示

cv.imread(path)   #读取图片
cv.imwrite(path, img)  #显示在硬盘上

# cv.namedWindow('image')  显示图片
cv.imshow("roi", img)
cv.waitKey(0)
cv.destroyAllWindows()

plt.imshow(img)
plt.show()

简单绘图

plt.plot(x,y)
plt.hist(array)
import numpy as np

在矩阵中重要的三个属性

A = np.random.randint(0,9,(3,3))
print('A.dtype =', A.dtype)
print('A.ndim =', A.shape)
print('A.ndim =', A.ndim)

A1 = A.reshape((1,9))
print(A1) # 有几个方括号,就有几个维度

A1 = A1.astype(np.float32)
A.dtype = int32
A.ndim = (3, 3)
A.ndim = 2
[[2 2 0 7 8 1 5 7 4]]

矩阵创建

np.array([[1]])
np.uint8([1])
np.arange(2,10,2)
np.linspace(0, 2*pi, 100)
np.zeros((4,3), dtype=np.uint8)
np.ones((2,2), dtype=np.float32)
np.eye(4)
np.identity(6)
np.random.randint(0, 10, (4,4))

下面我们就用简单实用一下这些函数

x = np.array([1,2,3],dtype=float)  # dtype:指点数据类型
print(x)
print(x.dtype)
[1. 2. 3.]
float64
y = np.uint8([1,1,1])
print(y)
print(y.dtype)
[1 1 1]
uint8
np.arange(2,10,2) #step表示步长,且可为小数
array([2, 4, 6, 8])
np.linspace(0,10,11) #num表示创建的个数
array([ 0.,  1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

创建全0矩阵

np.zeros((2,3),dtype = int)
array([[0, 0, 0],
       [0, 0, 0]])

创建全1矩阵

np.ones((3,3),dtype=np.float32)
array([[1., 1., 1.],
       [1., 1., 1.],
       [1., 1., 1.]], dtype=float32)

创建单位矩阵

np.identity(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

创建随机数

np.random.randint(0,256,(10,10),dtype=np.uint8) # uint8是指无符号整型,uint8类型取值范围:0到255
array([[ 38, 240, 221, 175, 205,  32, 142, 207, 183, 215],
       [ 23, 200, 108, 171, 101, 213, 182, 141, 220, 144],
       [103, 112, 187,  29,  20, 107, 173, 236, 192, 160],
       [ 76, 196,  71,   3, 217, 169,   7, 127,  74, 223],
       [ 15,  75, 177, 181, 175,  17, 148,  82,  48, 246],
       [228,  41, 161, 228,   5, 154, 205,   0, 103,   5],
       [240, 227, 231, 217, 213, 218,  28,   0,  90, 156],
       [118, 140,  93, 107,  43,  90,  54,  78, 233, 233],
       [ 92,  16, 111, 253, 137,  87,  55, 166,  72,  63],
       [127,  95, 148,   7,  70,  56,  91,  26, 184, 112]], dtype=uint8)

矩阵转换

A.reshape()

A.flatten(), A.ravel()

A.T

A.transpose()

np.hstack([A, B])
# 创建一个全是1的矩阵
A = np.ones((3,3),dtype=np.uint8)
print(A)
[[1 1 1]
 [1 1 1]
 [1 1 1]]

reshape函数是numpy中一个很常用的函数,作用是在不改变矩阵的数值的前提下修改矩阵的形状

print(A.reshape((1,9)))
print(A.reshape((-1,9)))
[[1 1 1 1 1 1 1 1 1]]
[[1 1 1 1 1 1 1 1 1]]

A.T or A.transpose()将这个矩阵装置

B = np.random.randint(0,10,(3,3))
print(B)
print(B.T)
print(B.transpose())
[[4 8 5]
 [0 5 9]
 [3 1 1]]
[[4 0 3]
 [8 5 1]
 [5 9 1]]
[[4 0 3]
 [8 5 1]
 [5 9 1]]

hstack()是横向拉伸,源于horizontal,横向这个词 vstack()是纵向排列,源于vertical纵向

print(np.hstack([A,B]))
[[1 1 1 4 8 5]
 [1 1 1 0 5 9]
 [1 1 1 3 1 1]]
print(np.vstack([A,B]))
[[1 1 1]
 [1 1 1]
 [1 1 1]
 [4 8 5]
 [0 5 9]
 [3 1 1]]

基本操作

# 加减乘除
B = A + 2 
C = A / 2  

print(A)
print(B)
print(C)
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[[3 3 3]
 [3 3 3]
 [3 3 3]]
[[0.5 0.5 0.5]
 [0.5 0.5 0.5]
 [0.5 0.5 0.5]]
# 平方、开根、对数
B = np.power(A, 0.5)
C = np.sqrt(A)
D = np.log(A)

print(B)
print(C)
print(D)
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

axis的重点在于方向,而不是行和列。1表示横轴,方向从左到右;0表示纵轴,方向从上到下。

# 最大值max、最小值min、平均值mean
ma1 = A.max() 
ma2 = np.max(A)

mi1 = A.min(axis=0)
mi2 = np.min(A, axis=0)

me1 = A.mean(axis=1)
me2 = np.mean(A, axis=1)
# 转置
print(A)
print(A.T)
print(A.transpose())
print(np.transpose)
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[[1 1 1]
 [1 1 1]
 [1 1 1]]
<function transpose at 0x00000193DA314940>

矩阵运算

x = np.array([1, 1, 2])

z1 = A * x
z2 = A @ x #矩阵乘法
z3 = A.dot(x) #矩阵乘法

print(z1)
print(z2)
print(z3)
[[1 1 2]
 [1 1 2]
 [1 1 2]]
[4 4 4]
[4 4 4]
B = np.ones((3,3), dtype=int)

Z1 = A * B # 逐元素相乘
Z2 = A @ B # 矩阵乘法
Z3 = A.dot(B)

print(Z1)
print(Z2)
print(Z3)
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[[3 3 3]
 [3 3 3]
 [3 3 3]]
[[3 3 3]
 [3 3 3]
 [3 3 3]]
## 补充:矩阵乘法计算技巧

元素获取

u = np.arange(2, 10, 2)
print(u)
print(u[0], u[1:4])
[2 4 6 8]
2 [4 6 8]
# 获取行
print(A)
print(A[0])
print(A[0, :])
[[1 1 1]
 [1 1 1]
 [1 1 1]]
[1 1 1]
[1 1 1]
# 获取列
print(A[:, 0])
[1 1 1]
E = np.random.randint(0, 10, (5,5), dtype=int)
E
array([[5, 4, 9, 1, 7],
       [9, 8, 6, 2, 1],
       [1, 5, 2, 1, 1],
       [5, 4, 6, 0, 4],
       [4, 1, 4, 2, 5]])
# 获取子矩阵
E1 = E[0:3, 0:3].copy()
print(E1)
[[5 4 9]
 [9 8 6]
 [1 5 2]]
# 获取元素
e1 = E[0][0]
e2 = E[0, 0] #推荐
print(e1, e2)
5 5
# 元素赋值
E1[0,0] = 0
print(E1)
[[0 4 9]
 [9 8 6]
 [1 5 2]]
E1[0,:] = np.array([1,1,1])
print(E1)
[[1 1 1]
 [9 8 6]
 [1 5 2]]
E1 > 2
array([[False, False, False],
       [ True,  True,  True],
       [False,  True, False]])
E1.flatten()
array([1, 1, 1, 9, 8, 6, 1, 5, 2])

读取显示图像

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
img1 = cv.imread('./pic/cat500x480.jpg')
#print(img1)
cv.imshow("bear", img1)  #'bear'为窗口名字
cv.waitKey(0)  #等待按键响应
cv.destroyAllWindows()
# img1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB) #通道转换
plt.imshow(img1)
plt.show()

在这里插入图片描述

img1 = cv.cvtColor(img1, cv.COLOR_BGR2RGB) #通道转换
plt.imshow(img1)
plt.show()

在这里插入图片描述

cv.imread()读取灰度图

img2 = cv.imread('./pic/cat500x480.jpg', 0)
plt.imshow(img2) #灰度图会以热力图的方式显示
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TuoXKb3b-1661935440260)(output_56_0.png)]

img2 = cv.imread('./pic/cat500x480.jpg', 0)
plt.imshow(img2,cmap='gray')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ADRu2mkM-1661935440261)(output_57_0.png)]

print(img1.ndim, img2.ndim)
3 2

我们通过构造函数show(),通过判别图像的维度,来判别是灰色图像还是彩色图像,再进行输出

def show(img):
    if img.ndim == 2:
        plt.imshow(img, cmap='gray')
    else:
        plt.imshow(cv.cvtColor(img,cv.COLOR_RGB2BGR)) #通道转换
    plt.plot()
apple = cv.imread('./pic/apple.jpg')
show(apple)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y20Yri5W-1661935440262)(output_60_0.png)]

简单绘图

简单实用matplotlib来绘制数学图形

import numpy as np
import matplotlib.pyplot as plt
x = np.arange(2,20)
y = 2 * x + np.random.randint(5,20,18)
plt.plot(x,y,'*-',color='r')
plt.show()

在这里插入图片描述

x = np.linspace(0,1,100)
y1 = np.power(x,0.5)
y2 = x
y3 = np.power(x,1.5)
plt.plot(x,y1,label='0.5')
plt.plot(x,y2,label='1.0')
plt.plot(x,y3,label='1.5')
plt.legend() #显示图例
plt.xlabel('r')
plt.ylabel('s')
plt.grid() #显示网格 
plt.xlim([0,1])
plt.ylim([0,1])
plt.show()

在这里插入图片描述

a = np.random.randint(0, 10, 100)
print(a)
[5 7 9 5 1 6 4 0 4 5 0 8 2 0 2 4 8 2 2 2 0 0 2 8 9 7 7 9 0 1 3 8 1 2 2 0 3
 8 2 7 5 9 1 5 4 1 2 8 6 0 7 4 3 1 7 8 6 0 1 4 0 4 6 2 3 0 6 7 9 3 3 9 2 5
 7 8 1 5 9 1 8 1 0 2 5 5 7 1 9 3 2 1 9 2 0 4 6 0 0 2]
plt.hist(a, bins=10)
plt.show()

在这里插入图片描述

bins = np.arange(-0.5, 10, 1)
plt.hist(a, bins=bins, rwidth=0.8, color='green')
plt.xticks(range(0,10))
plt.show()

在这里插入图片描述

A1 = np.random.randint(0, 10, (10,10))
print(A1)
[[5 8 1 9 0 8 6 9 4 5]
 [4 0 5 5 5 9 6 5 4 9]
 [4 9 4 6 7 8 4 7 2 0]
 [4 0 9 7 5 3 5 5 8 9]
 [6 2 5 4 6 4 8 7 1 2]
 [7 2 0 9 7 2 4 3 5 7]
 [6 5 3 1 3 8 4 6 7 5]
 [3 9 8 2 6 9 8 9 2 4]
 [3 5 7 3 0 4 8 5 9 9]
 [6 1 6 5 7 6 3 2 8 1]]
bins = np.arange(-0.5, 10, 1)
plt.hist(A1.flatten(), bins=bins, rwidth=0.8, color='green')
plt.xticks(range(0,10))
plt.show()

在这里插入图片描述

np.arange(-0.5, 10, 1)
array([-0.5,  0.5,  1.5,  2.5,  3.5,  4.5,  5.5,  6.5,  7.5,  8.5,  9.5])

相关文章:

  • A tour of gRPC:09 - gRPC Interceptor 拦截器
  • 【Docker】——Network
  • Vue3如何实现全屏模式
  • 新型数据中心网络安全体系研究
  • Android获取手机电压,电流,电量,BatteryManager
  • 光纤通信数字孪生系统架构及关键技术研究
  • 数据结构与算法复习:第三十四弹
  • 元宇宙会场APP功能系统软件源码开发
  • 【反诈拒赌 支付在行动】涉赌资金转移典型案例及风险提示
  • 【Python黑科技】把秘密写在照片里(保姆级图文+实现代码)
  • OpenGL ES学习(7)——混合
  • Spoon Kettle 连接之记录集连接详解(Merge join)
  • 光传送网管控融合研究与智能化演进思考
  • 应对三大行业痛点,利尔达用芯打造智能换电系统平台
  • RedHat Linux修改SSHD默认22端口
  • [译] React v16.8: 含有Hooks的版本
  • 【comparator, comparable】小总结
  • 【附node操作实例】redis简明入门系列—字符串类型
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CSS实用技巧
  • css系列之关于字体的事
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • golang中接口赋值与方法集
  • js 实现textarea输入字数提示
  • JS+CSS实现数字滚动
  • linux学习笔记
  • log4j2输出到kafka
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • Python_网络编程
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 前嗅ForeSpider教程:创建模板
  • 什么是Javascript函数节流?
  • 使用putty远程连接linux
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 物联网链路协议
  • 怎么把视频里的音乐提取出来
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Note)C++中的继承方式
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (五)MySQL的备份及恢复
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .NET gRPC 和RESTful简单对比
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET/C# 的字符串暂存池
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET框架设计—常被忽视的C#设计技巧
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • // an array of int