2017-02-19 95 views
-1

拆分提取一串類似的圖像和應用一些過濾器後我得到的圖像(np.arrays)所示:圖像預處理 - 通過顏色

enter image description here

我想的是分割成這個(但我不知道如何):

enter image description here

enter image description here

的C olor不會總是(紫色,綠色),但它們總是與(藍色,綠色),(橙色,藍色),(粉紅色,紅色)等不同。

強度(如果這是正確的詞)的顏色也發生了變化(多深藍色,多淺綠色,多個桔子......)

我希望完成後,我可以使用標記圖像的集合建立一個分類器與sk-learn和把這些字母畫出來。

非常感謝您的幫助!

P.S:另外這兩個字母可以出現在這個盒子的任何地方,有時甚至相互重疊,所以我不能把屏幕分成兩半。像這樣的位置:

enter image description here

回答

0

我解決了這個問題,通過應用模糊的連擊+增強,這是它的外觀(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) 

最後,對第二個例子結果爲l1l2上面給出將是,分別爲: letter 1 letter 2

哪不是我首先要求的,但足以構建一個分類器。