Определить цвет и удалить этот цвет с изображения - PullRequest
1 голос
/ 09 октября 2019

У меня есть изображение со светло-фиолетовым изображением на заднем плане и синим цветом. Моя цель - идентифицировать текст с картинки. Поэтому я пытаюсь убрать светло-фиолетовый цвет фона, чтобы на моем изображении не было шума, но я не могу найти точный цветовой код для этого изображения, так как он несколько отличается везде, поэтому я не могу замаскироватьобраз. Вот мой код

import numpy as np
from PIL import Image

im = Image.open('capture.png')

im = im.convert('RGBA')
data = np.array(im)

rgb = data[:,:,:3]
color = [27, 49, 89]   # Original value to be mask
black = [0,0,0, 255]
white = [255,255,255,255]
mask = np.all(rgb == color, axis = -1)
data[mask] = black
data[np.logical_not(mask)] = white

new_im = Image.fromarray(data)
new_im.save('new_file.png')

Так что я подумал, смогу ли я удалить цвет во всем конкретном цветовом диапазоне, например [R: 0-20, G: 0-20, B: 80-100], возможно, это будетработай. Может кто-нибудь сказать мне, как я могу это сделать.

Любые другие предложения по решению этой проблемы также будут оценены.

1 Ответ

0 голосов
/ 09 октября 2019

Вот подход с использованием массива пикселей. Пиксельные массивы работают медленно, но если скорость не является проблемой, они могут удовлетворить ваши потребности без необходимости загружать какие-либо внешние библиотеки. Кроме того, пиксельные массивы легко понять.

import pygame
# -- You would load your image as a sprite here. --
# -- But let's create a demonstration sprite instead.--
#
usecolor = (46,12,187,255)       # Declare an example color.
sprite = pygame.Surface((10,10)) # Greate a surface. Let us call it a 'sprite'.
sprite.fill(usecolor)            # Fill the 'sprite' with our chosen color.
#
# -- Now process the image. --
array = pygame.PixelArray(sprite)   # Create a pixel array of the sprite, locking the sprite.
sample = array[5,5]                 # Sample the integer holding the color values of pixel [5,5]
                                    # We will feed this integer to pygame.Color()
sample_1 = sprite.get_at((5,5))     # Alternately, we can use the .get_at() method.
# Do the same for every pixel, creating a list (an array) of color values.
del array                           # Then delete the pixel array, unlocking the sprite.

m,r,g,b = pygame.Color(sample) # Note: m is for the alpha value (not used by .Color()) 

print("\n sample =",sample,"decoded by python.Color() to:")
print(" r >>",r)
print(" g >>",g)
print(" b >>",b)
print("\n or we could use .get_at()")
print(" sample_1 =",sample_1)
print()
exit()

Просто протестируйте каждое значение r, g, b, чтобы увидеть, попадают ли они в некоторый желаемый диапазон для каждого цветового компонента. Затем скопируйте каждый пиксель на новую поверхность, заменив все цвета, попадающие в ваш диапазон, на желаемый цвет замены.

Или вы можете добавить, скажем, 75 к каждому компоненту цвета R, G, B (если цвет> 255: цвет = 255) перед размещением пикселя в новом изображении. Это привело бы к исчезновению всех цветов в сторону белого, пока не исчезнет светлый цвет. Затем вы можете повторить процесс, вычитая 75 из каждого оставшегося пикселя (со значениями компонентов менее 255), чтобы снова выдвинуть цвета вперед. Я сомневаюсь, что любую приличную капчу так легко победить, но вот, пожалуйста.

Весело, весело!

...