前言
网上看到一篇证件照换底色的代码,尝试了以下,效果还可以,但是对np.ndarray()函数不怎么理解,于是我在网上查看好久,很多都是零零散散的,要么对格式不了解,要么对返回类型不了解,于是在我看了将近30个网页后我决定自己写一篇( •̀ ω •́ )✧
至于这么多参数是干嘛的,我也不像了解哈哈哈,不过使用array函数,从常规的python列表或者元组中创建数组,元素的类型由原序列中的元素类型确定。
1.读入数据
当我们利用cv2读入一张图片时,cv2.imread()返回类型为 <class ‘numpy.ndarray’> 当时我想我可以利用numpy.ndarray()构造函数画一张纯色图
import cv2
# 读取照片
img=cv2.imread('D:\\Patrick_Star.jpg')#派大星
print(img)
# 输出结果为<class 'numpy.ndarray'>
2.np.ndarray()构造函数
np.ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
参数详细说明
ndarray是一个类,其默认构造函数是ndarray()。
array是一个函数,便于创建一个ndarray对象。
np.ndarray()构造函数相对更low-level一些,使用默认构造函数创建的ndarray对象的数组元素是随机值,而numpy提供了一系列的创建ndarray对象的函数,array()就是其中的一种;通常使用这些上层一点的函数来构造ndarray对象会更方便一些。
img1 = np.ndarray([300,300,3])
print(type(img1))# 输出为<class 'numpy.ndarray'>
print(img1.shape)# 输出为(300, 300, 3)
cv2.imshow('img',img1)
cv2.waitKey(0)
画了一张300*300,通道数为3的纯黑图
3.np.array()函数
numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
#将列表转换为数组
array = np.array([[1,2,3],[4,5,6]])
array = np.array([1, 2, 3.0])
# 输出 array([ 1., 2., 3.])
array = np.array([1, 2, 3], ndmin=2)
# 输出 array([[1, 2, 3]])
但是此时你会发现运行后报错了:error: (-215:Assertion failed) src_depth != CV_16F && src_depth != CV_32S in function ‘convertToShow’
#300行300列的列表
list = []
for i in range(300):
list.append([36, 27, 237])
img2 = []
for i in range(300):
img2.append(list)
img2=np.array(img2)
print(type(img2))#输出为<class 'numpy.ndarray'>
print(img2.shape)#输出为(300, 300, 3)
cv2.imshow('img',img2)
cv2.waitKey(0)
5.报错原因
至于为什么我又查了一下:次像素的数据格式有要求,可以指定dtype=np.uint8或者dtype=np.float32,所以稍微改一下就可以生成一张红色图片了
m = np.array([[1,2,3], [2,3,4]]) # 定义矩阵,int32
m = np.array([[1,2,3], [2,3,4]], dtype=np.float) # 定义矩阵,float64