OpenCV:imshow如何处理负值?

4
根据文档,imshow的工作方式如下:
  1. 如果图像是8位无符号的,则按原样显示。
  2. 如果图像是16位无符号或32位整数,则像素值除以256。也就是说,值范围[0,255*256]被映射到[0,255]。
  3. 如果图像是32位浮点型,则像素值乘以255。也就是说,值范围[0,1]被映射到[0,255]。
如果我的矩阵包含32位浮点型的负值,它会怎么处理?
1个回答

10

OpenCV源代码的关键部分包括:

#define CV_8S   1
#define CV_32S  4
#define CV_32F  5

double scale = src_depth <= CV_8S ? 1 : src_depth <= CV_32S ? 1./256 : 255;
double shift = src_depth == CV_8S || src_depth == CV_16S ? 128 : 0;

dst[x] = saturate_cast<DT>(src[x]*scale + shift);

最终imshow在显示前创建了一个CV_8 Mat,所以当DT为uchar时,saturate_cast将参数夹紧到0和255之间。

对于浮点深度==CV_32F:

  • src_depth既不小于CV_8S也不小于CV_32S,因此scale==255(与文档一致)。
  • src_depth既不等于CV_8S也不等于CV_16S,所以scale==0。

这意味着对于CV_32F

  • 大于1.0的值最终会变成255(白色)
  • 负值最终会变成0(黑色)

现在回答您的问题:

如果我的矩阵包含32位浮点数的负值,它会如何处理?

负值将显示为0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接