c++ - 创建您自己的线性滤波器

标签 c++ image opencv

我是 Opencv C++ 的新手。我正在尝试将蒙版与图像进行卷积。为此,我想创建自己的蒙版,以便我可以使用 filter2D 数组函数将我的蒙版与图像进行卷积。我要创建的面具是:

char mask [3][3]=  {{-1,0,1},{-1,0,1},{-1,0,1}};

为此我尝试了下面的代码(生成这个掩码):-

Mat kernel(3,3, CV_8UC1, Scalar(-1,0,1)); 

我已将掩码值打印为

std::cout << kernel;

但我得到的答案是 0, 0, 0; 0, 0, 0; 0, 0, 0

我期待的答案是 -1, 0, 1; -1, 0, 1; -1, 0, 1

我知道我在正确编写 channel 时犯了一个错误。任何人都可以帮助我理解 channel (CV_8UC1....)的含义以及如何更正它并获得正确的输出。

最佳答案

CV_8UC1 表示 1 channel ,8 位,uchar 图像。

标量用于设置每个 channel 的值,而不是每个像素/坐标。

示例 1:

Mat kernel(3,3, CV_8UC1, Scalar::all(0)) 

这意味着创建一个包含 0 的 3X3 矩阵,并且由于它是 CV_8UC1 类型,您只能提及一个值,在本例中为 0。

例子 2:

Mat kernel(3,3, CV_8UC3, Scalar(0,0,255)) 

意味着创建一个具有 3 个 channel 的 3X3 矩阵,因为类型是 CV_8UC3 并将 channel 1 设置为 0, channel 2 设置为 0, channel 3 设置为 255。

因此,为了您设置行值的目的,您不能使用标量。 而是这样做:

Mat C = (Mat_<double>(3,3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);

检查 this获取更多信息。

希望这对您有所帮助!

关于c++ - 创建您自己的线性滤波器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48661482/

相关文章:

python - OpenCV 光流断言

Java定时器和绘图动画

html - 不同浏览器中的图像颜色差异。 (火狐、 Chrome 、IE)

c# - 淡入/淡出图像的最佳方式

python - 直方图均衡 Python(无 Numpy 且无绘图)

python - 频域上的同态滤波(Python 和 OpenCV)

c++ - 如何在类中初始化动态数组?

c++ - android studio 中的外部 C++ 源文件?

c++ - 检查数组是否为 'right' (C++)

python - clang python 绑定(bind) : how to find type of a variable