Estoy tratando de establecer un nuevo valor de color a algunos de píxeles en un cv::Mat imagen de mi código es el siguiente:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
        Vec3b color = image.at<Vec3b>(Point(x,y));
        if(color[0] > 150 && color[1] > 150 && color[2] > 150)
        {
            color[0] = 0;
            color[1] = 0;
            color[2] = 0;
            cout << "Pixel >200 :" << x << "," << y << endl;
        }
        else
        {
            color.val[0] = 255;
            color.val[1] = 255;
            color.val[2] = 255;
        }
    }
    imwrite("../images/imgopti"+to_string(i)+".tiff",image);

Parece que el bueno de píxel de salida (con cout) sin embargo en la imagen de salida (con imwrite) el píxel en cuestión, no se modifican. Ya he intentado usar el color.val[0].. todavía no puedo entender por qué el color de los píxeles en la imagen de salida no cambia.
gracias

InformationsquelleAutor grll | 2014-04-11

3 Comentarios

  1. 59

    Hizo todo excepto copiar el nuevo valor de píxel de la imagen.

    Esta línea toma una copia de los píxeles en una variable local:

    Vec3b color = image.at<Vec3b>(Point(x,y));

    Así que, después de cambiar color como tú quieras, sólo tienes que configurar de nuevo como esto:

    image.at<Vec3b>(Point(x,y)) = color;

    Así que, en total, algo como esto:

    Mat image = img;
    for(int y=0;y<img.rows;y++)
    {
        for(int x=0;x<img.cols;x++)
        {
            //get pixel
            Vec3b color = image.at<Vec3b>(Point(x,y));
    
            //... do something to the color ....
    
            //set pixel
            image.at<Vec3b>(Point(x,y)) = color;
        }
    }
  2. 15

    sólo tiene que utilizar una referencia:

    Vec3b & color = image.at<Vec3b>(y,x);
    color[2] = 13;
    • porque el problema era de un color Mat. en el uchar caso, ofc. uso uchar& c = image.at<uchar>(y,x)
    • lo siento, me refería al comentario de otra respuesta, y +1.
  3. 13

    Yo no los uso .por razones de rendimiento.

    Definir una estructura:

    //#pragma pack(push, 2) //not useful (see comments below)
    struct RGB {
        uchar blue;
        uchar green;
        uchar red;  };

    Y, a continuación, utilizarlo como este en tu cv::Mat de imagen:

    RGB& rgb = image.ptr<RGB>(y)[x];

    de la imagen.ptr(y) le da un puntero a la línea de digitalización y. Y iterar a través de los píxeles con bucles de x y de y

    • ¿Cuál es el sentido de establecer pack valor de a 2, si sizeof(uchar) es 1?
    • El compilador agregar Bytes de relleno para una estructura. La configuración de paquete de cambios de los rellenos, de modo que los datos se alinea en otra forma.Edit: Ver este post stackoverflow.com/questions/3318410/pragma-pack-effect
    • pragma no tiene ningún efecto sobre una estructura hecha únicamente de uchars. Leer una buena explicación aquí para obtener más detalles.
    • Thx buen enlace. Parece el pragma realmente es inútil en este caso 🙂 thx!
    • Eres bienvenido 🙂 Y agradable respuesta: menos de magia, más eficiente.

Dejar respuesta

Please enter your comment!
Please enter your name here