Проблемы с преобразованием изображения массива Numpy/OpenCV в изображение палочки

В настоящее время я пытаюсь выполнить преобразование полярного изображения в декартово координатное изображение, чтобы отобразить необработанное изображение сонара в «веерном отображении».

Изначально у меня есть образ массива Numpy типа np.float64, который можно увидеть ниже:

введите здесь описание изображения

После некоторого поиска я наткнулся на этот пост StackOverflow преобразовать изображение из полярного в декартово в 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 ранее, и если да, могу ли я спросить, какое рекомендуемое решение для устранения этой проблемы?

Если эта проблема не будет решена в ближайшее время, у меня есть альтернативная резервная копия с использованием функции cv::remap OpenCV (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.

Любая помощь и понимание этого вопроса очень ценятся. Спасибо!

- НикС

РЕДАКТИРОВАТЬ Я также попробовал другой пример изображения, и он по-прежнему показывает аналогичную проблему. Итак, сначала я импортировал изображение в Python с помощью OpenCV, используя следующие строки кода:

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()

который в результате показал следующий дисплей:

введите здесь описание изображения

Однако, когда я продолжил и попытался открыть объект img_rgb с помощью Wand, используя код ниже:

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

Вместо этого я получаю следующий результат.

введите здесь описание изображения

Я попытался открыть изображение, используя wand.image.Image() непосредственно в файле, который может правильно отображать изображение при использовании функции display(), поэтому я считаю, что в системе нет ничего плохого в установке библиотеки палочки.

Есть ли пропущенный шаг, который мне нужен для преобразования numpy в Wand Image, который мне не хватает? Если да, то что это будет и каков предлагаемый метод для этого?

Пожалуйста, имейте в виду, что я подчеркиваю, что преобразование Numpy в изображение Wand очень важно, необработанные изображения сонара хранятся в виде двоичных данных, поэтому необходимо использовать Numpy для преобразования их в правильные изображения.


person Nicholas Sadjoli    schedule 18.03.2020    source источник


Ответы (1)


Есть ли пропущенный шаг, который мне нужен для преобразования numpy в Wand Image, который мне не хватает?

Нет, но есть ошибка в реализации Wand Numpy в Wand 0.5.x. Форма ndarray OpenCV - (ROWS, COLUMNS, CHANNELS), но ndarray Wand - (WIDTH, HEIGHT, CHANNELS). Я полагаю, что это было исправлено в будущих выпусках 0.6.x.

Если да, то что это будет и каков предлагаемый метод для этого?

Поменяйте местами значения в img_rgb.shape перед передачей в Wand.

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)
person emcconville    schedule 20.03.2020
comment
Извините, что поздно, но это действительно помогло решить мои проблемы. Большое спасибо за ваш ответ, так как я не знал, что есть такая проблема с Wand. - person Nicholas Sadjoli; 31.03.2020
comment
Что касается будущих выпусков Wand, которые должны решить эту проблему, есть ли у вас какие-либо идеи о том, когда такие версии выпустят @emcconville? Просто быстрый вопрос, хе-хе - person Nicholas Sadjoli; 31.03.2020