【问题标题】:Problems Converting Numpy/OpenCV Array Image into a Wand Image将 Numpy/OpenCV 数组图像转换为 Wand 图像的问题
【发布时间】:2020-06-29 14:05:09
【问题描述】:

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

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

经过一番搜索,我发现了这篇 StackOverflow 帖子 Inverse transform an image from Polar to Cartesian in OpenCV 有一个非常相似的问题,其中发帖人似乎已经通过使用 Python Wand 库 (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 会自动给出错误的“粉丝形象”。以前是否有人熟悉 Wand 库的此类问题,如果是,请问有什么推荐的解决方案来解决此问题?

如果这个问题没有很快解决,我有一个使用 OpenCV 的 cv::remap 函数 (https://docs.opencv.org/4.1.2/da/d54/group__imgproc__transform.html#ga5bb5a1fea74ea38e1a5445ca803ff121) 的备用备份。然而,问题在于我不确定使用什么映射数组(即map_x 和map_y)来执行极坐标->笛卡尔变换,因为使用实现以下变换方程的映射矩阵:

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

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

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

- 尼克S

编辑我也尝试过另一个图像示例,但它仍然显示出类似的问题。所以首先,我使用 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 将它们转换为正确的图像。

【问题讨论】:

    标签: python-3.x numpy opencv image-processing wand


    【解决方案1】:

    我需要将 numpy 转换为我缺少的 Wand Image 的步骤吗?

    没有,但是 Wand 0.5.x 中 Wand 的 Numpy 实现存在一个错误。 OpenCV的ndarray的shape是(ROWS, COLUMNS, CHANNELS),但是Wand的ndarray是(WIDTH, HEIGHT, CHANNELS)。我相信这已经在未来 0.6.x 版本中得到修复。

    如果是这样,它会是什么?建议的方法是什么?

    在传递给 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)
    

    【讨论】:

    • 抱歉来晚了,但这确实帮助解决了我的问题。非常感谢您的回答,因为我不知道 Wand 有这样的问题。
    • 关于应该解决此类问题的未来 Wand 版本,您是否知道此类版本何时发布 @emcconville?只是一个简单的问题,呵呵
    猜你喜欢
    • 2016-03-17
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    • 2018-07-21
    • 2018-08-22
    • 2017-06-25
    相关资源
    最近更新 更多