opencv 图像属性

文章详细介绍了如何使用numpy和OpenCV处理图像,包括获取图像的行数、列数和通道数,理解ndarray的shape、itemsize、nbytes属性,以及转换数据类型对内存占用的影响。还探讨了numpy创建数组的各种方法如arange、linspace、zeros、ones、empty和full,以及随机数生成函数。最后,文章展示了如何通过切片访问和修改图像像素值。
摘要由CSDN通过智能技术生成

1.

图像行列数,通道数(shape属性)
一个图像像素的行列数(高、宽)、通道数可以通过shape属性获取,需要注意的是numpy数组的shape属性下标0表示的图像的行数(rows,高),下标1表示的是列数(cols,宽),下标2表示的是通道数,但是如果是灰度图shape是一个二元组,则不存在下标2的元素。(行列,高宽,01)

import numpy as np
import cv2

img = cv2.imread('..\\opencv-logo.png')
print('img.shape',img.shape)
rows = img.shape[0]
cols = img.shape[1]
channel = img.shape[2]
print('rows=%d,cols=%d,channel=%d'%(rows,cols,channel))
cv2.imshow('juzicode.com',img)
cv2.waitKey()

2

nbytes,size,itemsize 属性
在OpenCV-Python对外接口里图像用numpy数组表示,所以numpy数据的属性同样适用于OpenCV-Python中图像的属性。

#原图方式
img = cv2.imread('..\\opencv-logo.png',cv2.IMREAD_UNCHANGED)
print('img.ndim=',img.ndim) #维度,也是其shape属性的长度=len(shape)
print('img.itemsize=',img.itemsize) #单个数据长度
print('img.size=',img.size) #总长度,有多少个数据
print('img.nbytes=',img.nbytes) #占用的内存空间=itemsize*size
print('img.dtype=',img.dtype) #数据类型,字符串形式
print('img.shape=',img.shape) #形状,是一个tuple
print('img.data=',img.data) #数据buffer

3

.dtype属性
dtype属性描述的是numpy数组中数据类型,可以通过astype进行转换后看到dtype的变化,以及因为dtype变化引起itemsize相关属性的变化。

转换
print('转换为float64')
img = img.astype(np.float64)
#print(img[150:200,200:250])
print('img.ndim=',img.ndim) #维度,也是其shape属性的长度=len(shape)
print('img.itemsize=',img.itemsize) #单个数据长度
print('img.size=',img.size) #总长度,有多少个数据
print('img.nbytes=',img.nbytes) #占用的内存空间=itemsize*size
print('img.dtype=',img.dtype) #数据类型,字符串形式
print('img.shape=',img.shape) #形状,是

一个tuple
print(‘img.data=’,img.data) #数据buffer

4.numpy数组

numpy.arange()方法会生成一个按照区间范围分布的一维数组

numpy.arange([start, ]stop, [step, ]dtype=None)

1.如果只有1个位置参数,表示传入的是stop,将会生成从从0开始到 stop-1步长为1的一维数组 ,数值在不包括stop在内的[1,stop)左闭右开区间内 ;

2.如果有2个位置参数,表示传入的是start和stop,将会生成从start到stop-1步长为1的一维数组,数值在不包括stop在内的[start,stop)左闭右开区间内;

3.如果有3个位置参数,表示分别传入的是start、stop和step,将会生成从start到stop-1步长为1的一维数组,数值在不包括stop在内的[start,stop)左闭右开区间内。

numpy.linspace()方法可以创建一个一维数组:

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)

1.第1和第2个位置参数声明区间范围 ,默认左闭右闭[start,stop];

2.默认参数num为数组的长度或者说包含的元素个数;

3.如果endpoint=False,表示生成的数组其数值范围为[start,stop),这个时候数组的步长和endpoint=True是有差异的。

4.如果resstep=True,除了返回构造的数组,还会返回步长,返回的是一个元组:(array, step)。

np.array()可以创建一个n维数组

numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)

第1个位置参数是一个list或者tuple,如果要表示多维数组,就在该list或者tuple内部再嵌套list或者tuple。dtype参数声明其数据类型。

np.zeros()返回一个数值全0的数组:

numpy.zeros(shape, dtype=None, order='C')

第1个位置参数传入shape。dtype参数声明其数据类型。

np.ones()生成全1的数组:

numpy.ones(shape, dtype=None, order='C')

第1个位置参数传入shape。
dtype参数声明其数据类型。

numpy.empty()方法创建一个未初始化的数组:

numpy.empty(shape, dtype=float, order='C')

第1个位置参数传入shape。
dtype参数声明其数据类型。

创建全部为其他某个值就可以使用numpy.full()方法

numpy.full(shape, fill_value, dtype=None, order='C')

第1个位置参数传入shape。
第2个位置参数传入设置的值。
dtype声明其数据类型。

numpy.eye()创建对角线全为1的二维数组:

numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C')

第1个位置参数N根据M是否传值决定,如果M没有传值,表示要创建一个行列数值都为N的二维数组,如果M传值,N表示要创建数组的行数;
M如果传入表示要创建二维数组的列数。
k表示从第1行开始的对角线起始位置,默认是0,表示从左上角第1个元素开始。
dtype表示数据类型。

np.random.random()np.random.random_sample()的别名,二者效果一样,创建一个随机数数组,取值范围在[0.0, 1.0)的左闭右开区间:

numpy.random.random(size=None)
#a = np.random.random(size=(3,5))

size参数表明数组的形状。如果size不传入,生成单个随机浮点数。

np.random.rand()创建一个随机数数组,取值范围在[0.0, 1.0)的左闭右开区间:

numpy.random.rand(d0, d1, ..., dn)
#b = np.random.rand(3,5,2)

注意该方法的入参,不同于np.random.random()传入一个tuple作为size,而是直接传入0到多个整数作为其shape参数,当不传入参数时,生成一个随机浮点数。rand()方法实际是random_sample()的一种封装形式。

np.random.randint()创建一个随机整数型数组:

numpy.random.randint(low, high=None, size=None, dtype=int)
#b = np.random.randint(3,10,size=(3,5))

第一个位置参数low是必须的,如果传入high,返回的数据范围是[low,high)的左闭右开区间内的随机整数,如果没有传入high,返回的数据范围是[0,low)的左闭右开区间内的随机整数。
size传入数组的shape属性。
dtype传入数据类型,只能是int、或者字符串形式的’int8’、’int32’等numpy整数类型。

np.random.randn()生成正态分布的随机数:

numpy.random.randn(d0, d1, ..., dn)

入参为传入的数组形状,多少维度就传入多少个int,和np.random.rand()一样。

像素操作

1.切片法访问:同样的如果要访问的是多行多列的元素值,可以使用切片方法访问,第0个下标是行数的切片,第1个下标是列数的切片,比如要访问下图中第4-6行,第5-10列的元素,则要使用img[4:7,5:11]的方法
2.像素值读取:下面这个例子获取y坐标100~200,x坐标200~300的像素值:

import cv2
img = cv2.imread('..\\opencv-logo.png')
pixel=img[100:200,200:300]
print('pixel.shape:',pixel.shape)
print('img[100:200,200:300]:',pixel) 

3.像素值修改:

import cv2
img = cv2.imread('..\\opencv-logo.png')
img[270:560,0:300]=255
cv2.imshow('jd9.com',img)
cv2.waitKey(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值