2017-02-12 31 views
1

после попытки реализовать Гаусс для изображения я столкнулся с проблемой, когда выходное изображение выглядит как несколько смазанных версии исходного изображения (входное изображение)Gaussian Blur обработка изображений с ++

У меня слишком низкий репутация размещать изображения так не имеют ни малейшего представления о том, как в полной мере показать вам, что происходит, однако, я могу разместить ссылку gyazo на изображение:

https://gyazo.com/38fbe1abd442a3167747760866584655 - Оригинал, https://gyazo.com/471693c49917d3d3e243ee4156f4fe12 - Выход

Вот код:

int kernel[3][3] = { 1, 2, 1, 
        2, 4, 2, 
        1, 2, 1 }; 

void guassian_blur2D(unsigned char * arr, unsigned char * result, int width, int height) 
{ 
    for (int row = 0; row < height; row++) 
    { 
     for (int col = 0; col < width; col++) 
     { 
      for (int k = 0; k < 3; k++) 
      { 
       result[3 * row * width + 3 * col + k] = accessPixel(arr, col, row, k, width, height); 
      } 
     } 
    } 
} 

int accessPixel(unsigned char * arr, int col, int row, int k, int width, int height) 
{ 
    int sum = 0; 
    int sumKernel = 0; 

    for (int j = -1; j <= 1; j++) 
    { 
     for (int i = -1; i <= 1; i++) 
     { 
      if ((row + j) >= 0 && (row + j) < height && (col + i) >= 0 && (col + i) < width) 
      { 
       int color = arr[(row + j) * 3 * width + (col + i) * 3 + k]; 
       sum += color * kernel[i + 1][j + 1]; 
       sumKernel += kernel[i + 1][j + 1]; 
      } 
     } 
    } 

    return sum/sumKernel; 
} 

Изображение сохраняется:

guassian_blur2D(inputBuffer, outputBuffer, width, height); 

//Save the processed image 
outputImage.convertToType(FREE_IMAGE_TYPE::FIT_BITMAP); 
outputImage.convertTo24Bits(); 
outputImage.save("appleBlur.png"); 
cout << "Blur Complete" << endl; 

Любая помощь будет здорово, если это помогает я пытаюсь сохранить изображение в виде серого масштаба, так что цвет не будет сохранен.

+0

Трудно ответить, не видя изображения. Он может выглядеть размытым даже без использования гауссовского фильтра размытия, если вы попытаетесь уменьшить изображение до 24 бит от более высокого цветового пространства. Итак, единственное, что я хотел бы проверить, это убедиться, что исходное изображение - 24 бита (по крайней мере, чтобы убедиться, что это не проблема). –

+0

После этого вы должны попробовать удалить эффект размытия Gaussian, увидев, что k-петля связана с k <3 к k <1. Мое понимание заключается в том, что в этом случае вы должны вернуться к исходному изображению. Взятие этих двух шагов поможет вам изолировать, где проблема –

+0

24-битное преобразование в порядке, и, к сожалению, это трудно, если мне разрешено публиковать gyazo здесь (попробуем сейчас), надеюсь, вы сможете увидеть. – user7195486

ответ

2

Похоже, проблема не в вашем размытом коде и связана с сохранением или доступом к данным изображения.

Я использовал OpenCV для чтения/сохранения изображений и получил ожидаемый результат. Вот отрывок:

cv::Mat3b img = cv::imread("path_to_img.png"); 
cv::Mat3b out = img.clone(); 

guassian_blur2D(img.data, out.data, img.cols, img.rows); 

cv::imshow("img", img); 
cv::imshow("out", out); 
cv::waitKey(0); 

А вот входные и выходные изображения: input output

Пятно не очень заметно (в связи с высоким разрешением изображения и небольшого ядра), но если вы посмотрите внимательно - это выглядит правильно.

+0

Ничего себе, я буду использовать OpenCV и посмотрим, как я буду дальше, благодарю вас за то, что вы сами пытаетесь и показываете результаты! Это действительно помогает – user7195486

 Смежные вопросы

  • Нет связанных вопросов^_^