我使用以下代码拍摄原始图像并将其模糊:
#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);这不起作用,因为根据docs,这将返回一个15x1矩阵作为内核。但是我想要一个15x15内核
发布于 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方向上独立地应用它们,然后组合结果,这使得它的使用效率更高。
https://stackoverflow.com/questions/49164857
复制相似问题