C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)
Posted
技术标签:
【中文标题】C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)【英文标题】:C++ equivalent of Python's array access with comparison (array[condition] = value) 【发布时间】:2020-01-20 14:15:29 【问题描述】:我正在关注这个 OpenCV Watershed 教程,但将其移植到 C++:https://docs.opencv.org/master/d3/db4/tutorial_py_watershed.html
简单地说,在教程中的某些地方,作者将使用类似于以下的操作访问和分配矩阵中的像素:
markers[unknown==255] = 0
或者这个
img[markers == -1] = [255,0,0]
我想做的是相当于上述操作,但在 C++ 中。 感觉很简单,但我就是想不通如何优雅地做到这一点。
对于第一种情况,我可以使用 cv::findNonZero
解决它,但对于第二种情况,它会变得稍微复杂一些,我想避免使用 hacky 解决方案。
老实说,这可能已经得到了回答,但我不知道哪些术语会在搜索中出现,任何指针或帮助将不胜感激。
【问题讨论】:
你检查this example了吗? 我没有。然而,这需要手动标记您想要分割的区域,即使是粗略的。我会看看我是否可以将其调整为自动。此外,它们似乎执行简单的访问,带有两个 for 循环。我希望这不是唯一的方法。 C++ 中没有对应的 Python 语法。你可以查看std::replace_if()
,但我不知道OpenCV是否适用于标准库算法。
好的。感谢您的帮助。
【参考方案1】:
您可以使用 OpenCV 的 inRange
方法与 lower = Upper 边界来获得一个表示要更改的所需像素的掩码,然后在 OpenCV 的 setTo
方法中使用此掩码:
// Read image
cv::Mat img = cv::imread("image.png");
// Mask everything, that's pure blue (#0000FF)
cv::Mat mask;
cv::inRange(img, cv::Scalar(255, 0, 0), cv::Scalar(255, 0, 0), mask);
// Write mask
cv::imwrite("mask.png", mask);
// Update value in mask to red
img.setTo(cv::Scalar(0, 0, 255), mask);
cv::imwrite("image_new.png", img);
return 0;
这是一些输入图像:
这是得到的掩码:
这是更新后的图片:
希望有帮助!
【讨论】:
以上是关于C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value)的主要内容,如果未能解决你的问题,请参考以下文章
具有类似于 Python/NumPy 的数组操作的 C++ 库 [关闭]