从文档图像中删除非彩色组件
问题描述:
我需要准备文档图像以进一步识别。我国有严格的规定,文件必须用黑色或灰色字体书写。签名和邮票也必须是蓝色的。因此,在当前步骤中,我需要通过删除非灰度彩色元素来删除图章和签名。这是例如文档的片段: 我写的代码转换成灰度级的灰度化成分,并分别非灰度化成分:从文档图像中删除非彩色组件
#!/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()
这里是它的结果是性能: 您会发现它只能突出显示非灰度对象,但无法将灰度对象与某些灰度对象分离,并且会产生很多噪点。请告诉我是否有更好的解决方案。
答
与手动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()
除了手动设置阈值,你可以设置一个门槛上的图像的蓝色通道。在这种情况下,它适用于您所在国家的任何类型的文件。如果按照手动方法进行操作,则在使用不同类型墨水的某些场合可能会失败。 –