gpt4 book ai didi

c++ - 如何使用平均无符号字符正确实现此操作 - C++

转载 作者:搜寻专家 更新时间:2023-10-31 00:30:47 25 4
gpt4 key购买 nike

考虑以下看似简单的问题,这是我在解决 CV 中涉及 mask 的作业和在光线追踪中实现 AA 时遇到的问题。

RGB 格式的颜色具有三个 channel ,每个 channel 由一个 unsigned char 表示,因此 0 <= channel value <= 255 .出于对称原因,让我们考虑单个 channel 。我想总结一组特定点的 channel 值,然后对其进行平均和舍入(不仅仅是截断)并存储回 unsigned char .请注意,在所有问题中,生成的平均值保证在 [0, 255] 范围内。 ,它是算法的不变量。

这看起来很简单,但我关心以下几点:

第 1 页。最重要的是:类型选择,请参阅下面的伪代码了解我需要的类型。更准确地说,我遇到了缩小转换错误,它变成了 -pedantic-errors 的错误。设置,我不想简单地挥手将其推开。

第 2 页。从更广泛的类型出发的想法可以积累很多uchar的,回到uchar类型。我相信该算法可以保证在 uchar 中产生一个值。范围,但是否足够?我应该为此担心吗?

伪代码(cv::Vec3b 是 OpenCV 中 unsigned char 的固定大小的 3x1 数组,我将其用于图像存储和输出):

// this returns a value in the range [0, 255]
cv::Vec3b processing_func(const point&) { ... }

accum_type acc_r = 0, acc_g = 0 , acc_b = 0;
for (point p: point_set) {
const cv::Vec3b color = processing_func(p);
acc_r += color[0]; acc_g += color[1]; acc_b += color[2];
}
cv::Vec3b result_color{roundf(acc_r / (floating_type)set_size),
roundf(acc_g / (floating_type)set_size),
roundf(acc_b / (floating_type)set_size)};
// hello narrowing conversion ^^^

引用p.1accum_type应该是什么?和 floating_type是(后者需要在不截断的情况下正确除法),或者您可以用不同的方式编码吗?

在第一条评论后编辑:set_size是大于 0 的整数,如果需要可以对其进行硬编码,但通常会发生变化。这是例如AA 因子,平方;或掩码大小等。

最佳答案

p.1:使用显式转换。

p.2:总的来说是不够的。每次对浮点类型进行操作时,都会失去精度。这取决于您对浮点类型的操作。为了防止这种情况发生,您可以检查饱和度,例如:

uchar v = (uchar)(value < 255.0 ? value : 255);

但我认为您不需要它。

关于c++ - 如何使用平均无符号字符正确实现此操作 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com