将 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_x
和 map_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)
我目前正在尝试执行极坐标到笛卡尔坐标图像的转换,以将原始声纳图像显示为 '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_x
和 map_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)