Отображение первого элемента в матрице ячеек из 3 элементов

#numpy #image-processing

#numpy #обработка изображений

Вопрос:

TL; DR:
учитывая np.массив формы (M, N,3), каков наиболее эффективный способ изменить первый элемент в каждом из значений [M, N]?

Здравствуйте,

В рамках курса обработки изображений, который я прохожу, мне нужно вручную выполнить квантование изображения. Если мои входные данные представлены в RGB формате, мне сначала нужно преобразовать его в YIQ формат, а затем выполнить квантование по Y значениям. В этом процессе я создаю таблицу, которая отображает каждое значение Y в новое значение, Y' . Далее мне нужно создать изображение той же формы со Y' значениями вместо Y , и теми же значениями для I и Q . Наконец, я преобразую новое изображение Y'IQ обратно в RGB формат.

У меня возникли проблемы в процессе отображения. У меня уже есть таблица, которая относится Y к Y' , но я не преуспел в процессе преобразования.

Мое изображение имеет плавающий формат с формой (12,13,3) (например). Мне нужно преобразовать только первый элемент в каждой ячейке (который состоит из 3 элементов).

Я использовал следующий цикл

 for n in range(0, imgYIQ.shape[0]):
    for j in range(0, imgYIQ.shape[1]):
        imgYIQ2[n, j][0] = (1 / 255) * Ttable['h(v)'][Ttable['v'] == imgYIQ2[n, j, 0]]

  

Где Ttable находится таблица, которая отображает любое значение Y into Y' . Я использовал цикл, потому что хотел указать на изображение старое значение ( [Ttable['v'] == imgYIQ2[n, j, 0]] ).

Есть ли способ сделать этот процесс векторизованным?

Комментарии:

1. Если ваши каналы I и Q остаются неизменными, и вы преобразуете только Y, рассматривали ли вы возможность разделения каналов или создания представления только для канала Y?

2. Большое вам спасибо, это сработало и сэкономило мне много вычислительного времени!

Ответ №1:

Я пошел с подходом Марка Серчелла. Сначала я превратил свой массив (h, w, d) в массив (h, w, d). В моем случае результат был (hw,3). Затем превратил массив (h8 w,3) в (hw,3) pd.DataFrame.
Имея уже таблицу сопоставления, мне оставалось только использовать pd.merge(., sort = False) , проверить, что порядок исходного массива (hw,3) остался прежним (я проверяю его, используя тот факт, что YIQ .loc[:,1] == Y'IQ .loc[:,1] и YIQ .loc[:,2] == Y'IQ .loc[:,2]).
После того, как у меня был Y'IQ in (hw,3) df, я превратил его в np.array (используя
), а затем изменил получившийся массив в старую форму (h pd.DataFrame.to_numpy ,w,3).