让我们来看一看下面的图片:
我已经知道如何使用EASYOCR获取每一行。然而,我想知道文本的颜色是什么。我曾尝试应用阈值并使用位掩码,但如果背景色不是白色该怎么办?
截至下面的评论,我已将我的代码更改为:
def dominant_colors(image,n): # PIL image input
image = image.resize((150, 150)) # optional, to reduce time
ar = np.asarray(image)
shape = ar.shape
ar = ar.reshape(np.product(shape[:2]), shape[2]).astype(float)
kmeans = sklearn.cluster.MiniBatchKMeans(
n_clusters=n,
init="k-means++",
max_iter=20,
random_state=1000
).fit(ar)
codes = kmeans.cluster_centers_
vecs, _dist = scipy.cluster.vq.vq(ar, codes) # assign codes
counts, _bins = np.histogram(vecs, len(codes)) # count occurrences
colors = []
for index in np.argsort(counts)[::-1]:
# if index!=3:
colors.append(tuple([int(code) for code in codes[index]]))
return colors
dc = dominant_colors(Image.open('./mix.png'),2)
现在,它正在工作,但它高度依赖于提供的图像。当字体和单词不同时,结果会有很大不同。
在得到结果和在图像上拉回时,可以清楚地看到,对于某些部件,检测到的是不正确的
1条答案
按热度按时间ttp71kqs1#
我在大约两年前遇到了这个问题,以下是我为解决这个问题所做的事情。
我在镜像上使用kans将其集群为
k = 2
集群。输出将是2个最突出的簇,即背景和前景。您可以使用open-cv
二进制阈值将其转换为二进制图像。现在,您不知道哪个是前景,哪个是背景,所以您对二进制图像使用像素计数。在我的例子中,背景总是有更多的像素,所以很容易区分文本(前景)和背景。用这种方法,无论哪种颜色是背景,哪种颜色是前景文本,即使你有轻微的噪音,也没有关系,因为它可以应付它。
这个技巧完全解决了我的问题,我希望它也能为你做同样的事情,或者至少给你一些线索。