前言
在进行训练相关任务时,有时会对图像进行裁剪或取patch的操作,进行这种操作后,不可避免的会引入一些空白patch,或内容量很少的图像,这种图像通常会干扰模型的训练,因此最好过滤掉。本文提供了3种方法对图像进行过滤。
一、唯一像素计数
如果一张图像为空,或者信息很少,其像素的种类也很少,可以根据这一特点进行判断。通过将唯一像素计数与阈值比较,我们可以确定空图像。 可以根据阈值来决定过滤的程度。
import numpy as np
import cv2
def is_empty(img):
# Reading Image
image = cv2.imread(img, 0)
np.reshape(image, (-1,1))
u, count_unique = np.unique(image, return_counts =True)
if count_unique.size< 10:
return "Image is empty"
else:
return "Image is not empty"
二、总和像素值
根据像素总和值判断是最简单的方式,但是通常仅用来判断纯黑图和纯白图。
import numpy as np
import cv2
blank_image2 = np.zeros((100,100,3), dtype=np.uint8)
cv2.imwrite("result.jpg", blank_image2)
def is_empty(img):
# Reading Image
image = cv2.imread(img)
h,w,_ = image.shape
# Checking if the image is empty or not
if np.sum(image) == 0:
result = "Image is empty!"
elif np.sum(image/255.0) == h*w:
result = "Image is empty!"
else:
result = "Image is not empty!"
return result
三、标准差
标准差能够衡量数据的分布情况,空图像的标准差应该接近零。通常,空白图像可能在整个图像中具有更均匀的像素值。我们可以使用标准差来计算均匀程度。如果值低于某个阈值,则可以说该图像为空。通过标准差判断,能够更好的衡量图像的信息量,一般标准差小,说明图像像素平均,包含的内容信息少。 阈值可以根据实际过滤程度进行调试(阈值越大,过滤后的图像可以保证内容信息丰富度越大)。
import numpy as np
import cv2
def is_empty(img):
# Reading Image
image = cv2.imread(img, 0)
np.reshape(image, (-1,1))
std_dev=np.std(image)
if std_dev < 1:
return "Image is empty"
else:
return "Image is not empty"
总结
本文提供了3种方法对图像进行过滤。本人比较喜欢用第三种,能够有效过滤掉一些没有任何意义的图像。