获取所有具有相同颜色的像素坐标

发布于 2025-01-03 13:48:26 字数 150 浏览 0 评论 0原文

我想获取与一个像素具有相同颜色的所有像素坐标,

List<cv::Point> GetAllPixels(cv::Point x)
{
//imp
}

如何在 EmguCV 或 OpenCV 中执行此操作?

I want to get all pixels coordinates that have same color as one pixel

List<cv::Point> GetAllPixels(cv::Point x)
{
//imp
}

How can I do this in EmguCV or OpenCV?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

梦里南柯 2025-01-10 13:48:26

这是使用 OpenCV C++ 的一个可能的解决方案:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

std::vector<cv::Point> getPixelsWithColor(const cv::Mat& src, cv::Scalar targetColor)
{
    assert(src.type() == CV_8UC3);

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

    for(int row = 0; row < src.rows; ++row)
    {
        for(int col = 0; col < src.cols; ++col)
        {
            cv::Vec3b currPixel = src.at<cv::Vec3b>(row, col);
            if(currPixel[0] == targetColor.val[0] &&
               currPixel[1] == targetColor.val[1] &&
               currPixel[2] == targetColor.val[2])
            {
                identicalPoints.push_back(cv::Point(col, row));
            }
        }
    }

    return identicalPoints;
}

int main(int argc, char** argv)
{
    Mat squares = imread("colored_squares.png");

    const Scalar RED = Scalar(0, 0, 255); // OpenCV is BGR order...
    vector<Point> redPixelLocations;
    redPixelLocations = getPixelsWithColor(squares, RED);

    Mat redMask = Mat::zeros(squares.size(), CV_8UC1);

    vector<Point>::iterator i;
    for(i = redPixelLocations.begin(); i != redPixelLocations.end(); ++i)
    {
        redMask.at<uchar>(*i) = 255;
    }

    imshow("Squares", squares);
    imshow("Red mask", redMask);
    waitKey();

    return 0;
}

我使用了这个输入图像:
在此处输入图像描述

并实现了此输出图像:
在此处输入图像描述

尽情享受吧! :)

Here is a possible solution using OpenCV C++:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

std::vector<cv::Point> getPixelsWithColor(const cv::Mat& src, cv::Scalar targetColor)
{
    assert(src.type() == CV_8UC3);

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

    for(int row = 0; row < src.rows; ++row)
    {
        for(int col = 0; col < src.cols; ++col)
        {
            cv::Vec3b currPixel = src.at<cv::Vec3b>(row, col);
            if(currPixel[0] == targetColor.val[0] &&
               currPixel[1] == targetColor.val[1] &&
               currPixel[2] == targetColor.val[2])
            {
                identicalPoints.push_back(cv::Point(col, row));
            }
        }
    }

    return identicalPoints;
}

int main(int argc, char** argv)
{
    Mat squares = imread("colored_squares.png");

    const Scalar RED = Scalar(0, 0, 255); // OpenCV is BGR order...
    vector<Point> redPixelLocations;
    redPixelLocations = getPixelsWithColor(squares, RED);

    Mat redMask = Mat::zeros(squares.size(), CV_8UC1);

    vector<Point>::iterator i;
    for(i = redPixelLocations.begin(); i != redPixelLocations.end(); ++i)
    {
        redMask.at<uchar>(*i) = 255;
    }

    imshow("Squares", squares);
    imshow("Red mask", redMask);
    waitKey();

    return 0;
}

I used this input image:
enter image description here

And achieved this output image:
enter image description here

Enjoy! :)

我是男神闪亮亮 2025-01-10 13:48:26

答案应该可以帮助您开始。还可以考虑使用Cmp函数

对于IplImage,它可能是这样的:

IplImage *img, *col_img, *mask_img;
// initialise images appropriately...
svSet(col_img, [colour of your choise]);
cvCmp(img, col_img, mask_img, CV_CMP_EQ);

使用mask_img来提取坐标。您可能会发现 cv::Mat 的等效操作。

The answer should get you started. Also consider using Cmp function

For IplImage it may be something like this:

IplImage *img, *col_img, *mask_img;
// initialise images appropriately...
svSet(col_img, [colour of your choise]);
cvCmp(img, col_img, mask_img, CV_CMP_EQ);

Use mask_img to extract coordinates. You may find equivalent operations for cv::Mat.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文