首页 > 解决方案 > 快速循环像素numpy

问题描述

我想通过图像执行以下循环以删除或修改像素,如果它等于具有阈值的 rgb 值。

目标是去除图像的背景并将图像提供给 OCR。

我尝试了两种不同的方法来做到这一点。

方法一:

基本上我所做的是获得平均背景像素值。然后遍历所有像素并检查哪些像素等于平均背景像素。

    for x in range(0, w):
        for y in range(0, h):
            if Pixel(img[y, x]).compare(pixel, threshold):
                img[y, x] = 255
            else
                img[y, x] = 0

比较函数将检查它是否 >=/<= 像素 -/+ 阈值。然后如果它返回true,它会将像素更改为白色,否则将更改为黑色。

这很好用,但是当你使用更大的图片时它太慢了。

方法2:只需使用opencv方法去除背景。

简单地:

img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
th3 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 41, 2)

结果: 馈送正常图像: 在此处输入图像描述

结果方法1: 在此处输入图像描述

结果方法2: 在此处输入图像描述

馈送倒置图像: 在此处输入图像描述

结果方法1: 在此处输入图像描述

结果方法2: 在此处输入图像描述

第一种方法是减慢速度,第二种方法仅在图像具有白色背景时才有效。

我确实需要它用于不同的背景颜色。

我发现了一些关于向量化 numpy 数组的东西。但真的找不到一个很好的例子。

标签: pythonnumpyopencv

解决方案


用具体的例子来回答这个问题:

    #load an image as grayscale
    #get the background average pixel value, it out of the scope of this question, different methods to achieve
    bg_avg = get_bg_avg_px_val(img)
    th = 80

    background_mask = logical_and((bg_avg - th) <= img, img <= (bg_avg + th))
    text_mask = logical_or((bg_avg - th) >= img, img >= (bg_avg + th))
    img[selected] = 255
    img[text] = 0

推荐阅读