使用OpenCV检查图像是否为全白像素

5
我正在使用OpenCV(Python)编写脚本,将图像拆分为不同的部分,以便以后对每个部分运行OCR。我已经让脚本将源图像拆分为所有需要的框,但它也带有一些纯白色图像。
我想知道是否有一种方法可以使用OpenCV检查图像是否只有白色像素。由于我刚开始使用该库,因此对此的任何信息都将是有用的。
谢谢!

计算所有像素的平均值,如果为255则全部为白色。 - Mark Setchell
1个回答

18

方法1:np.mean

计算图像的平均值。如果等于255,则该图像由全白像素构成。

if np.mean(image) == 255:
    print('All white')
else:
    print('Not all white')

方法 #2:cv2.countNonZero

您可以使用cv2.countNonZero来计算非零(白色)数组元素。思路是获取二进制图像,然后检查白色像素的数量是否等于该图像的面积。如果匹配,则整个图像由全部白色像素组成。以下是一个最小示例:


输入图像#1(因背景为白色而不可见):

enter image description here

全是白色

输入图像 #2

enter image description here

不全是白色

import cv2
import numpy as np

def all_white_pixels(image):
    '''Returns True if all white pixels or False if not all white'''
    H, W = image.shape[:2]
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

    pixels = cv2.countNonZero(thresh)
    return True if pixels == (H * W) else False

if __name__ == '__main__':
    image = cv2.imread('1.png')
    if all_white_pixels(image):
        print('All white')
    else:
        print('Not all white')
    cv2.imshow('image', image)
    cv2.waitKey()

你因为发布了一个隐形图片就赢得了我的投票 :-) - Mark Setchell
1
很遗憾,你关于 cv2.threshold 的实现是错误的。设置一个全灰图像(任何值> 0),你将始终得到 True,这是由于在此处使用了Otsu。正确的实现应该只是 cv2.threshold(gray, 254, 255, cv2.THRESH_BINARY)[1],这也更快(甚至比 np.meannp.all 更快)!此外,Otsu将 cv2.threshold 限制为单通道图像,cv2.countNonZero 也是如此。因此,摆脱Otsu并切换到 np.count_nonzero 将使此方法也适用于多通道图像。 - HansHirse
还有一个补充:不幸的是,np.count_nonzerocv2.countNonZero 慢得多。因此,对于多通道图像支持,也许使用 cv2.countNonZero 调用的列表推导会更快。 - HansHirse
@HansHirse 很有趣,我不知道那个。谢谢你指出来。 - nathancy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接