Python Opencv Уменьшить цвета только до RGB - PullRequest
1 голос
/ 06 апреля 2020

Я пытаюсь взять изображение RGB и уменьшить его цвета, чтобы он содержал только красный (255, 0, 0) зеленый (0, 255, 0) и синий (0, 0, 255). Я написал простую функцию, чтобы сделать это для меня, но она кажется очень неэффективной.

def colorReduce(image):
    h, w = image.shape[:2]
    for x in range(h):
        for y in range(w):
            px = image[x][y]
            c = np.argmax(px)
            px = [0, 0, 0]
            px[c]=255
            image[x][y] = px

У кого-нибудь из вас есть идеи для более быстрого метода для этого? Я знаю, что в opencv есть cv2.kmeans, но это тоже не очень эффективно, так как оно намного мощнее, чем мне нужно.

Спасибо вам!

1 Ответ

2 голосов
/ 06 апреля 2020

Вы должны иметь возможность использовать векторизацию Numpy для этого, если вы проведете свой argmax() через третье измерение, то есть через цветовые каналы.

Не проверено, но что-то вроде этого:

# Make array of brightest colour index
m = np.argmax(im, axis=2)

# Make empty results array same shape as original image
res = np.zeros_like(im)

# Where blue is the brightest, make result blue
res[m==0] = [255,0,0]

# Where green is the brightest, make result green
res[m==1] = [0,255,0]

# Where blue is the brightest, make result blue
res[m==2] = [0,0,255]  

Я думаю, что это более кратко:

import cv2
import numpy as np

# Load image
im = cv2.imread('colorwheel.jpg')

# Find index of brightest channel at each point
m = np.argmax(im,axis=2) 

# Set up possible choices for output colour
choices = [[255,0,0],[0,255,0],[0,0,255]]

# Choose one of the 3 colours based on whichever was brightest
res = np.choose(m[...,np.newaxis],choices)

# Save
cv2.imwrite('result.png',res) 

Исходное изображение:

enter image description here

Результат:

enter image description here

Ключевые слова : Python, обработка изображений, простое квантование, применение цветовой карты, палитра, LUT, поиск, np. выбрать.

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