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:

And reached this output image:

Enjoy! :)
source share