Получение контрастности каждого пикселя в изображении - PullRequest
0 голосов
/ 06 апреля 2019

Я хотел бы получить среднее значение контрастности изображения, и я нашел рабочий код в обработке. Я пытался применить это в qt-creator, как в c ++, однако, когда я пытаюсь запустить свой код, я получаю эту ошибку:

не может преобразовать 'cv :: Mat' в 'uint8_t * {aka unsigned char *}' при инициализации uint8_t * rowPtr = foo.row (i); <</p>

Inэти части:

uint8_t * rowPtr = foo.row (i);>

Вот код, который я пытаюсь запустить;

    bool normalizeRange = true;    // normalize results to range of 0-1
    float contrast = 0;
    float brightness =0;
    Mat foo = imread("1.png");

    int cn = foo.channels();

    Scalar_<uint8_t> bgrPixel;


    for(int i = 0; i < foo.rows; i++)
    {

        uint8_t* rowPtr = foo.row(i);
        for(int j = 0; j < foo.cols; j++)
        {
            bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
            bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
            bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

            // do something with BGR values...
        }
    }
    brightness += (0.2126 * bgrPixel.val[2]) + (0.7152 * bgrPixel.val[1]) + (0.0722 * bgrPixel.val[0]);                 // scales RGB to perceived brightness
    if (normalizeRange) {
      brightness /= 255.0;                                                    // normalize to 0-1
    }


  brightness /= sizeof(bgrPixel);                                                // average result
  qDebug() << "Average brightness:" << brightness;

  // find contrast by comparing average brightness with current value
  for(int i = 0; i < foo.rows; i++)
  {
      uint8_t* rowPtr = foo.row(i);
      for(int j = 0; j < foo.cols; j++)
      {
          bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
          bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
          bgrPixel.val[2] = rowPtr[j*cn + 2]; // R

          // do something with BGR values...
      }
  }
      float pxIntensity = (0.2126 * bgrPixel.val[2]) + (0.7152 * bgrPixel.val[1]) + (0.0722 * bgrPixel.val[2]);
    if (normalizeRange) {
         pxIntensity /= 255.0;                                                // normalizes to range 0-1
    }
    contrast += pow((brightness - pxIntensity), 2);
    contrast /= sizeof(bgrPixel);
     qDebug() << "Average cotrast:" << contrast;
  }

Обновление: я добавил код Java, который я хотел бы запустить в C ++

boolean normalizeRange = true;    // normalize results to range of 0-1
PImage img;
float brightness = 0;
float contrast = 0;
void setup() {
    img = loadImage(filename);
  size(img.width, img.height);
  image(img, 0,0);
  loadPixels();                   // load pixels into array, iterate!
    // find average brightness across image
  for (color c : pixels) {
    float r = c >> 16 & 0xFF;                                                 // extract RGB values quickly (better than red(), etc)
    float g = c >> 8 & 0xFF;
    float b = c & 0xFF;
    brightness += (0.2126 * r) + (0.7152 * g) + (0.0722 * b);                 // scales RGB to perceived brightness
    if (normalizeRange) {
      brightness /= 255.0;                                                    // normalize to 0-1
    }  }
  brightness /= pixels.length;                                                // average result
  println("Average brightness: " + brightness);
  // find contrast by comparing average brightness with current value
  for (color c : pixels) {
    float r = c >> 16 & 0xFF;
    float g = c >> 8 & 0xFF;
    float b = c & 0xFF;
    float pxIntensity = (0.2126 * r) + (0.7152 * g) + (0.0722 * b);
    if (normalizeRange) {
         pxIntensity /= 255.0;                                                // normalizes to range 0-1  }
    contrast += pow((brightness - pxIntensity), 2);}
  contrast /= pixels.length;
  println("Average contrast:   " + contrast);
}

1 Ответ

0 голосов
/ 06 апреля 2019

Используйте cv :: Mat :: ptr () , чтобы получить указатель на указанный буфер строки матрицы.

cv :: Mat :: row () создает новый заголовок cv::Mat для подматрицы, который вместо этого состоит из этой единственной строки.

Итерация необработанного буфера cv::Mat может быть более эффективным, но менее читаемым способом итерации элементов. Читайте о разных способах и их сравнении здесь .

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