0

这是我在一本书中读到的 OpenCV 中基本颜色减少的公式。

//p is the value of the channel of a pixel
//n is the reduction factor
p = (p/n)*n + n/2; //integer division

我知道第一个表达式(p/n)*nn小于或等于的第一个倍数p。我认为这足以将颜色减少n. 但我不明白需要添加n/2什么。

而且,如果p=255n=5,这个公式会尝试设置p = 257,会不会超出 p 的范围?

请解释。

4

2 回答 2

1

使用n=255, (((p)/n)*n)将返回 0(对于 p < 255)和 255(对于 p == 255)。

为了保持平衡,您希望在 p < 128 时返回 0,在 p >= 128 时返回 255。这可以通过以下方式实现:

((p + n/2) / n) * n

这有点像((p / n) + 0.5) * n,只是你显然不能这样做。效果是对 的结果进行舍入,而不是截断p/n。实际上,这只适用于某些 n 值。

准确获得所需内容的一种简单方法是使用查找表。

((p)/n)*n + n/2正如 old-ufo 所指出的,我同意有问题

于 2013-11-13T13:11:32.223 回答
0

他们说 n/2 需要具有“中心”位置而不是最小值,但你是对的,它看起来不需要。假设我想要两种颜色——黑色和白色,所以 n=255。如果没有 n/2,我将得到 0 和 255。使用 n/2 - 127 和 382,这似乎不正确。

于 2013-11-13T12:18:36.443 回答