CImg возможная ошибка в корреляции изображений? - PullRequest
0 голосов
/ 31 марта 2020

РЕДАКТИРОВАТЬ

Эта ошибка была исправлена ​​и была исправлена ​​в последних коммитах.

Исходный вопрос

Windows 10, Visual Studio 2019, CImg commit ac3195eb5dc75c9b8efc95e9fde2f1a0ea3b77cd.

Кажется, есть ошибка в методе get_correlate() класса CImg. Для удобства я вставляю подпись ниже, согласно официальной документации .

CImg<T>& correlate  (
  const CImg< t > &     kernel,
  const unsigned int    boundary_conditions = 1,
  const bool    is_normalized = false,
  const unsigned int    channel_mode = 1,
  const unsigned int    xcenter = ~0U,
  const unsigned int    ycenter = ~0U,
  const unsigned int    zcenter = ~0U,
  const unsigned int    xstart = 0,
  const unsigned int    ystart = 0,
  const unsigned    zstart = 0,
  const unsigned int    xend = ~0U,
  const unsigned int    yend = ~0U,
  const unsigned int    zend = ~0U,
  const float   xstride = 1,
  const float   ystride = 1,
  const float   zstride = 1,
  const float   xdilation = 1,
  const float   ydilation = 1,
  const float   zdilation = 1
)

Здесь ~0U означает «центрировано». (Обратите внимание, что это метод correlate(); get_correlate() - это то же самое, но он дает вам новый экземпляр вместо изменения на месте.)

Чтобы воспроизвести ошибку, используйте простой пример ниже.

#include <iostream>
#include <CImg.h>

using cimg_library::CImg;

int main() {
  // Create a 20x20 image and draw a white square in the middle.
  CImg<unsigned int> image {20, 20, 1, 1};
  image.fill(50);
  image.draw_rectangle(5, 5, 0, 0, 14, 14, 0, 0, 200);

  // Create a simple kernel of just ones.
  CImg<double> kernel {3, 3, 1 ,1};
  kernel.fill(1.0);

  // Bug? Below, if I set the centre to be the actual centre (1, 1) of the kernel, the resulting correlated image seems
  // to be all zeros.
  CImg correlated = image.get_correlate(kernel, 1, false, 1, 1, 2, 0);

  // Just for debugging.
  std::cout << "Max: " << correlated.max() << ", min: " << correlated.min() << ".\n";

  // Save and display the correlated image.
  correlated.save("correlated.png");
  correlated.display();
  return 0;
}

Построенный image выглядит следующим образом:

Constructed source image

Код выше еще не глючит как есть. Результат, correlated, вычисляется правильно и выглядит следующим образом:

enter image description here

Однако, если вместо строки CImg correlated = image.get_correlate(kernel, 1, false, 1, 1, 2, 0) мы делаем CImg correlated = image.get_correlate(kernel, 1, false, 1, 1, 1, 0), что означает установить центральную корреляцию к фактическому центру (1, 1) ядра, затем мы получим результат мусора, где все пиксели равны нулю или почти равны нулю (в любом случае, на моей машине). Это похоже на ошибку для меня. Кто-нибудь еще может воспроизвести это? Это странно, но, поскольку я бы подумал, что наиболее распространенным использованием корреляции будет установка центра корреляции на фактический центр ядра.

...