【问题标题】:How can I extract the image pixels from 2D numpy array?如何从 2D numpy 数组中提取图像像素?
【发布时间】:2021-08-23 19:53:54
【问题描述】:

我有一个形状为 (100000, 20) 的矩阵,它由 20 个图像组成,每个图像的大小为 (500 *200)。我只需要知道如何提取这些像素以便获得image shape of (500, 200)? 我试过matrix[:,:,19],但似乎我只是抓住了最后一个特性的值,只是这不是我的目标。此外,当我尝试使用cv2_imshow(matrix[:,:,19] 显示它时,它返回一个黑色图像。

有什么帮助吗?

【问题讨论】:

  • 这里不是专家,但就像您以某种方式扁平化图像一样。您应该将数组重塑为 (500,200,20) 吗?还是我错了?
  • 是的,当然。这是我在matrix[:,:,19] 之前所做的
  • matrix[:,:,19] 不适用于 (1000000,20) 数组。我们不必猜测或推断您首先进行了重塑。但是,关于“最后一个功能”的讨论是什么?这是 20 个图像还是 20 个特征?如果您不了解数组中的内容,我们将无法帮助您。
  • 实际上,我有 (500,200,20) 其中 (500*200) 是样本,20 是特征。特征不应该代表图像吗?不是 20 二维图像的情况吗?请原谅我的误解,如果您能帮助我理解它们之间的区别,我将不胜感激。

标签: python numpy multidimensional-array


【解决方案1】:

你只需要重塑它:

import numpy as np

# after loading the images in a numpy array called imgs_array
imgs_array = imgs_array.reshape((500,200,20))

编辑: 如果要在 reshape 步骤后提取单个图像,只需执行 single_img = imgs_array[:,:,n] 其中n 是数组中的第 n 个图像

【讨论】:

  • 谢谢hrmello,你知道为什么当我尝试用cv2_imshow(imgs_array[:,:,1])显示它时,它返回一个黑色图像吗?
  • 如果 imgs_array 只有两个维度,即 (100000,20),使用 imgs_array 应该会产生错误,因为您正在尝试对三个维度进行切片。也许 cv2_imshow 只是忽略了这个错误并且什么都不返回(然后绘制黑色图像)。但是,如果 imgs_array 已经重新整形为 (500,200,20),它应该可以正常工作。如果你做imgs_array[:,:,1].shape,结果是什么?顺便说一句,如果它对您有用,请不要忘记接受这个或任何其他答案。
  • @hmello 但我们如何知道 reshape 是否得到正确的(我们称之为像素)像素顺序?我们不知道矩阵是如何创建的,所以 reshape 只是给了我们正确尺寸的图像,但可能不是正确的?还是不?
  • @pippo1980 我只是假设图像是按顺序“堆叠”的,也就是说,从 0 到 199 的条目将成为第一行,200 到 399 的条目将成为第二行,依此类推。如果是这种情况,那么 reshape 将按正确的顺序放置它。我自己也遇到过几次这样的数据,并且在这两个数据中,条目都是正确排序的。例如。创建一个新数组 a = np.arange(125) ,检查它的样子,然后使用 a.reshape(5,5,5) 可视化 reshape 的工作原理。
【解决方案2】:

这里我尝试使用 reshape:



#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sun Jun  6 16:43:48 2021

@author: Pietro

https://stackoverflow.com/questions/67859613/how-can-i-extract-the-image-pixels-from-2d-numpy-array?noredirect=1#comment119943691_67859613

"""

import numpy as np

import cv2 as cv

image_mia = np.random.choice([0,255] , (100000,20))

print(image_mia.shape) # sono le dimensioni, dimensions 

print(image_mia)

print('\n',image_mia.size)



image_mia2 = np.copy(image_mia)

print(image_mia2.shape) # sono le dimensioni, dimensions 

print(image_mia2)

print('\n',image_mia2.size)

image_mia2 = image_mia2.reshape(500,200,20)

print(image_mia2.shape) # sono le dimensioni, dimensions 

print(image_mia2)

print('\n',image_mia2.size)

img = 0

image_list = []

while img<20:
    image_list.append(image_mia2[:,:,img])
    img +=1

print(image_list)

for y,i in enumerate(image_list):
    print('\nshape : ',i.shape,'    size : ', i.size)
    
    cv.imwrite(str(y)+'.png',i.astype(np.uint8))

print('\nlenght :  ',len(image_list))

没有代码或输入图像,我尽力猜测

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 2019-01-21
    • 1970-01-01
    • 2020-03-28
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多