2017-08-24 11 views
0

それ以上の認識のために文書画像を準備する必要があります。私の国では文書を黒色または灰色のフォントで書かなければならないという厳しい規則があります。署名とスタンプも青色でなければなりません。したがって、現在のステップでは、非グレースケールの色の要素を削除して、スタンプや署名を削除する必要があります。これは、文書のフラグメントの例です:example of document's fragment which will be analysed 私は別にグレースケールにグレースケールコンポーネントおよび非グレースケールコンポーネントを変換するためのコードを書かれている: result of performance of my code文書画像から非濃い色の成分を取り除く

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import numpy as np 
from skimage import io 
from skimage.color import rgba2rgb, rgb2grey, colorconv 
import matplotlib.pyplot as plt 
def separate_color_regions(im): 
    if im.shape[-1]==4: 
     im=rgba2rgb(im) 
    #representin each color chanel as float in range [0, 1.] 
    im=colorconv._prepare_colorarray(im) 

    #because we wont decompose black color instead of white 
    im=1.-im 

    #calculate gray component using the formula: grey=cos_a*|color|*(1, 1, 1)/sqrt(3), 
    #according to scalar multiplication formula cos_a*|color|=color*(1, 1, 1)/sqrt(3) 
    #here sqrt(3) added since |(1, 1, 1)|=sqrt(3) 
    gray=(im[..., 0]+im[..., 1]+im[..., 2])/3 
    proj=im.copy() 
    for i in range(3): 
     proj[..., i]-=gray 
    def norm(inp): 
     """ 
     convert each color vector to its l2 norm 
     """ 
     t=inp*inp 
     return np.sqrt(np.sum(t, -1)) 
    def mask_nan(inp): 
     where_are_NaNs = np.isnan(inp) 
     inp[where_are_NaNs] = 0. 
     return inp 
    return 1.-mask_nan(norm(proj)/norm(im)), 1.-mask_nan((3.**0.5)*gray/norm(im)) 
im=io.imread('stamps.png') 
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3) 
ax1.imshow(im) 
ax1.axis('off') 
ax1.set_title('Original image') 
nongray, gray=separate_color_regions(im) 
ax2.imshow(nongray, cmap=plt.cm.gray, aspect='auto', interpolation='none') 
ax2.axis('off') 
ax2.set_title('Non-grey_components filter') 
ax3.imshow(gray, cmap=plt.cm.gray, aspect='auto', interpolation='none') 
ax3.axis('off') 
ax3.set_title('Grey component filter') 
fig.tight_layout() 
plt.show() 

そして、ここではそれの結果は、パフォーマンスだです非グレースケールのオブジェクトだけを強調表示することができますが、グレースケールのオブジェクトとは区別できず、多くのノイズをイメージに取り込むことができません。私の場合にはよりよい解決策があるかどうかを教えてください。

+0

代わりに、手動でしきい値を設定するには、画像の青チャンネルにしきい値を設定することができます。この場合、あなたの国で利用可能なあらゆる種類の文書に適用されます。手動の方法で行った場合、異なる種類のインクが使用される場合があります。 –

答えて

0

が手動seted閾値とそれを解決する:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import numpy as np 
from skimage import io 
from skimage.color import rgba2rgb, rgb2grey, colorconv 
import matplotlib.pyplot as plt 
def separate_color_regions(im): 
    if im.shape[-1]==4: 
     im=rgba2rgb(im) 
    #representin each color chanel as float in range [0, 1.] 
    im=colorconv._prepare_colorarray(im) 

    #because we wont decompose black color instead of white 
    im=1.-im 

    #calculate gray component using the formula: grey=cos_a*|color|*(1, 1, 1)/sqrt(3), 
    #according to scalar multiplication formula cos_a*|color|=color*(1, 1, 1)/sqrt(3) 
    #here sqrt(3) added since |(1, 1, 1)|=sqrt(3) 
    gray=(im[..., 0]+im[..., 1]+im[..., 2])/3 
    proj=im.copy() 
    for i in range(3): 
     proj[..., i]-=gray 
    def norm(inp): 
     """ 
     convert each color vector to its l2 norm 
     """ 
     t=inp*inp 
     return np.sqrt(np.sum(t, -1)) 
    def mask_nan(inp): 
     where_are_NaNs = np.isnan(inp) 
     inp[where_are_NaNs] = 0. 
     return inp 
    return 1.-mask_nan(norm(proj)/norm(im)), 1.-mask_nan((3.**0.5)*gray/norm(im)) 
im=io.imread('stamps.png') 
fig, (ax1, ax2, ax3) = plt.subplots(nrows=3) 
ax1.imshow(im) 
ax1.axis('off') 
ax1.set_title('Original image') 
nongray, gray=separate_color_regions(im) 
ax2.imshow(nongray, cmap=plt.cm.gray, aspect='auto', interpolation='none') 
ax2.axis('off') 
ax2.set_title('Non-grey_components filter') 
mask=np.vectorize(lambda d: 0. if d>0.1 else 1.) 
ax3.imshow(1.-(1.-rgb2grey(im))*mask(1.-nongray), cmap=plt.cm.gray, aspect='auto', interpolation='none') 
ax3.axis('off') 
ax3.set_title('Grey component filter') 
fig.tight_layout() 
plt.show() 

enter image description here

関連する問題