Различные результаты для размытия по Гауссу и субрегиона размытия по Гауссу для изображения с одним пикселем с ненулевым значением. объяснять - PullRequest
0 голосов
/ 24 апреля 2020

Для 8-битного изображения с разрешением 256x256 с одним ненулевым пикселем (пикселю 128, 128 присваивается значение 255), есть три разных случая реализации Gaussian Blur, которые я реализовал. a) Размытие по Гауссу для всего изображения b) Размытие по Гауссу для подобласти, содержащей ненулевой пиксель c) Размытие по Гауссу для подобласти, содержащей ненулевой пиксель с отступом Затем я попытался напечатать результаты для подобласти во всех трех случаях и понимают, что хотя результаты для случая b) и c) одинаковы, они отличаются от результата для случая а), причем значение ненулевого пикселя отличается в окончательном размытом изображении.

Может кто-нибудь объяснить мне, почему это может произойти, если параметры, используемые для размытия, одинаковы? Вот код:

#include <iostream>
#include <cstdlib>
#include <ctype.h>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char* argv[]) {
    //Gaussian Blur for entire image
    cv::Mat GBcheck(256, 256, CV_8U, cv::Scalar::all(0));
    int x = 128;
    int y = 128;
    int w = 5;
    int h = 5;
    int base_size = w / 2;
    GBcheck.at<uchar>(x, y) = 255;

    cv::Mat entireGB;
    cv::GaussianBlur(GBcheck, entireGB, cv::Size(w, h), 11, 11); //General Gaussian Blur

    std::cout << "the values for Entire GB:" << std::endl;
    for (int jindex = y - base_size; jindex <= y + base_size; jindex++) {
        for (int index = x - base_size; index <= x + base_size; index++) {
            std::cout << (int) entireGB.at<uchar>(index, index) << " ";
        }
        std::cout << std::endl;
    }


    //Gaussian Blur for a sub-region
    cv::Rect region(x - base_size, y - base_size, w, h);
    cv::GaussianBlur(GBcheck(region), GBcheck(region), cv::Size(w, h), 11, 11);
    std::cout << "\nthe values for Region-wise GB:" << std::endl;
    for (int jindex = y - base_size; jindex <= y + base_size; jindex++) {
        for (int index = x - base_size; index <= x + base_size; index++) {
            std::cout << (int) GBcheck.at<uchar>(index, index) << " ";
        }
        std::cout << std::endl;
    }

    //Gaussian Blurr for a subregion with a padding
    GBcheck = cv::Mat(256, 256, CV_8U, cv::Scalar::all(0));
    GBcheck.at<uchar>(128, 128) = 255;
    int x_new = x - base_size;
    int y_new = y - base_size;
    region = cv::Rect(x_new, y_new, w, h);
    cv::Rect padded_region(x_new - base_size, y_new - base_size, w + 2 * base_size, h + 2 * base_size);
    cv::Mat blurred_padded_region;
    cv::GaussianBlur(GBcheck(padded_region), blurred_padded_region, cv::Size(w, h), 11, 11);

    cv::Mat blurred_region = blurred_padded_region(cv::Rect(base_size, base_size, w, h));
    blurred_region.copyTo(GBcheck(region));
    std::cout << "\nthe values for padded Region-wise GB:" << std::endl;
    for (int jindex = y - base_size; jindex <= y + base_size; jindex++) {
        for (int index = x - base_size; index <= x + base_size; index++) {
            std::cout << (int) GBcheck.at<uchar>(index, index) << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

Выходные данные для кода:

the values for Entire GB:
10 10 10 10 10 
10 10 10 10 10 
10 10 11 10 10 
10 10 10 10 10 
10 10 10 10 10

the values for Region-wise GB:
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10 

the values for padded Region-wise GB:
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10 
10 10 10 10 10

Мы видим, что значение ненулевого пикселя равно 11 для случая а) и 10 для случая б) и c).

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