如何通过opencv和python仅保留图像中具有特定颜色的文本?

时间:2018-12-30 12:55:51

标签: image opencv text colors

我有一些发票图像,其中一些文本重叠,这给以后的处理带来了麻烦,而我唯一的问题就是黑色文本。一些我想删除其他颜色的文本。

有什么办法可以做到这一点?

以图片为例。

我试图用opencv解决它,但是我仍然不能解决这个问题:

import numpy as np import cv2
img = cv2.imread('11.png')

lower = np.array([150,150,150]) 

upper = np.array([200,200,200])

mask = cv2.inRange(img, lower, upper) 
res = cv2.bitwise_and(img, img, mask=mask) 
cv2.imwrite('22.png',res)

[具有多种颜色的图像] [1]

[1]:https://i.stack.imgur.com/nWQrV.pngstrong文字

2 个答案:

答案 0 :(得分:2)

文本更暗,饱和度更低。并建议@ J.D。 HSV颜色空间不错。但是他的范围是错误的。

在OpenCV中,H的范围是[0,180],而S / V的范围是[0,255]

这是我去年制作的一个颜色图,我认为这很有帮助。


(1)使用cv2.inRange

(2)只需为V(HSV)频道设置阈值:

th, threshed = cv2.threshold(v, 150, 255, cv2.THRESH_BINARY_INV)

(3)只需为S(HSV)频道设置阈值:

th, threshed2 = cv2.threshold(s, 30, 255, cv2.THRESH_BINARY_INV)

结果:

enter image description here


演示代码:

# 2018/12/30 22:21 
# 2018/12/30 23:25 

import cv2 

img = cv2.imread("test.png")
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h,s,v = cv2.split(hsv)

mask = cv2.inRange(hsv, (0,0,0), (180, 50, 130))
dst1 = cv2.bitwise_and(img, img, mask=mask)

th, threshed = cv2.threshold(v, 150, 255, cv2.THRESH_BINARY_INV)
dst2 = cv2.bitwise_and(img, img, mask=threshed)

th, threshed2 = cv2.threshold(s, 30, 255, cv2.THRESH_BINARY_INV)
dst3 = cv2.bitwise_and(img, img, mask=threshed2)

cv2.imwrite("dst1.png", dst1)
cv2.imwrite("dst2.png", dst2)
cv2.imwrite("dst3.png", dst3)

  1. How to detect colored patches in an image using OpenCV?

  2. How to define a threshold value to detect only green colour objects in an image :Opencv

答案 1 :(得分:1)

转换为HSV colorspace使得选择颜色更加容易。

以下代码可满足您的需求。 结果: enter image description here

typedef struct TEmployee
{
    struct TEmployee * m_Next;
    struct TEmployee * m_Bak;
    char * m_Name;
} TEMPLOYEE;

void *Malloc(size_t size)
{
    void *ptr = NULL;
    if ((ptr = malloc(size)) == NULL)
    {
        perror("alloc");
        exit(1);
    }

    return ptr;
}

TEMPLOYEE *cloneList(TEMPLOYEE *src)
{
    TEMPLOYEE *newList = (TEMPLOYEE *)Malloc(sizeof(TEMPLOYEE));
    newList->m_Bak = NULL;

    TEMPLOYEE *copy = newList;
    TEMPLOYEE *current = src;

    while (current != NULL)
    {
        newList->m_Name = strdup(current->m_Name);  // need free
        newList->m_Next = NULL;

        if (current = current->m_Next)
        {
            newList->m_Next = (TEMPLOYEE *)Malloc(sizeof(TEMPLOYEE));
            newList->m_Next->m_Bak = newList;
            newList = newList->m_Next;
        }
    }

    return copy;
}

要更改选定的黑色级别,请从upper_val中进行调整,该值当前设置为130。较高=允许使用较浅的阴影(称为“值”)。同样,当前值为100:低=允许较少的颜色(实际上是饱和度)。 了解有关HSV色彩空间here的更多信息。

我总是觉得下面的图片很有帮助。底部的“光盘”全是黑色的。当您在“值”中向上移动时,也会选择较亮的像素。饱和度低的像素保持灰色阴影直到白色(中间),饱和度高的像素变为彩色(边缘)。这就是为什么要调整这些值的原因。 enter image description here

编辑:正如@Silencer指出的那样,我的搜索范围已关闭。修复它。