我正在关注这个 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解决方案。老实说,这可能已经得到了回答,但我不知道哪些术语会在搜索中提出这个问题,任何指针或帮助将不胜感激。
最佳答案
您可以使用 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;
这是一些输入图像:
这是获得的面具:
这是更新的图像:
希望有帮助!
关于python - C++ 等价于 Python 的带有比较的数组访问 (array[condition] = value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59825112/