Detect Farbe und entfernen Sie die Farbe aus dem Bild

stimmen
0

Ich habe captcha Bild mit Art von Licht lila Bild im Hintergrund und dunkelblau als Charakter. Mein Ziel ist, Text aus dem Bild zu identifizieren. Also ich versuche, Licht lila Farbe von Hintergrund zu entfernen, so dass mein Bild rauschfrei sein wird, aber ich kann nicht den genauen Farbcode für das Bild finden, da es etwas anders ist überall, also ist ich nicht in der Lage zu maskieren Bild. Hier ist mein Code

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

Also dachte ich, wenn ich Farbe in jedem bestimmten Farbbereich wie entfernen [R: 0-20, G: 0-20, B: 80-100] vielleicht das wird funktionieren. Kann mir jemand sagen, wie ich das tun kann.

Jeder anderer Vorschlag, dieses Problem zu lösen, wird auch anerkannt werden.

Veröffentlicht am 09/10/2019 um 18:59
quelle vom benutzer
In anderen Sprachen...                            


2 antworten

stimmen
0

Da es eine unterscheidbare Schatten aus dem Text zu sein scheint und der Hintergrund sollte Farbe Schwellwertbildung hier arbeiten. Die Idee ist, um das Bild zu HSV-Format zu konvertieren, um einen unteren und oberen Schwellwert verwenden, um eine binäre Maske segmentiert dann bitweise und zu extrahieren, um den Text zu erzeugen. Hier ist eine Implementierung mit Python OpenCV


Mit dieser unteren und oberen Schwelle, erhalten wir diese Maske

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

Geben Sie hier image description

Dann bitweise und wir und Farbe der Hintergrund weiß unser Ergebnis zu erhalten

Geben Sie hier image description

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

Sie können diese HSV-Farbschwellen Skript verwenden, um die unteren und oberen Grenzwerte zu bestimmen,

Geben Sie hier image description

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()
Beantwortet am 09/10/2019 um 23:36
quelle vom benutzer

stimmen
0

Hier ist ein Ansatz, ein Pixel-Array verwendet wird. Pixel-Arrays ist langsam, aber wenn die Geschwindigkeit kein Thema ist, könnte sie für Ihre Anforderungen ohne fremde Bibliotheken herunterladen zu müssen. Auch Pixel-Arrays sind leicht zu verstehen.

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

Testen nur jeden r, g, b-Wert, um zu sehen, ob sie für jede Farbkomponente in einem gewünschten Bereich fallen. Kopieren Sie dann jedes Pixel auf eine neue Oberfläche, alle Farben zu ersetzen, die mit dem gewünschten Ersatzfarbe in Ihrem Bereich fallen.

Oder Sie könnten subtrahieren, sagen 75 von jeder R, G, B-Farbkomponente (wenn Farbe <0: color = 0), bevor das Pixel in dem neuen Bild platzieren. Dies hätte den Effekt des Schwund alle Farben in Richtung Null, bis die helle Farbe ist weg. Dann könnte man den Vorgang wiederholt 75 zu jeder Nicht-Null-Pixel-Farbkomponente Addieren der Farben wieder nach vorne zu bringen. Ich bezweifle, jeder anständige captcha ist so leicht zu besiegen, aber es Sie gehen.

Spaß Spaß!

Beantwortet am 09/10/2019 um 21:45
quelle vom benutzer

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