【问题标题】:Check if image is all white pixels with OpenCV使用 OpenCV 检查图像是否全是白色像素
【发布时间】:2020-01-15 20:12:15
【问题描述】:

我正在使用 OpenCV (Python) 编写一个脚本,将图像拆分为不同的部分,以便稍后在每个部分上运行 OCR。我有脚本将源图像分成我需要的所有框,但它也附带了一些纯白色图像。

我很好奇是否有办法使用 OpenCV 检查图像是否只有白色像素。我对这个图书馆很陌生,所以任何有关这方面的信息都会有所帮助。

谢谢!

【问题讨论】:

  • 计算所有像素的平均值,如果是255则全白。

标签: python image opencv image-processing pixel


【解决方案1】:

方法#1: np.mean

计算图像的平均值。如果等于255,则图像由所有白色像素组成。

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

方法#2: cv2.countNonZero

您可以使用cv2.countNonZero 计算非零(白色)数组元素。这个想法是获得一个二值图像,然后检查白色像素的数量是否等于图像的面积。如果匹配,则整个图像由所有白色像素组成。这是一个最小的例子:


输入图像 #1(由于背景为白色,因此不可见):

全白

输入图像#2

并非全白

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()

【讨论】:

  • 你只因为发布了一张不可见的图片就得到了我的投票 :-)
  • 不幸的是,您对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 将使这种方法也适用于多通道图像。
  • 再补充一点:不幸的是,np.count_nonzerocv2.countNonZero 慢得多。因此,对于多通道图像支持,cv2.countNonZero 调用的列表理解可能更快。
  • @HansHirse 很有趣,我不知道。感谢您指出这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多