numpy 3d数组图像在转换为2d数组后丢失蓝色值

yhxst69z  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在尝试编写代码,将RGB图像数组(H,W,C)转换为格式为“RGB(r,g,b)"的2D数组,然后将其转换为pandas DataFrame。我的代码几乎可以正常工作,除了一些蓝色值似乎从最终结果中丢失,我不知道为什么。我如何转换数据并维护所有信息?

image = io.imread('px.jpg')

# Convert the 3D array to a 2D array of RGB strings
rgb_strings_array = np.apply_along_axis(lambda row: f"RGB({int(row[0])}, {int(row[1])}, {int(row[2])})", axis=2, arr=image)

# Create a DataFrame with the RGB strings array
df = pd.DataFrame(rgb_strings_array, columns=range(rgb_strings_array.shape[1]))

字符串
输出(在Excel中):


的数据
您可以看到保存的数据中缺少一些蓝色值(这不是Excel问题,因为pandas DataFrame也缺少信息)。

tf7tbtn2

tf7tbtn21#

问题是np.apply_along_axis生成的是一个dtype="<U12"数组,也就是一个12个字符的Unicode。问题是一些RGB字符串比这个长,所以它们被切断了。真的,你不应该使用numpy来处理字符串。解析可以在原生Python中轻松完成,结果仍然可以转换为pandas DataFrame。

import numpy as np
import pandas as pd

rng = np.random.default_rng(42)
image = rng.integers(0, 255, size=(4,4,3))

rbg_strings_array = [[f"RGB({int(pixel[0])}, {int(pixel[1])}, {int(pixel[2])})"
                      for pixel in row]
                     for row in image]
df = pd.DataFrame(rbg_strings_array, columns=range(len(rbg_strings_array)))
print(df)

字符串
测试结果:
| 0 | 1 | 2 | 3 |
| --|--|--|--|
| 0 |RGB(22,197,166)|RGB(111,110,218)|RGB(21,177,51)|
| 1 |RGB(187,194,182)|RGB(200,130,32)|RGB(214,114,127)|
| 2 |RGB(199,164,102)|RGB(209,139,113)|RGB(114,57,23)|
| 3 |RGB(218,211,70)|RGB(161,42,193)|RGB(178,90,17)|

相关问题