Python 使用OpenCV检查图像是否都是白色像素
我正在使用OpenCV(Python)编写一个脚本,将图像分割成不同的部分,以便稍后在每个部分上运行OCR。我已经得到了将源图像分割成我需要的所有框的脚本,但它也附带了一些纯白色图像 我很好奇是否有办法用OpenCV检查图像是否只有白色像素。我对这个图书馆很陌生,所以关于这个的任何信息都会很有帮助 谢谢 方法#1: 计算图像的平均值。如果它等于Python 使用OpenCV检查图像是否都是白色像素,python,image,opencv,image-processing,pixel,Python,Image,Opencv,Image Processing,Pixel,我正在使用OpenCV(Python)编写一个脚本,将图像分割成不同的部分,以便稍后在每个部分上运行OCR。我已经得到了将源图像分割成我需要的所有框的脚本,但它也附带了一些纯白色图像 我很好奇是否有办法用OpenCV检查图像是否只有白色像素。我对这个图书馆很陌生,所以关于这个的任何信息都会很有帮助 谢谢 方法#1: 计算图像的平均值。如果它等于255,则图像由所有白色像素组成 if np.mean(image) == 255: print('All white') else: p
255
,则图像由所有白色像素组成
if np.mean(image) == 255:
print('All white')
else:
print('Not all white')
方法#2:
您可以使用cv2.countNonZero
对非零(白色)数组元素进行计数。其思想是获得一个二值图像,然后检查白色像素的数量是否等于图像的面积。如果匹配,则整个图像由所有白色像素组成。下面是一个最起码的例子:
输入图像#1(由于背景为白色,因此不可见): 全白 输入图像#2 不是全白的
计算所有像素的平均值,如果是255,则为全白。仅发布不可见图像即可获得我的投票:-)不幸的是,您关于
cv2.threshold的实现是错误的。设置一个全灰色图像(任意值>0),您将始终得到True
,这是由于这里使用了大津。正确的实现应该是cv2.threshold(gray,254,255,cv2.THRESH_BINARY)[1]
,这也要快得多(甚至比np.mean
或np.all
还要快)!此外,大津大学将cv2.threshold
限制为单通道图像,就像cv2.countNonZero
一样。因此,摆脱大津并切换到np.count\u nonzero
将允许这种方法也适用于多通道图像。另外一个补充:不幸的是,np.count\u nonzero
比cv2.countNonZero
慢得多。因此,对于多通道图像支持来说,可能对cv2.countNonZero
调用的列表理解更快。@HansHirse有趣,我不知道这一点。谢谢你指出这一点
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()