Я пытаюсь создать в 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](https://i.stack.imgur.com/cPyJq.png)
Однако ожидаемый результат:
.
Я думаю, что проблема связана с индексом массива, но я не уверен.