学习笔记 - 使用Numpy操作像素基础 - (Python-OpenCV)

本文详细介绍了如何使用Numpy进行数组操作,包括创建不同类型的数组,如一维、二维、浮点型及三维数组。还涵盖了数组的加减乘除、幂运算、比较和复制。此外,探讨了数组的索引与切片,以及如何创建黑白和彩色图像,并通过hstack和vstack方法实现图像的水平和垂直拼接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、创建数组

array() 方法

⭐参数:array(object, dtype, copy, order, subok, ndmin)

♥1.创建一维数组和二维数组

♥2.创建浮点型数组

♥3.创建三维数组

empty() 方法

♥1.创建2行3列未初始化数组

zeros() 方法

♥1.创建用 0 填充的数组

♥1.创建用1 填充的数组

randint() 方法

⭐参数:randint(low, high, size)

♥1.创建随机数组

二、操作数组

1.加减乘除法运算

2.幂运算

3.比较运算

4.复制数组

三、数组的索引和切片

1.索引

2.切片式索引

3.二维数组索引

4.二维数组切片式索引

四、创建图像

1.创建黑白图像

1.1 创建纯 黑 图像

1.2 创建纯 白 图像

1.3 在黑图像内部创建白色图像

1.4 创建黑白相间的图像

2.创建彩色图像

3.创建随机图像

五、拼接图像

1.水平拼接数组

2.垂直拼接数组

3.在图像处理中的应用


一、创建数组

array() 方法

⭐参数:array(object, dtype, copy, order, subok, ndmin)

♥1.创建一维数组和二维数组

import numpy as np

n1 = np.array([1,2,3]) # 一维数组
n2 = np.array([0.1, 0.2, 0.3]) #一维数组
n3 = np.array([[1,2], [3,4]]) #二维数组
print(n1)
print(n2)
print(n3)

运行结果:

#n1
[1 2 3] 
#n2
[0.1 0.2 0.3] 
#n3
[[1 2] 
 [3 4]]

♥2.创建浮点型数组

import numpy as np

list = [1,2,3]
n1 = np.array(list, dtype=np.float_)
# 或者
n1 = np.array(list, dtype=float)
print(n1)
print(n1.dtype)
print(type(n1[0]))

运行结果:

[1. 2. 3.]
float64
<class 'numpy.float64'>

♥3.创建三维数组

import numpy as np

nd1 = [1,2,3]
nd2 = np.array(nd1, ndmin=3) # 三维数组
print(nd2)

运行结果:

[[[1 2 3]]]

empty() 方法

♥1.创建2行3列未初始化数组

import numpy as np

n = np.empty([2,3])
print(n)

运行结果:

[[9.75054990e-312 9.75054990e-312 1.23940528e-060]
 [9.75054990e-312 9.75054990e-312 3.34051544e-195]]

zeros() 方法

♥1.创建用 0 填充的数组

import numpy as np

n = np.zeros((3,3), np.uint8)
print(n)

运行结果:

[[0 0 0]
 [0 0 0]
 [0 0 0]]

##ones() 方法

♥1.创建用1 填充的数组

import numpy as np

n = np.ones((3,3), np.uint8)
print(n)

运行结果:

[[1 1 1]
 [1 1 1]
 [1 1 1]]

randint() 方法

⭐参数:randint(low, high, size)

♥1.创建随机数组

import numpy as np

n1 = np.random.randint(1, 3, 10)
print('随机生成 10 个 1 ~ 3 且不包括 3 的整数:')
print(n1)
n2 = np.random.randint(5, 10)
print('size 数组大小为空随机返回一个整数:')
print(n2)
n3 = np.random.randint(5, size=(2,5))
print('随机生成 5 以内二维数组:')
print(n3)

运行结果:

随机生成 10 个 1 ~ 3 且不包括 3 的整数:
[1 1 2 2 1 2 1 1 2 1]
size 数组大小为空随机返回一个整数:
8
随机生成 5 以内二维数组:
[[2 2 2 2 1]
 [3 0 0 3 2]]

二、操作数组

1.加减乘除法运算

import numpy as np

print(n1 + n2)
print(n1 - n2)
print(n1 * n2)
print(n1 / n2)

运行结果:

[4 6]
[-2 -2]
[3 8]
[0.33333333 0.5       ]

2.幂运算

import numpy as np

n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 ** n2)

运行结果:

[ 1 16]

3.比较运算

import numpy as np

n1 = np.array([1,2])
n2 = np.array([3,4])
print(n1 >= n2)
print(n1 == n2)
print(n1 <= n2)
print(n1 != n2)

运行结果:

[False False]
[False False]
[ True  True]
[ True  True]

4.复制数组

import numpy as np

n1 = np.array([1,2])
n2 = np.array(n1, copy=True) # 第一种方法
n3 = n1.copy() # 第二种方法
print(n3 == n2) #比较两个数组是否相同
n3[0] = 9 # 修改n2数组的第一个元素
print(n3)
print(n1)
print(n2)
print(n3 == n2) #比较两个数组是否相同

运行结果:

[ True  True]
[9 2]
[1 2]
[1 2]
[False  True]

三、数组的索引和切片

1.索引

import numpy as np

n1 = np.array([1,2,3])
print(n1[0])

运行结果:

1

2.切片式索引

import numpy as np

n1 = np.array([1,2,3])
print(n1[0])
print(n1[1])
print(n1[0:2])
print(n1[1:])
print(n1[:2])

运行结果:

1
2
[1 2]
[2 3]
[1 2]

语法:[start:stop:step]

import numpy as np

n = np.array([0,1,2,3,4,5,6,7,8,9])
print(n)
print(n[:3])
print(n[3:6])
print(n[6:])
print(n[::])
print(n[:])
print(n[::2])
print(n[1::5])
print(n[2::6])

# start stop step 为负数时
print(n[::-1])
print(n[:-3:-1])
print(n[-3:-5:-1])
print(n[-5::-1])

运行结果:

[0 1 2 3 4 5 6 7 8 9]
[0 1 2]
[3 4 5]
[6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 2 4 6 8]
[1 6]
[2 8]
[9 8 7 6 5 4 3 2 1 0]
[9 8]
[7 6]
[5 4 3 2 1 0]

3.二维数组索引

参数:array[n, m],表示第n个数组的第m个元素

import numpy as np

n = np.array([[0,1,2,3], [4,5,6,7], [8,9,10,11]])
print(n)
print("----------------")
print(n[1])
print(n[1,2]) # 索引1 数组 的索引2 个元素
# 或
print(n[1][2]) # 索引1 数组 的索引2 个元素
print(n[-1]) # 索引-1 数组

运行结果:

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
----------------
[4 5 6 7]
6
6
[ 8  9 10 11]

4.二维数组切片式索引

import numpy as np

n = np.array([[1,2,3], [4,5,6], [7,8,9]])
print(n)
print("----------------")
print(n[:2, 1:])
print(n[1, :2])
print(n[:2, 2])
print(n[:, :1])

运行结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]
----------------
[[2 3]
 [5 6]]
[4 5]
[3 6]
[[1]
 [4]
 [7]]

四、创建图像

1.创建黑白图像

1.1 创建纯 黑 图像

import cv2 as cv
import numpy as np

width = 200
height = 100
# 创建指定宽高、单通道、像素值都为 0 的图像
img = np.zeros((height,width), np.uint8)
cv.imshow("img", img)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

915467d9e34048c1bd8c5ddc8b34ca05.png

1.2 创建纯 白 图像

import cv2 as cv
import numpy as np

width = 200
height = 100
# 创建指定宽高、单通道、像素值都为 1 的图像
img = np.ones((height,width), np.uint8)*255
cv.imshow("img", img)
cv.waitKey()
cv.destoryAllWindows()

运行结果:

ac59831a93b54d368b63827906fdd2e6.png

1.3 在黑图像内部创建白色图像

import cv2 as cv
import numpy as np

width = 200
height = 100
# # 创建指定宽高、单通道、像素值都为 0 的图像
img = np.zeros((height,width), np.uint8)
# 将图像纵坐标为 25~75 、横坐标为 50~100 的区域修改为白色
img[25:75, 50:100] = 255
cv.imshow("img", img)
cv.waitKey()
cv.destoryAllWindows()

运行结果:

20f8d4fe93f4486c8bb00ed50eaaf2a6.png

1.4 创建黑白相间的图像

import cv2 as cv
import numpy as np

width = 200
height = 100
# 创建指定宽高、单通道、像素值都为 0 的图像
img = np.zeros((height,width), np.uint8)
for i in range(0, width, 40):
    img[:, i:i+20] = 255      # 白色区域的宽度为20
cv.imshow("img", img)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

49518a0baad4436b911debc268b39515.png

2.创建彩色图像

import cv2 as cv
import numpy as np

width = 200
height = 100
# 创建指定宽高、3 通道、像素值都为 0 的图像
img = np.zeros((height,width, 3), np.uint8)
blue = img.copy()
blue[:, :, 0] = 255 # 1 通道所有的像素都为 255
green = img.copy()
green[:, :, 1] = 255 # 2 通道所有的像素都为 255
red = img.copy()
red[:, :, 2] = 255 # 3 通道所有的像素都为 255
cv.imshow("blue",blue)
cv.imshow("green",green)
cv.imshow("red",red)
cv.waitKey()
cv.destroyAllWindows()

运行结果: 

d0942dd30bb0418ca8a2e02d29c1cb72.png

3.创建随机图像

random.randint() 方法

import cv2 as cv
import numpy as np

width = 200
height = 100
# 创建指定宽高、单通道、随机像素值的图像,随机值在 0~256 ,数字为无符号 8 位整数
img = np.random.randint(256, size=(height,width), dtype=np.uint8) # 黑白图像
# 创建指定宽高、3 通道、随机像素值的图像,随机值在 0~256 ,数字为无符号 8 位整数
img2 = np.random.randint(256, size=(height,width, 3), dtype=np.uint8) # 彩色图像
cv.imshow("img", img)
cv.imshow("img2", img2)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

1a12b318890848f9829e82db7ab503c6.png

五、拼接图像

1.水平拼接数组

hstack() 方法

import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.hstack((a,b,c))
print(result)

运行结果:

[1 2 3 4 5 6 7 8 9]

2.垂直拼接数组

vstack() 方法

import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.vstack((a,b,c))
print(result)

运行结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]]

3.在图像处理中的应用

import cv2 as cv
import numpy as np

img = cv.imread(r'stone.jpg')

img_h = np.hstack((img, img))
img_v = np.vstack((img, img))

cv.imshow("img_h", img_h)
cv.imshow("img_v", img_v)
cv.waitKey()
cv.destroyAllWindows()

运行结果:

9987ab1498634d6789cca6547fc2016a.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值