【问题标题】:How Can I only keep text with specific color from image via opencv and python?如何通过opencv和python只保留图像中具有特定颜色的文本?
【发布时间】:2019-05-27 09:57:51
【问题描述】:

我有一些发票图像与一些文本重叠,这给以后的处理带来了一些麻烦,我只有黑色的文本。有些我想删除其他颜色的文字。

有什么办法可以做到吗?

图片作为示例附上。

我试过用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 文字

【问题讨论】:

    标签: image opencv text colors


    【解决方案1】:

    转换为HSV colorspace 可以更轻松地选择颜色。

    下面的代码可以满足您的需求。 结果:

    import numpy as np 
    import cv2
    
    kernel = np.ones((2,2),np.uint8)
    # load image
    img = cv2.imread("image.png")
    
    # Convert BGR to HSV
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    # define range of black color in HSV
    lower_val = np.array([0,0,0])
    upper_val = np.array([179,100,130])
    
    # Threshold the HSV image to get only black colors
    mask = cv2.inRange(hsv, lower_val, upper_val)
    
    # Bitwise-AND mask and original image
    res = cv2.bitwise_and(img,img, mask= mask)
    # invert the mask to get black letters on white background
    res2 = cv2.bitwise_not(mask)
    
    # display image
    cv2.imshow("img", res)
    cv2.imshow("img2", res2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    

    要更改选定的黑色级别,请调整 upper_val,当前设置为 130 的值。较高 = 允许较浅的阴影(称为值)。此外,当前值为 100:较低 = 允许较少的颜色(实际上是:饱和度)。 阅读有关 HSV 颜色空间的更多信息here

    我总是觉得下面的图片很有帮助。底部的“圆盘”全是黑色的。当您在值中向上移动时,也会选择较浅的像素。饱和度低的像素保持灰色阴影直到白色(中心),饱和度高的像素被着色(边缘)。这就是你调整这些值的原因。

    编辑:正如@Silencer 指出的那样,我的范围已经关闭。修好了。

    【讨论】:

    • 我想我应该让我的问题更加具体和完整,我只想保留特定颜色(黑色/红色)的文本的原因是图像中有几种颜色重叠的文本,这使 OCR 无法识别那些重叠的文本。您的解决方案可以识别出黑色的文字,但是图像质量下降很多,这使得以后的OCR识别变得困难。
    • 如果您放大图像左上角的字母,您就会明白为什么这样做很困难。有很多浅灰色像素。我尝试增加对比度,但这并没有太大帮助。更均匀、具有更多像素的高对比度图像将提高结果的质量......
    【解决方案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)
    

    结果:


    演示代码:

    # 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

    【讨论】:

    • 我想我应该让我的问题更加具体和完整,我只想保留特定颜色(黑色/红色)的文本的原因是图像中有几种颜色重叠的文本,这使 OCR 无法识别那些重叠的文本。您的解决方案可以识别出黑色的文字,但是图像质量下降很多,这使得以后的OCR识别变得困难。
    猜你喜欢
    • 2020-07-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    相关资源
    最近更新 更多