Проблемы преобразования изображения массива Numpy / OpenCV в изображение палочки - PullRequest
0 голосов
/ 18 марта 2020

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

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

enter image description here

После некоторого поиска я наткнулся на этот пост StackOverflow Обратное преобразование изображения из Polar Декартову в OpenCV с очень похожей проблемой, в которой плакат, казалось, решил свою проблему, используя библиотеку Python Wand (http://docs.wand-py.org/en/0.5.9/index.html), в частности, используя их набор Функции искажения.

Однако, когда я попытался использовать Wand и прочитать изображение, я вместо этого закончил тем, что Wand получил изображение ниже, которое кажется меньшим, чем оригинальное. Однако странно то, что img.size по-прежнему дает тот же номер размера, что и форма исходного изображения.

enter image description here

Код для этого преобразования может быть см. ниже:

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

Это определенно весьма проблематично c, поскольку 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.

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

- NickS

EDIT Я пробовал и на другом примере изображения, и он все еще показывает аналогичную проблему. Итак, во-первых, я импортировал изображение в 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()

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

enter image description here

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

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

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

enter image description here

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

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

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

1 Ответ

0 голосов
/ 20 марта 2020

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

Нет, но в Wand's 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)
...