我正在使用OpenCV(Python)编写脚本,将图像拆分为不同的部分,以便以后对每个部分运行OCR。我已经让脚本将源图像拆分为所有需要的框,但它也带有一些纯白色图像。
我想知道是否有一种方法可以使用OpenCV检查图像是否只有白色像素。由于我刚开始使用该库,因此对此的任何信息都将是有用的。
谢谢!
我想知道是否有一种方法可以使用OpenCV检查图像是否只有白色像素。由于我刚开始使用该库,因此对此的任何信息都将是有用的。
谢谢!
方法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.mean
或 np.all
更快)!此外,Otsu将 cv2.threshold
限制为单通道图像,cv2.countNonZero
也是如此。因此,摆脱Otsu并切换到 np.count_nonzero
将使此方法也适用于多通道图像。 - HansHirsenp.count_nonzero
比 cv2.countNonZero
慢得多。因此,对于多通道图像支持,也许使用 cv2.countNonZero
调用的列表推导会更快。 - HansHirse