使用OpenCV查找图像中文本的颜色

46scxncf  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(203)

让我们来看一看下面的图片:

我已经知道如何使用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)

现在,它正在工作,但它高度依赖于提供的图像。当字体和单词不同时,结果会有很大不同。

在得到结果和在图像上拉回时,可以清楚地看到,对于某些部件,检测到的是不正确的

ttp71kqs

ttp71kqs1#

我在大约两年前遇到了这个问题,以下是我为解决这个问题所做的事情。

我在镜像上使用kans将其集群为k = 2集群。输出将是2个最突出的簇,即背景和前景。您可以使用open-cv二进制阈值将其转换为二进制图像。现在,您不知道哪个是前景,哪个是背景,所以您对二进制图像使用像素计数。在我的例子中,背景总是有更多的像素,所以很容易区分文本(前景)和背景。

用这种方法,无论哪种颜色是背景,哪种颜色是前景文本,即使你有轻微的噪音,也没有关系,因为它可以应付它。

这个技巧完全解决了我的问题,我希望它也能为你做同样的事情,或者至少给你一些线索。

相关问题