РЕДАКТИРОВАТЬ
Эта ошибка была исправлена и была исправлена в последних коммитах.
Исходный вопрос
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
выглядит следующим образом:
Код выше еще не глючит как есть. Результат, correlated
, вычисляется правильно и выглядит следующим образом:
Однако, если вместо строки 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) ядра, затем мы получим результат мусора, где все пиксели равны нулю или почти равны нулю (в любом случае, на моей машине). Это похоже на ошибку для меня. Кто-нибудь еще может воспроизвести это? Это странно, но, поскольку я бы подумал, что наиболее распространенным использованием корреляции будет установка центра корреляции на фактический центр ядра.