我有多个长度不同的一维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
来影响阈值的计算。
关于如何有效/优雅地解决此问题的任何建议?
答案 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);
初始化的矩阵A
,B
,...具有不同的长度。由cv::hconcat
生成的中间矩阵inter
具有(正确)长度25,并且没有其他0
元素。根据Otsu的方法得出的阈值otsu
是142。如果我在初始化中从示例中手动添加了其他0
元素,则实际上得到的阈值为100。
也许,您可以提供实际的代码来比较有什么不同!!也许hconcat
的行为不符合预期或没有记录!?
尽管如此,希望这会对您有所帮助!