【发布时间】:2019-12-10 09:47:40
【问题描述】:
我有一个 python 函数,它将较小的图像列表boxes(表示为数组)和整个图像img 作为参数并查找异常值。异常值将明显比列表中的其他图像更亮或更暗,但更常见的情况是更暗。
def find_outliers(boxes, img):
means = [np.mean(box['src']) for box in boxes]
asc = sorted(means)
q1, q3 = np.percentile(asc, [25,75])
iqr = q3 - q1
lower = q1 - (1.5 * iqr)
upper = q3 + (1.5 * iqr)
# print('thresholds:', lower, upper)
return list(filter(lambda x: np.mean(x['src']) < lower or np.mean(x['src']) > upper, boxes))
这种方法允许我根据图像创建阈值,而不是提出硬值,这在我的情况下是理想的。如果我继续这种方法,我需要解决 3 个问题。
- 有时较亮/较暗的图像数量超过正常图像。这些图像具有极端值,这使我的异常值方法偏向于认为它们是正常的。
- 有时
boxes的数量非常少(3 或4)。这使得该方法很难找到足够的下限和上限。 - 下限和上限可以是负数,但我的所有值都将大于或等于 0。
是否有更适合此类问题的统计方法?有没有其他方法可以根据图像建立阈值?
注意:我也尝试过标准差异常值方法,但这种方法不适合这种情况。
【问题讨论】:
-
您说根据图像创建阈值,但您没有在函数中使用
img?我知道这些盒子来自img(是img的子图像)。这是正确的吗? -
没错。我还没有使用过 img,但如果有办法我可以,我只是想让社区知道这是可能的。
-
所以我会将这些框与 img 的百分位数进行比较;如果您愿意,我可以将其写为答案,以便您尝试。
-
这不是一个坏主意,请做!
标签: python numpy opencv comparison outliers