2017-02-19 3 views
-1

Après avoir extrait un tas d'images similaires et d'appliquer des filtres, je suis arrivé images (np.arrays) comme celui-ci:image pré-traitement - Split en couleur

enter image description here

Je voudrais partager que dans ce (mais je ne sais pas comment):

enter image description here

enter image description here

Le c les oleurs ne seront pas toujours (violet, vert) mais ils seront toujours différents comme (bleu, vert), (orange, bleu), (rose, rouge), etc.

L'intensité (si c'est le mot correct)) de la couleur change aussi (plusieurs bleus sombres, plusieurs verts légers, plusieurs oranges ...)

J'espère qu'après avoir accompli que je peux utiliser une collection d'images étiquetées pour construire un classificateur avec sk-learn et comprendre ces lettres.

Merci d'avance pour toute aide! P.: Les deux lettres peuvent également apparaître n'importe où dans cette boîte, parfois même superposées les unes aux autres de sorte que je ne peux pas simplement diviser l'écran en deux. Comme celui-ci ici:

enter image description here

Répondre

0

Je résolu ce problème en appliquant un combo de Blur + Enhance, c'est à quoi il ressemble (Python 2.7):

import pandas as pd 
import numpy as np 
from PIL import Image 
from PIL import ImageEnhance 
import cv2 

im = Image.open(path) 

# Get np.array from image 
im_array = np.asarray(im) 

# Blur Image 
blur = Image.fromarray(cv2.medianBlur(im_array,5)) 

# Enhance color for easier split 
im_ready = ImageEnhance.Color(blur).enhance(100) 

# Get unique colors from Image 

unique_colors = set() 
def get_unique_colors(img): 
    for i in range(0,img.size[0]): 
     for j in range(0,img.size[1]): 
      r,g,b = img.getpixel((i,j)) 
      unique_colors.add((r,g,b)) 
    return(unique_colors) 

unique_colors = get_unique_colors(im_ready) 

# Create a dictionary computing each unique color frequency 

from collections import defaultdict 
by_color = defaultdict(int) 
for pixel in im_ready.getdata(): 
    by_color[pixel] += 1 

# Detect two most frequent colors that are not black 
# (black will always be sorted(by_color.values(),reverse=True)[0] with over 10k black pixels) 

colors_list = [] 
for e,j in by_color.iteritems(): 
    if j == sorted(by_color.values(),reverse=True)[1]: 
     colors_list.append(e) 
    if j == sorted(by_color.values(),reverse=True)[2]: 
     colors_list.append(e) 

def get_letter_order(im): 
    impx = im.load() 
    for x in range(0,im.size[0]): 
     for y in range(0,im.size[1]): 
      if impx[x,y] == colors_list[0]: 
       return(colors_list[0],colors_list[1]) 
      if impx[x,y] == colors_list[1]: 
       return(colors_list[1],colors_list[0]) 

first_letter_color, second_letter_color = get_letter_order(im_ready) 

# Get each letter separately by replacing the other color with black pixels 

l1 = im_ready.copy() 
l2 = im_ready.copy() 
im1 = l1.load() 
im2 = l2.load() 
for x in range(0,im_ready.size[0]): 
    for y in range(0,im_ready.size[1]): 
     if im_ready.getpixel((x,y)) <> (0,0,0): 
      if im1[x,y] <> first_letter_color: 
       im1[x,y] = (0,0,0) 
      if im2[x,y] <> second_letter_color: 
       im2[x,y] = (0,0,0) 

Enfin, pour le deuxième exemple ci-dessus le résultat de l1 et l2 seraient respectivement: letter 1 letter 2

qui Ce n'est pas ce que j'ai demandé en premier lieu mais c'est assez pour construire un classificateur.