Для 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).