OpenCV Otsu的阈值:计算多个Mat对象的单个阈值

OpenCV Otsu's Thresholding: Calculate single threshold value for multiple Mat objects

本文关键字:阈值 Mat 对象 单个 计算 Otsu OpenCV      更新时间:2023-10-16

我有多个不同长度的一维Mat对象(线(,它们都从同一图像中提取,需要阈值为二进制。 为了实现更"全局"的阈值,我想同时在所有行上使用 Otsu 的阈值。

我目前的方法是使用vconcat来获取单个Mat对象。 由于Mat的所有行和列都具有相同的长度,我希望非初始化值设置为0,如下所示:

[234, 200, 123, 165, 91, 27, 142, 211,
21, 231, 100,  99, 87, 23,   0,   0,
234, 200, 123,  0,  0,  0,   0,   0,
234, 200, 123,  34,132, 32, 242,  12]

当然,我不希望0影响侵入值的计算。 关于如何以高效/优雅的方式解决这个问题的任何建议?

对我来说(Windows 10,OpenCV 4.1.1,Visual Studio Community 2017(,以下内容就像一个魅力:

// Set up example matrices.
cv::Mat A = (cv::Mat_<uint8_t>(1, 8) << 234, 200, 123, 165, 91, 27, 142, 211);
cv::Mat B = (cv::Mat_<uint8_t>(1, 6) << 21, 231, 100, 99, 87, 23);
cv::Mat C = (cv::Mat_<uint8_t>(1, 3) << 234, 200, 123);
cv::Mat D = (cv::Mat_<uint8_t>(1, 8) << 234, 200, 123, 34, 132, 32, 242, 12);   
// Generate intermediate matrix.
cv::Mat inter;
cv::hconcat(std::vector<cv::Mat>{ A, B, C, D }, inter);
// Calculate Otsu's threshold.
cv::Mat thr;
double otsu = cv::threshold(inter, thr, 0, 255, cv::THRESH_OTSU);

初始化的矩阵AB、...有不同的长度。cv::hconcat生成的中间矩阵inter长度为(正确的(25,并且没有额外的0元素。通过 Otsu 方法otsu的结果阈值为 142。如果我在初始化中手动添加示例中的其他0元素,我实际上得到的阈值为 100。

也许,您可以提供您的实际代码来比较不同之处!?也许,hconcat的行为并不像预期或记录的那样!?

不过,希望这会对您有所帮助!