【问题标题】:Emug cv C# minimum Threshold truncateEmug cv C# 最小阈值截断
【发布时间】: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!恭喜您提出第一个问题;完全符合所有最佳实践:)

标签: c# opencv emgucv


【解决方案1】:

我已经理解您的问题专门针对阈值/截断,并且您对随后的规范化感到满意。

EmguCV 的一个鲜为人知的技巧是能够使用Image.Convert() 以便将“像素级”函数委托应用于您的图像。为了满足您的需求,您可以使用自己的逻辑:

Image<Gray, ushort> minThresholded = inputImage.Convert((value) => value = value < lowerThreshold ? lowerThreshold : value);
Image<Gray, ushort> maxThresholded = minThresholded.Convert((value) => value = value > upperThreshold ? upperThreshold : value);

您可能有兴趣在这里阅读 Luca 和我的回答:Iterate over pixels of an image with emgu cv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2012-11-19
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    相关资源
    最近更新 更多