#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).