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

时间:2019-09-02 12:42:02

标签: c++ opencv

我有多个长度不同的一维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来影响阈值的计算。 关于如何有效/优雅地解决此问题的任何建议?

1 个答案:

答案 0 :(得分:1)

对我来说(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的行为不符合预期或没有记录!?

尽管如此,希望这会对您有所帮助!