【发布时间】:2021-02-28 19:21:26
【问题描述】:
在 C# 中使用 emug cv 4.4。
假设我有覆盖整个范围的灰度 16 位图像。我想将下限值和上限值截断为预定义的最小值和最大值,然后对图像进行归一化,以便覆盖整个可能的范围。
要转换为上限值,有一个简单的解决方案:
CvInvoke.Threshold(imgIn, imgOut, max, 65535, ThresholdType.Trunc);
返回:
"value = value > threshold ? threshold : value"
我想要同样的方法,但为了最小值,所以这样做
"value = value < threshold ? threshold : value"
到目前为止,我在搜索文档和 stackoverflow 时找不到任何优雅的解决方案。
我目前实现它的方式(并且它正在工作)是对 imgIn 进行否定,应用 Threshold 方法,然后再次否定:
CvInvoke.BitwiseNot(imgIn, imgOut);
CvInvoke.Threshold(imgOut, imgOut, 65535-min, 65535, ThresholdType.Trunc);
CvInvoke.BitwiseNot(imgOut, imgOut);
我想知道是否有更优雅的解决方案。 后来我将此图像转换为 8 位并应用着色。
CvInvoke.Normalize(imgOut, imgOut, 0, 255, NormType.MinMax, DepthType.Cv8U);
CvInvoke.ApplyColorMap(imgOut, imgOutColor, Emgu.CV.CvEnum.ColorMapType.Jet);
所以总而言之,我想将 16 位灰度输入图像截断为预定义的最小值和最大值,将其范围归一化以覆盖整个 8 位图像以便对其进行着色。
【问题讨论】:
-
欢迎来到stackoverflow!恭喜您提出第一个问题;完全符合所有最佳实践:)