Как я могу перекрасить фигуры в двоичном изображении для индексации (заливка)? - PullRequest
1 голос
/ 29 апреля 2020

Я создал двоичное изображение с пороговым значением. Как можно изменить цвет белых фигур, как показано на рисунке ниже, чтобы сделать их индексируемыми?

На данный момент это мой код:

void threshold()
{
    cv::Mat src_8uc3_img = cv::imread("images/train.png", CV_LOAD_IMAGE_GRAYSCALE); // load color image from file system to Mat variable, this will be loaded using 8 bits (uchar)

    if (src_8uc3_img.empty()) {
        printf("Unable to read input file (%s, %d).", __FILE__, __LINE__); 
    }

    double thresh = 0;
    double maxValue = 255;

    cv::Mat thresh_holding = src_8uc3_img.clone();
    cv::Mat indexing = src_8uc3_img.clone();
    cv::imshow("Train", src_8uc3_img);

    for (int y = 0; y < thresh_holding.rows ; y++) {
        for (int x = 0; x < thresh_holding.cols ; x++) {
            uchar thX = thresh_holding.at<uchar>(y, x);
            if (thX < 128 ) {
                thresh_holding.at<uchar>(y, x) = thresh;
            }
            else if (thX>128){
                thresh_holding.at<uchar>(y, x) = maxValue;
            }
        }
    }

    cv::imshow("ThreshHolding", thresh_holding);

    cv::waitKey(0); // wait until keypressed

}

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

Перво-наперво: это «порог», а не «три sh удержание». Это означает установить / применить порог, не удерживая три sh, что бы это ни значило.

То, что вы хотите, - это четкое обнаружение связанных компонентов вашего изображения. Если вы не хотите изучать основы обработки изображений c, сначала используйте функцию threshold(). Тогда не используйте findContours() / drawContours(), потому что они медленные. Если вам нужны разные подключенные компоненты, используйте connectedComponents(): это быстро, и вы получаете разные метки для каждого компонента. Раскраска на ваше усмотрение, на основе индекса.

Вдохновленный Алексом Алекс Python ответ, здесь вы можете найти версию C ++:

#include <opencv2/opencv.hpp>

int main(void)
{
    using namespace cv;
    // Read image
    Mat1b img = imread("input.png", IMREAD_GRAYSCALE);
    // Make sure it's binary
    threshold(img, img, 128, 255, THRESH_BINARY);
    // Extract connected components
    Mat1i labels;
    int nlabels = connectedComponents(img, labels);
    // Make the connected components from 0 to 255 (assume less than 256 labels)
    img = labels * 255 / nlabels;
    // Make the labels colored
    Mat3b colored, output;
    applyColorMap(img, colored, COLORMAP_JET);
    // Mask background with zeros in original image
    colored.copyTo(output, img);
    // Write output
    imwrite("output.png", output);
}

Единственное отличие состоит в том, что я указал тип изображений для присвоения img также приведен к 8 bpp. И набранные Mat гораздо приятнее в использовании.

2 голосов
/ 29 апреля 2020

Python код:

import numpy as np
import cv2
a=cv2.imread('P.png')
b=cv2.cvtColor(a, cv2.COLOR_BGR2GRAY)
b=cv2.threshold(b, 170, 255, cv2.THRESH_BINARY)[1] 
lbl=cv2.connectedComponentsWithStats(b, 8, cv2.CV_32S)
im_lbl=np.uint8(255*lbl[1]/lbl[0])
out_img=cv2.applyColorMap(im_lbl, cv2.COLORMAP_JET)
out_img=cv2.bitwise_and(out_img, a)
cv2.imwrite('out.png', out_img)

Результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...