Как перебрать все пиксели в изображении и сравнить их значения RGB с другим значением RGB без использования цикла for? - PullRequest
1 голос
/ 03 июня 2019

Итак, в основном у меня есть массив с 16 цветовыми значениями RGB, и мне нужно вычислить расстояние между значением RGB пикселя во входном изображении и всеми этими 16. Значение RGB с меньшим расстоянием будет значение RGB в выходном изображении.

Проблема в том, что я использую вложенные циклы for для выполнения этих операций, и это ДЕЙСТВИТЕЛЬНО медленно. Выдержка в следующем порядке:

for i in range (row):
        for j in range (columns):
            pixel = img[i, j]
            for color in colorsarray:
                dist.append(np.linalg.norm(pixel - color))
            img[i,j] = colorsarray[dist.index(min(dist))]
            dist.clear()

Есть ли полезная функция, которая может помочь мне оптимизировать это?

Ответы [ 2 ]

0 голосов
/ 03 июня 2019

Не проверено, но вы можете попробовать векторизовать свою функцию:

# reshape to have 1D array
dimx = image.shape[0]
image = image.reshape(-1, 3)

def f(pixel):
    # TODO here: logic to return, given the pixel, the closest match in the list

# vectorize the function and apply it to the image
image = np.vectorize(f)(image)

# set the shape back to original
image = image.reshape( dimx, -1, 3 )
0 голосов
/ 03 июня 2019

Вы можете рассчитать расстояния, передавая массивы.

Если ваше изображение имеет форму (x, y, 3), а ваша палитра имеет форму (n, 3), то вы можете рассчитать расстояние между каждымпиксель и каждый цвет в виде массива с формой (x, y, n):

# distance[x,y,n] is the distance from pixel (x,y) to
# color n
distance = np.linalg.norm(
    img[:,:,None] - colors[None,None,:], axis=3)

Индекс : означает «всю ось», а индекс None означает «передать значение вдоль этогоaxis ".

Затем вы можете выбрать ближайший индекс цвета:

# pal_img[x,y] is the index of the color closest to
# pixel (x,y)
pal_img = np.argmin(distance, axis=2)

Наконец, вы можете преобразовать обратно в RGB:

# rgb_img[x,y] is the RGB color closest to pixel (x,y)
rgb_img = colors[pal_img]

Это показывает, как выне нужны специальные функции в NumPy.К сожалению, это может быть немного трудно понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...