РЕДАКТИРОВАТЬ: Мое описание фильтра коробки очень неправильно (все веса должны быть одинаковыми в фильтре коробки), но предоставленный ответ действительно решает проблему на картинке. А именно ошибка, связанная с тем, что сумма весов не была равна 1.
Я посещаю занятия по компьютерной графике, и у меня возникают проблемы с работой фильтра сглаживания. Для своих попыток я использую маску 3x3 и сворачиваю ее с исходным изображением. Формула, приведенная в моей книге, дает веса как 1/(2r+1) для дискретных и 1/2r для непрерывных, где r — радиус от центрального пикселя. Итак, что я делаю, так это присваиваю каждому значению маски 3x3, как
b a b
a 1 a
b a b
где a равно 1/3, а b равно 1/( ( 2 * sqrt(2)) +1)
а затем свернуть его с исходным изображением.
Я использую конкретную библиотеку CImg, которую можно найти здесь: http://cimg.sourceforge.net/ и я мог бы также включить свой исходный код и результаты.
#include "CImg.h"
#include <cmath>
using namespace cimg_library;
int main()
{
CImg<unsigned char> image("zhbackground.bmp"), image2("zhbackground.bmp");
double a = 1.0/3.0;
double b = 1.0/((2.0*sqrt(2.0))+1.0);
CImg<> mask = CImg<>(3,3).fill(b,a,b,a,1,a,b,a,b);
image2.convolve(mask);
CImgDisplay main_disp(image,"original"), main_disp2(image2, "second");
while(1)
{
main_disp.wait();main_disp2.wait();
}
}