Сверточный фильтр 2D - PullRequest
0 голосов
/ 27 мая 2018

Я пытаюсь создать в C ++ фильтр свертки для изображения.Я использую библиотеку OpenCV для управления моим изображением.

Но мой фильтр не работает должным образом.

Первая попытка:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


/*
  filtre de convolution
*/

void filterConvolutionBlack(String pathImage, std::vector<std::vector<int>> filter) {
   Mat src;
   int ii = 0, jj = 0, value = 0;

   // Image source
   src = imread(pathImage, IMREAD_GRAYSCALE);

   // Image destination
   Mat dest;
   dest = src.clone();

   // On cherche le centre de la matrice
   int filterCenterX = (int)filter[0].size() / 2; // Colonne
   int filterCenterY = (int)filter.size() / 2; // Ligne

   // On parcours les lignes de l'image
   for (int i = 0; i < src.rows; ++i) {
       // On parcours les colonnes de l'image
       for (int j = 0; j < src.cols; ++j) {
           value = 0;
           // On parcours les lignes du filtre
           for (int fi = 0; fi < (int)filter.size(); ++fi) {
               // On parcours les colonnes du filtre
               for (int fj = 0; fj < (int)filter[0].size(); ++fj) {
                   // On calcul la position du pixel à modifier
                   ii = i + (fi - filterCenterY);
                   jj = j + (fj - filterCenterX);

                   // On vérifie que les postions ne sont pas hors limite
                   if (ii >= 0 && ii < src.rows && jj >= 0 && jj < src.cols) 
                   {
                       value += (int)src.at<uchar>(ii, jj) * filter[fi][fj];
                   }
               }
           }
           dest.at<uchar>(i, j) = value;
       }
   }
   imshow("Filter", dest);
 }

 int main(int argc, char **argv)
 {
   String pathImage = "loutre.png";

   // On creer un filtre 3*3
   std::vector<std::vector<int>> filter;
   filter.resize(3, std::vector<int>(3, 0));
   filter = {
       {1,1,1},
       {1,-8,1},
       {1,1,1}
   };

   filterConvolutionBlack(pathImage, filter);

   waitKey(0);

   return EXIT_SUCCESS;
 }

Переменная dest является окончательнойрезультат и переменная src - это базовое изображение.

Текущий результат:

Result

Однако ожидаемый результат:

expected.

Я думаю, что проблема связана с индексом массива, но я не уверен.

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