Как реализовать фильтр Лапласа в C ++ - PullRequest
1 голос
/ 19 апреля 2019

Я реализовал свой собственный фильтр Лапласа, но он не похож на фильтр Лапласа в Gimp, например.Что не так?

Моя попытка enter image description here

Gimp enter image description here

cv::Mat ImageManipulation::mylaplace_filter(cv::Mat image){
    int laplace_mask[9] = {0, -1, 0, -1, 4, -1, 0, -1, 0};
    int tmp = 0;
    int counter = 0;
    cv::Mat laplaceImage = cv::Mat::ones(image.rows-2,image.cols-2,CV_8U);
    for(int i = 1; i<image.rows-1; i++){
        for(int j = 1; j<image.cols-1; j++){

            for(int k = i-1; k<i+2; k++){
                for(int l = j-1; l<j+2; l++){
                    tmp += laplace_mask[counter] * static_cast<int>(image.at<uchar>(k,l));
                    counter++;
                }
            }
            std::cout << tmp/9 << std::endl;
            laplaceImage.at<uchar>(i-1,j-1) = tmp/9;
            tmp = 0;
            counter = 0;
        }
    }
    return laplaceImage;
}

1 Ответ

1 голос
/ 20 апреля 2019

Вы должны изменить тип изображения "laplaceImage", прежде чем войти в цикл, и, как прокомментировал @Cris Luengo, нет необходимости делить на 9:

cv::Mat ImageManipulation::mylaplace_filter(cv::Mat image)
{
    int laplace_mask[9] = { 0, -1, 0, -1, 4, -1, 0, -1, 0 };
    int tmp = 0;
    int counter = 0;
    cv::Mat laplaceImage = cv::Mat::ones(image.rows - 2, image.cols - 2, CV_32F);

    for (int i = 1; i < image.rows - 1; i++)
    {
        for (int j = 1; j < image.cols - 1; j++)
        {

            for (int k = i - 1; k < i + 2; k++)
            {
                for (int l = j - 1; l < j + 2; l++)
                {
                    tmp += laplace_mask[counter] * static_cast<int>(image.at<uchar>(k, l));
                    counter++;
                }
            }
            std::cout << tmp << std::endl;
            laplaceImage.at<float>(i - 1, j - 1) = tmp;
            tmp = 0;
            counter = 0;
        }
    }
    return laplaceImage;
}

после этого, если вы хотите показать «laplaceImage» или сохранить его на жестком диске, вы можете настроить его в диапазоне от 0 до 255, а затем преобразовать его в CV_8U.

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