将 Numpy/OpenCV 数组图像转换为魔杖图像时出现问题

Problems Converting Numpy/OpenCV Array Image into a Wand Image

我目前正在尝试执行极坐标到笛卡尔坐标图像的转换,以将原始声纳图像显示为 'fan-display'。

最初我有一个 np.float64 类型的 Numpy 数组图像,如下所示:

经过一番搜索,我发现了这个 Whosebug post Inverse transform an image from Polar to Cartesian in OpenCV with a very similar problem, in which the poster seemed to have solved his/her issue by using the Python Wand library (http://docs.wand-py.org/en/0.5.9/index.html),特别是使用了他们的失真函数集。

然而,当我尝试使用 Wand 并读入图像时,我却用 Wand 得到了下面的图像,它似乎比原来的要小。然而,奇怪的是 img.size 仍然给出与原始图像形状相同的尺寸数字。

此转换的代码如下所示:

print(raw_img.shape)
wand_img = Image.from_array(raw_img.astype(np.uint8), channel_map="I") #=> (369, 256)
display(wand_img)
print("Current image size", wand_img.size) #=> "Current image size (369, 256)" 

这肯定是有问题的,因为 Wand 会自动给出错误的 'fan image'。有没有人以前熟悉 Wand 库的此类问题,如果有,请问解决此问题的推荐解决方案是什么?

如果这个问题不能很快解决,我有一个备用方法,即使用 OpenCV 的 cv::remap 函数 (https://docs.opencv.org/4.1.2/da/d54/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121)。然而,这个问题是我不确定使用什么映射数组(即 map_xmap_y)来执行 Polar->Cartesian 变换,因为使用实现变换方程的映射矩阵下面:

r = polar_distances(raw_img)
x = r * cos(theta)
y = r * sin(theta)

似乎没有用,而是从 OpenCV 中也抛出了错误。

非常感谢任何形式的帮助和对此问题的见解。谢谢!

-尼克斯

EDIT 我也试过另一个图像示例,它仍然显示出类似的问题。所以首先,我使用 OpenCV 将图像导入 Python,使用以下代码行:

import matplotlib.pyplot as plt
from wand.image import Image
from wand.display import display
import cv2

img = cv2.imread("Test_Img.jpg")
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

plt.figure()
plt.imshow(img_rgb)
plt.show()

结果显示如下:

但是,当我继续尝试使用 Wand 打开 img_rgb 对象时,使用以下代码:

wand_img = Image.from_array(img_rgb)
display(img_rgb)

我得到的是以下结果。

我试过直接在文件上使用wand.image.Image()打开图片,使用display()功能时能够正确显示图片,所以我相信没有任何问题系统上的魔杖库安装。

我是否缺少将 numpy 转换为 Wand Image 所需的步骤?如果是这样,它会是什么,建议的方法是什么?

请记住,我强调将 Numpy 转换为 Wand Image 非常重要,原始声纳图像存储为二进制数据,因此需要使用 Numpy 将它们转换为正确的图像。

Is there a missing step that I required to convert the numpy into Wand Image that I'm missing?

不,但是 Wand 0 中 Wand 的 Numpy 实现存在一个错误。5.x。 OpenCV的ndarray的形状是(ROWS, COLUMNS, CHANNELS),而Wand的ndarray是(WIDTH, HEIGHT, CHANNELS)。我相信这已在 未来 0.6.x 版本中修复。

If so, what would it be and what is the suggested method to do so?

在传递给 Wand 之前交换 img_rgb.shape 中的值。

img_rgb.shape = (img_rgb.shape[1], img_rgb.shape[0], img_rgb.shape[2],)
with Image.from_array(img_rgb) as img:
    display(img)