Я использую следующий код, чтобы взять исходное изображение и размыть его:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
int main(int argc, char** argv) {
    cv::Mat img  = cv::imread("lenna_orig.png");
    cv::Mat gray, blurred;
    cv::cvtColor(img, gray, CV_BGR2GRAY);
    cv::GaussianBlur(gray, blurred, cv::Size(21, 21), 2.0);
    cv::imwrite("lenna_blur.png", blurred);
    return 0;
}

Но есть ли способ сохранить реальное изображение размытия по Гауссу? что-то вроде этого?

cv::imwrite("gauss.png", cv::GaussianBlur(cv::Size(21, 21), 2.0));

Я спрашиваю, потому что в конечном итоге я хочу решить проблему деконволюции и сравнить вычисленное ядро ​​с фактическим гауссовым ядром, поэтому мне нужно знать, как именно выглядит фактическое гауссовское ядро

РЕДАКТИРОВАТЬ:

Я вижу, что если я попробую

cv::Mat g = cv::getGaussianKernel(15, 2.0, CV_64F);
cv::imshow("g", g);
cv::imwrite("g.bmp", g);

Это не сработает, потому что это возвращает матрицу 15x1 в качестве ядра, согласно документации. Но хочу ядро ​​15х15

0
user5739619 8 Мар 2018 в 06:25

1 ответ

Лучший ответ

cv::getGaussianKernel возвращает 1d гауссовский профиль. Поскольку ядро ​​симметрично, необходимо вычислить только 1d кривую.

Если вам нужна 2-мерная версия, вы можете сложить 15 строк 1-й, а затем умножить каждый столбец на тот же профиль.

Редактировать: например. Предположим, что гауссовское ядро ​​было 0,2, 0,4, 1,0, 0,4, 0,2 (упрощенная версия для меньшего набора текста)

Создайте квадратный массив с каждой строкой, равной профилю.

0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2 0.2 0.4 1.0 0.4 0.2

Теперь умножьте каждый столбец на один и тот же профиль.

0.2 0.4 1.0 0.4 0.2

Чтобы получить что-то вроде

0.04 0.08 0.2 0.08 0.04 0.08 0.16 0.4 0.16 0.08 0.2 0.4 1.0 0.4 0.2 0.08 0.16 0.4 0.16 0.08 0.04 0.1 0.2 0.08 0.04

Только с фактическим гауссовым профилем и результатом 15x15.

Ps это демонстрирует важную особенность этих ядер - они разделяются. Это означает, что вы можете применять их в направлениях x и y независимо, а затем комбинировать результат, что делает его более эффективным в использовании.

2
Martin Beckett 21 Июн 2018 в 19:41