3 - Open CV中Numpy数组的相关操作

1.遍历读取图像的每个像素点,打印出属性值

示例代码如下:

# 遍历读取图片的每一个像素点,打印出其属性值
def access_pixels(image):
    print(image.shape)
    height = image.shape[0]
    width = image.shape[1]
    channels = image.shape[2]
    print("width:%s,height:%s,channels:%s"% (width,height,channels))
    
    
print("----------- Hello Guyan -----------")
src = cv.imread('./images/handsomeboy01.jpg')
cv.namedWindow("Image Windows01",cv.WINDOW_AUTOSIZE)
cv.imshow("Image Windows01",src)
access_pixels(src)
cv.waitKey(0)
cv.destroyAllWindows()

2.并且可以在定义的函数执行之前,统计函数运行结束所用的时间,这个时候就要用到以下两个函数了。
(1)getTickCount():返回从操作系统启动到当前所经过的计时周期数
(2)getTickFrequency()函数用于返回CPU的频率
t1 = cv.getTickCount()
access_pixels(src)
t2 = cv.getTickCount()
time = (t2 - t1) / cv.getTickFrequency()
print('当前所用的时间为:%s ms' % (time*1000))
cv.waitKey(0)
cv.destroyAllWindows()

2.创建一张图像

1.创建一个多通道的图像,并且dtype类型为np.uint8.

在这里我们创建了三通道的长宽为400的图像,并且我们可以为每一个通道的像素点进行修改。

示例代码如下:

def create_image():

    #1.创建一个多通道的8位图像进行显示,
    #修改图片的像素点的值
    # 创建一个三通道的长宽为400,并且dtype类型为np.uint8
    img = np.zeros([400,400,3],np.uint8)

#     但是我们同样可以对创建的图片的每一个像素点进行修改,
#     对第一个通道的像素点进行修改,
    img[:,:,0] = np.ones([400,400])*255

#     此时就已经可以进行显示了
    cv.imshow('Image Windows02',img)
    
    
# getTickCount()返回从操作F系统启动到当前所经过的计时周期数
t1 = cv.getTickCount()
# 此时就只是调用自己创建图片的函数create_image()
create_image()
t2 = cv.getTickCount()
# getTickFrequency()函数,用于返回CPU的频率,
# (getTickCount1 - getTickCount2)/getTickFrequency():
# (当前次数 - 开始计时次数) / 每秒钟重复次数 = 等于从开始到当前所用的时间。
time = (t2 - t1) / cv.getTickFrequency()

# 注意这里一定要带上括号,要不然就会将当前是所用的时间打印1000次
# print('当前所用的时间为:%s ms' % time*1000)
print('当前所用的时间为:%s ms' % (time*1000))
cv.waitKey(0)
cv.destroyAllWindows()

2.创建一个单通道的8位的图像进行显示

在这里我们将会使用两种初始化图像的方法进行举例。
(1)其中一种就是可以将图像初始化为每个像素点为0,之后就可以通过加减的操作对图像的像素点进行处理。
(2)另外一种就是将所有的像素点都初始化为1,之后就可以对像素点进行乘除的操作,进行改变像素点的大小。
注意,在创建单通道图像时,也要加上通道数1,要不然会认为是二维,并且会报错:ndexError: too many indices for array.

示例代码如下:

def create_image():
# 1. 初始化的时候,使用0,进行初始化
    img = np.zeros([400,400,1],np.uint8)
    # # 127就是灰度图像
    img[:, :, 0] = np.ones([400,400])*127
    <!--显示图像-->
    cv.imshow("Image windows03",img)

    # 2. 初始化的时候使用1进行初始化,会更加灵活一点
    img = np.ones([400,400,1],np.uint8)

    # 得到的是灰度图像
    img1 = img*127

    # 得到的是黑色图像
    img2 = img*0

    # 显示图像
    cv.imshow("Image Windows04",img1)
    cv.imshow("Image Windows05",img2)

    # 保存图像到本地dist/images/turtor_01/img_127.jpg和img_0.jpg
    cv.imwrite('./dist/images/turtor_01/img_127.jpg',img1)
    cv.imwrite('./dist/images/turtor_01/img_0.jpg',img2)
    
    
# getTickCount()返回从操作F系统启动到当前所经过的计时周期数
t1 = cv.getTickCount()
# getTickCount()函数,返回从操作系统启动到当前的计时周期数

# 此时就只是调用自己创建图片的函数create_image()
create_image()

t2 = cv.getTickCount()
# getTickFrequency()函数,用于返回CPU的频率,
# (getTickCount1 - getTickCount2)/getTickFrequency():
# (当前次数 - 开始计时次数) / 每秒钟重复次数 = 等于从开始到当前所用的时间。
time = (t2 - t1) / cv.getTickFrequency()

# 注意这里一定要带上括号,要不然就会将当前是所用的时间打印1000次
# print('当前所用的时间为:%s ms' % time*1000)
print('当前所用的时间为:%s ms' % (time*1000))
cv.waitKey(0)
cv.destroyAllWindows()

3.初始化多维数组

在以后进行图像处理时,如果有浮点类型的,一定要用浮点类型的,为了避免数据被截断。
m1 = np.ones([3,3],np.float)
    m1.fill(12.33)
    print(m1)

    m2 = m1.reshape([1,9])
    print(m2)
我们可以使用reshape()函数进行转换数组的维度
reshape()函数只是改变的数据的表示形式,但是并不会改变数据。
注意:Numpy数组操作的属性:data、dtype、size、shape、len,对于图像来说就是遍历图像中的每个像素点,可以修改像素点的值。
发布了76 篇原创文章 · 获赞 2 · 访问量 2772

猜你喜欢

转载自blog.csdn.net/zjy123078_zjy/article/details/103552621
今日推荐