2

我需要在图像中找到一个像素与其周围的 8 个像素相比是否具有最大值。

我不确定什么是最佳方式,所以我的想法是使用这样的 if 语句:

if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8)

我的问题如下:如果它发现例如像素不大于像素1,它是否仍会检查语句的其余部分,或者因为它只是与,它会丢弃指令并继续前进?

如果答案是第一个,那么一直检查每个像素的计算量会很大,有人可以给我一个提示,告诉我如何更有效地解决这个简单的问题吗?

4

6 回答 6

9

这称为短路评估

仅当第一个参数不足以确定表达式的值时,才执行或评估第二个参数


由于条件是&&,它不会进一步检查false它是否在任何条件下得到 a 。

同样,如果条件是||,一旦找到 ,它将停止检查true


顺便说一句,我不确定优先规则,因此为了安全起见,我会将每个条件括在括号中。

if((pixel > pixel1) && (pixel > pixel2) && ...

编辑:运算符优先级规则似乎表明这种情况下的括号是不必要的。

于 2013-01-15T10:17:01.353 回答
1

不,它不会检查其余的语句。C++“短路”条件语句,&&如果第一个操作数为假,则忽略第二个操作数(||如果第二个操作数为真,则忽略第二个操作数)。

于 2013-01-15T10:18:04.600 回答
1

C++ 中存在“短路”,这意味着当第一个条件满足时if,将不检查第二个条件。

例如,如果pixel > pixel1结果false以下条件将被忽略。

我向您推荐这个“短路评估”

于 2013-01-15T10:19:33.247 回答
1

运算符&&||是 C++(以及大多数其他语言)中的所谓“短路运算符”。这意味着一旦可以确定结果,评估将立即停止。对于&&,这意味着如果一个项是false,则其他项的评估将停止,因为答案是false,独立于其他项。相反,||这意味着如果一个术语是 ,其他术语的评估将停止true。另请参阅此链接

于 2013-01-15T10:20:38.927 回答
1

不要把它想象成一个系列,而是一组表达式,所以&&只有左右两侧,并且是左侧关联的。

如果左侧对它进行评估,false则标准保证不评估右侧的内容。右侧甚至可能包含访问冲突(并且经常如此),例如检查左侧的指针是否非空,然后在右侧取消引用它。

你的操作是O(N)最坏的。如果你这样做一次,这是最佳方式,如果你要经常这样做,你最好找到像素的最大值,然后只检查那个。

于 2013-01-15T10:21:00.460 回答
0

虽然短路评估已在其他答案中进行了解释,但值得指出的是,两个像素的比较可能并非完全无关紧要。例如,您可能希望在将红色、绿色和蓝色像素值乘以加权因子后添加它们(因为人眼对某些颜色比其他颜色更敏感)......在这种情况下,如果您不保留被比较对象内部的整体像素值(从而为该值使用更多内存并以某种方式跟踪它何时失效,+ CPU 时间在必要时检查和重新生成它),那么您必须在每个期间执行此冗余计算在这些比较中。为避免这种情况,您可以 - 例如 - 添加“get_brightness()”

于 2013-01-15T11:14:17.727 回答