filter2D в C ++ не дает таких же результатов, как conv2 в Matlab? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть изображение:

enter image description here

В Matlab у меня есть

BW=imread('lenna.bmp');
N=3;
kernel = ones(N) / (N ^ 2);
blurry = conv2(im2double(BW), kernel, 'same');
blurry(1:5,1:5)

Вывод: ans =

0.2405    0.3891    0.4349    0.4514    0.4514
0.3612    0.5839    0.6519    0.6763    0.6771
0.3603    0.5847    0.6514    0.6776    0.6754
0.3621    0.5869    0.6523    0.6784    0.6767
0.3089    0.5120    0.5904    0.6309    0.6418

В C ++ я хочу получить те же результаты, что и код Matlab выше, поэтому я попытался

std::string BW0str = "lenna.bmp";
cv::Mat BW0mat = cv::imread(BW0str, cv::IMREAD_GRAYSCALE);
BW0mat.convertTo(BW0mat, CV_64FC1, 1.0 / 255.0);

int N = 3;
cv::Mat kernel = cv::Mat(N, N, CV_64FC1, cv::Scalar(1.0/(N *N)));
cv::Mat convMat;
cv::filter2D(BW0mat, convMat, BW0mat.depth(), kernel);

//output some values
for (int i = 0; i < 9; i++) {
    for (int j = 0; j < 9; j++) {
    std::cout << convMat.at<double>(i, j)<<" ";
}
std::cout << "\n";
}

//output:
.5608 .5830 .6523 .6776 .6771
.5621 .5834 .6519 .6763 .6771
.5599 .5847 .6514 .6776 .6754
.5617 .5869 .6523 .6784 .6767
.4828 .5120 .5904 .6309 .6418
.3577 .3834 .4588 .5150 .5516

Похоже, что результат C ++ совпадает с результатом Matlab, начиная со 2-й строки 3-й столбец. Однако я хочу, чтобы результаты соответствовали каждой записи. Можно ли это сделать в OpenCV в C ++?

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