Найти первый красный пиксель и обрезать картинку - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу найти с помощью OpenCV первый красный пиксель и вырезать остальную часть изображения справа от него.

На данный момент я написал этот код, но он работает очень медленно:

        int firstRedPixel = mat.Cols();
        int len = 0;


           for (int x = 0; x < mat.Rows(); x++)
            {
                for (int y = 0; y < mat.Cols(); y++)
                {
                    double[] rgb = mat.Get(x, y);
                    double r = rgb[0];
                    double g = rgb[1];
                    double b = rgb[2];

                    if ((r > 175) && (r > 2 * g) && (r > 2 * b))
                    {
                        if (len == 3)
                        {
                            firstRedPixel = y - len;
                            break;
                        }

                        len++;
                    }
                    else
                    {
                        len = 0;
                    }
                }
            }

Любые решения?

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вы можете:

1) найти красные пиксели (см. здесь )

enter image description here

2)получите ограничительную рамку из красных пикселей

enter image description here

3) обрежьте свое изображение

enter image description here

Код написан на C ++, но это только функции OpenCV, поэтому не должно быть проблем с переносом на Java:

#include <opencv2\opencv.hpp>

int main()
{
    cv::Mat3b img = cv::imread("path/to/img");

    // Find red pixels
    // https://stackoverflow.com/a/32523532/5008845
    cv::Mat3b bgr_inv = ~img;
    cv::Mat3b hsv_inv;
    cv::cvtColor(bgr_inv, hsv_inv, cv::COLOR_BGR2HSV);

    cv::Mat1b red_mask;
    inRange(hsv_inv, cv::Scalar(90 - 10, 70, 50), cv::Scalar(90 + 10, 255, 255), red_mask); // Cyan is 90

                                                                                            // Get the rect
    std::vector<cv::Point> red_points;
    cv::findNonZero(red_mask, red_points);

    cv::Rect red_area = cv::boundingRect(red_points);

    // Show green rectangle on red area
    cv::Mat3b out = img.clone();
    cv::rectangle(out, red_area, cv::Scalar(0, 255, 0));

    // Define the non red area
    cv::Rect not_red_area;
    not_red_area.x = 0;
    not_red_area.y = 0;
    not_red_area.width = red_area.x - 1;
    not_red_area.height = img.rows;

    // Crop away red area
    cv::Mat3b result = img(not_red_area);

    return 0;
}   
0 голосов
/ 05 декабря 2018

Это не способ работать с компьютерным зрением.Я знаю это, потому что я сделал то же самое.

Один из способов достижения вашей цели - использовать сопоставление шаблонов с красной полосой, которую вы вырезали из своего изображения, и, таким образом, найти красную рамку иобрежьте его.

Другой способ - перейти в пространство HSV, отфильтровать красное содержимое и использовать поиск контуров, чтобы найти большую красную структуру, как вам нужно.

Существует множествоспособы сделать это.Циклическое переключение между значениями пикселей редко является правильным подходом, и таким образом вы не воспользуетесь сложными векторизацией или алгоритмами.

...