Detectar y quitar el color que el color de la imagen

votos
0

imagen de código de imagen que tengo con especie de imagen de color morado claro de fondo en azul oscuro y como personaje. Mi objetivo es identificar el texto de la imagen. Así que estoy tratando de eliminar el color púrpura luz de fondo para que mi imagen será libre de ruido, pero no puedo encontrar el código de color exacto de esa imagen, ya que es algo diferente en todas partes, así que no estoy capaz de enmascarar imagen. Aquí está mi código

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')

Así que pensé que si puedo eliminar el color en toda la gama de color en particular, como [R: 0-20, G: 0-20, B: 80-100] tal que va a va a funcionar. ¿Puede alguien decirme cómo puedo hacer eso.

También se apreciará cualquier otra sugerencia para resolver este problema.

Publicado el 09/10/2019 a las 18:59
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
0

Ya que parece ser un tono distinguible del texto y el fondo, el color de umbral debería trabajar aquí. La idea es convertir la imagen al formato VHS a continuación, utilizar un umbral inferior y superior para generar una máscara binaria segmentado luego a nivel de bits y para extraer el texto. Aquí está una implementación de Python usando OpenCV


El uso de este umbral inferior y superior, se obtiene esta máscara

lower = np.array([0, 120, 0])
upper = np.array([179, 255, 255])

introducir descripción de la imagen aquí

Luego bit a bit-y y el color del fondo para conseguir el resultado

introducir descripción de la imagen aquí

import numpy as np
import cv2

# Color threshold
image = cv2.imread('1.png')
original = image.copy()
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
lower = np.array([0, 120, 0])
upper = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower, upper)
result = cv2.bitwise_and(original,original,mask=mask)
result[mask==0] = (255,255,255)

cv2.imshow('mask', mask)
cv2.imshow('result', result)
cv2.waitKey()

Puede utilizar este script umbral de color HSV para determinar los umbrales inferior y superior

introducir descripción de la imagen aquí

import cv2
import sys
import numpy as np

def nothing(x):
    pass

# Load in image
image = cv2.imread('1.png')

# Create a window
cv2.namedWindow('image')

# create trackbars for color change
cv2.createTrackbar('HMin','image',0,179,nothing) # Hue is from 0-179 for Opencv
cv2.createTrackbar('SMin','image',0,255,nothing)
cv2.createTrackbar('VMin','image',0,255,nothing)
cv2.createTrackbar('HMax','image',0,179,nothing)
cv2.createTrackbar('SMax','image',0,255,nothing)
cv2.createTrackbar('VMax','image',0,255,nothing)

# Set default value for MAX HSV trackbars.
cv2.setTrackbarPos('HMax', 'image', 179)
cv2.setTrackbarPos('SMax', 'image', 255)
cv2.setTrackbarPos('VMax', 'image', 255)

# Initialize to check if HSV min/max value changes
hMin = sMin = vMin = hMax = sMax = vMax = 0
phMin = psMin = pvMin = phMax = psMax = pvMax = 0

output = image
wait_time = 33

while(1):

    # get current positions of all trackbars
    hMin = cv2.getTrackbarPos('HMin','image')
    sMin = cv2.getTrackbarPos('SMin','image')
    vMin = cv2.getTrackbarPos('VMin','image')

    hMax = cv2.getTrackbarPos('HMax','image')
    sMax = cv2.getTrackbarPos('SMax','image')
    vMax = cv2.getTrackbarPos('VMax','image')

    # Set minimum and max HSV values to display
    lower = np.array([hMin, sMin, vMin])
    upper = np.array([hMax, sMax, vMax])

    # Create HSV Image and threshold into a range.
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hsv, lower, upper)
    output = cv2.bitwise_and(image,image, mask= mask)

    # Print if there is a change in HSV value
    if( (phMin != hMin) | (psMin != sMin) | (pvMin != vMin) | (phMax != hMax) | (psMax != sMax) | (pvMax != vMax) ):
        print("(hMin = %d , sMin = %d, vMin = %d), (hMax = %d , sMax = %d, vMax = %d)" % (hMin , sMin , vMin, hMax, sMax , vMax))
        phMin = hMin
        psMin = sMin
        pvMin = vMin
        phMax = hMax
        psMax = sMax
        pvMax = vMax

    # Display output image
    cv2.imshow('image',output)

    # Wait longer to prevent freeze for videos.
    if cv2.waitKey(wait_time) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()
Respondida el 09/10/2019 a las 23:36
fuente por usuario

votos
0

Aquí es un método que utiliza una matriz de píxeles. matrices de píxeles son lentos, pero si la velocidad no es un problema, que pudieran servir a sus necesidades sin tener que descargar ningún bibliotecas externas. Además, matrices de píxeles son fáciles de entender.

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()

Sólo probar cada r, g, el valor b para ver si caen dentro de algún intervalo deseado para cada componente de color. A continuación, copie cada píxel a una nueva superficie, en sustitución de todos los colores que caen dentro de su rango con su color de sustitución deseada.

O bien, podría restar, decir 75 de cada uno de R, G, B componente de color (si el color <0: color = 0) antes de colocar el píxel en la nueva imagen. Esto tendría el efecto de desvanecimiento todos los colores hacia el cero hasta que el color de la luz se ha ido. Posteriormente, se podría repetir el proceso de adición de 75 a cada componente de color distinto de cero para llevar los colores de nuevo hacia delante. Dudo que cualquier código de imagen decente es derrotado tan fácilmente, pero hay que ir.

¡Divertido divertido!

Respondida el 09/10/2019 a las 21:45
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more