首页 > 解决方案 > 如果邻居具有特定值,OpenCV C++ 获取特定值像素的最快方法

问题描述

cv::Mat extract_relevant_outline(cv::Mat img) {

    std::vector<cv::Point > interesting;

    cv::Mat new_plot;
    new_plot = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);

    int center_val = 255;
    int neighbor_val = 200;

    std::vector<cv::Point> dirs = { {-1, -1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1, 1} };
    for (int y = 1; y < (img.cols - 1); y++) {
        for (int x = 1; x < (img.rows - 1); x++) {

            if (img.at<uchar>(x, y) == center_val) {

                bool found_neighbour = false;
                for (int i = 0; i < dirs.size(); i++) {
                    if (img.at<uchar>(x + dirs[i].x, y + dirs[i].y) == neighbor_val) {
                        found_neighbour = true;
                        break;
                    }
                }
                if (found_neighbour) {
                    interesting.push_back({ x,y });
                    new_plot.at<uchar>(x, y) = 254;
                }
            }
        }
    }

给定一个单通道 cv::Mat,我想找到所有值为 255、至少有一个值为 200 的直接邻居的像素。将它们存储在 cv::Points 数组中并绘制在新图像中。

我是 C++ 新手,在 Python 中会使用 skimage 来实现这一点。

上面的代码似乎给出了我想要的结果,但我知道它效率低下。我正在迭代源图像中的每个像素,并在检查邻居之前首先测试“center_val”,我怀疑至少,我应该能够只迭代匹配“center_val”的像素,但函数如 cv::inRange (我怀疑可能更快)似乎返回另一个 cv::Mat 而不是我可以迭代的更短的东西,所以我对如何优化它感到困惑。有任何想法吗 ?

标签: c++opencv

解决方案


推荐阅读