快速遍历numpy像素

时间:2018-11-29 21:27:30

标签: python numpy opencv

如果图像的rgb值等于阈值,我想对图像进行以下循环以删除或修改像素。

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

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

方法1:

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

    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)

结果: 供稿正常图像: enter image description here

结果方法1: enter image description here

结果方法2: enter image description here

送入反转图像: enter image description here

结果方法1: enter image description here

结果方法2: enter image description here

第一种方法是减慢速度,第二种方法仅在图像带有白色背景时起作用。

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

我发现了一些关于将numpy数组向量化的事情。但是,真的找不到一个很好的例子。

1 个答案:

答案 0 :(得分:0)

以具体示例回答问题:

    #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