首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在GaussianBlur中嵌入实际的OpenCV?

如何在GaussianBlur中嵌入实际的OpenCV?
EN

Stack Overflow用户
提问于 2018-03-08 03:25:24
回答 1查看 199关注 0票数 0

我使用以下代码拍摄原始图像并将其模糊:

代码语言:javascript
复制
#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;
}

但是有没有办法保存高斯模糊的实际图像呢?像这样吗?

代码语言:javascript
复制
cv::imwrite("gauss.png", cv::GaussianBlur(cv::Size(21, 21), 2.0));

我之所以问这个问题,是因为我最终想要做一个反卷积问题,并将计算出的核与实际的高斯核进行比较,所以我需要知道实际的高斯核到底是什么样子。

编辑:

我知道如果我试着

代码语言:javascript
复制
cv::Mat g = cv::getGaussianKernel(15, 2.0, CV_64F);
cv::imshow("g", g);
cv::imwrite("g.bmp", g);

这不起作用,因为根据docs,这将返回一个15x1矩阵作为内核。但是我想要一个15x15内核

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-08 05:05:20

cv::getGaussianKernel返回一维高斯轮廓。由于核是对称的,它只需要计算一条一维曲线。

如果您想要一个2d版本,您可以堆叠15行的1d版本,然后用相同的配置文件乘以每一列。

编辑:例如。假设高斯核为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方向上独立地应用它们,然后组合结果,这使得它的使用效率更高。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49164857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档