Измените определенный диапазон цветов на другой цвет в CV2 или PIL - PullRequest
1 голос
/ 27 мая 2020

У меня есть изображение, как показано ниже

На этом изображении я хочу преобразовать желтые числа в BLACK цвета и RED регионы в серые. Уже черные и серые области менять не нужно. Как мне это сделать? Кто-нибудь может помочь? Я посмотрел на несколько вопросов, но не могу понять. Кроме того, поскольку желтый и красный цвета не совсем одинаковы, но находятся в диапазоне, я не могу выполнить прямую замену цветов. CV2 или PIL, оба в порядке.

Если необходимо использовать значения HSV, дайте мне знать, как определить диапазон. Эти вопросы были заданы, и некоторые ответы уже есть, но я не могу их ответить asp, поэтому любые дополнительные инструкции будут полезны

enter image description here

Ожидаемый результат - это что-то вроде pi c ниже (созданного путем рисования пикселей в GIMP). Не совсем то, что вы видите, но вы понимаете, что я ищу.

enter image description here

Обновление Решение, которое я закончил до использования, как показано ниже. Это сделало все желтые буквы черными, и этого для меня было достаточно (я думаю, при подобном подходе все красные области тоже можно было бы сделать серыми)

img = Image.open('Testpic.jpg').convert('RGB')

roi = img.crop((652,125,697,295))
orig_color1 = (210,140,0)
orig_color2 = (210,210,210)

replacement_color = (4,4,4)
roi = roi.resize((288, 1014), Image.ANTIALIAS)
data = np.array(roi)
data[((data >= orig_color2)).all(axis = -1)] = (255,0,0)
data[((data >= orig_color1)).all(axis = -1)] = replacement_color
data[((data == (255,0,0))).all(axis = -1)] = (255,255,255)

img2 = Image.fromarray(data, mode='RGB')

1 Ответ

2 голосов
/ 27 мая 2020

Ваше изображение не самого лучшего качества, и ваши результаты должны улучшиться, если вы сможете получить более качественный ввод. Я просто показываю технику с ImageMagick и могу позже преобразовать ее в Python wand , если кому-то это понравится - это не должно быть слишком сложно.

Итак вместо того, чтобы выбирать диапазоны в цветовом пространстве HSL, в этом случае проще и, вероятно, лучше переназначить изображение на определенную палитру c, поскольку вы хотите различать только 4 цвета. Итак, я сделал следующую палитру из 4-х цветов - черного, серого, желтого и красного, как это:

magick xc:"gray(15)"  xc:"gray(178)" xc:"rgb(230,50,30)" xc:"rgb(230,190,90)"  +append palette.png

Это делает эту (сильно увеличенную) палитру 4x1:

enter image description here

Затем я переназначил ваше изображение на цвета этой палитры:

magick column.png +dither -remap palette.png intermediate.png

enter image description here

Затем я заменяю все цвета, отдаленно близкие к желтому, на черный, а все цвета, отдаленно близкие к красному, на белый:

magick intermediate.png -fill black -fuzz 30% -opaque yellow -fill white -opaque red result.png

enter image description here

Очевидно, меняю От -fill white до -fill "gray(180)" if you want the background uniform, or add -threshold 50% `:

enter image description here


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

...