首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的嵌入滤波器(matlab)

C++中的嵌入滤波器(matlab)
EN

Stack Overflow用户
提问于 2020-09-10 10:07:11
回答 2查看 340关注 0票数 0

我有一个带有过滤器的matlab代码。现在我想把它转换成c++。我读过这个这里,但是我不能用openCV3.3实现filterEngine (不再有filterEngine了)。

这是matlab中的过滤器:

代码语言:javascript
复制
imfilter(im2double(image),k,'same','replicate');

那是我的内核k:

代码语言:javascript
复制
k = fspecial('disk',3)

这一行的结果是一个值介于0- 1之间的7x7矩阵。

所以过滤器得到一个输入图像。它的值介于0到1 (im2double)之间。所以我必须把我的8位图像转换成这个范围,我认为它是这样工作的:

代码语言:javascript
复制
cv::normalize(inImage,outImage,0,1,cv::NORM_MINMAX);

然后用内核对图像进行过滤。最后,我想再次输出一个8位的图像。

,所以我想把给出的两行Matlab转换成C++.

我在链接中看到,您不能简单地使用filter2D。但我怎么能做到呢?有谁有主意吗?

++++编辑++++ (测试来自zteffi的代码片段)

我已经测试过密码了。到目前为止,结果是不同的。

内核“磁盘”的结构有点不同(更多的零)。它的数值也与Matlab中的值不同。

Matlabkernel:

代码语言:javascript
复制
0   0.000280919186665314    0.0110250278796606  0.0171905962763014  0.0110250278796606  0.000280919186665314    0
0.000280919186665314    0.0245167426505023  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0245167426505023  0.000280919186665314
0.0110250278796606  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0110250278796606
0.0171905962763014  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0171905962763014
0.0110250278796606  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0110250278796606
0.000280919186665314    0.0245167426505023  0.0353677651315323  0.0353677651315323  0.0353677651315323  0.0245167426505023  0.000280919186665314
0   0.000280919186665314    0.0110250278796606  0.0171905962763014  0.0110250278796606  0.000280919186665314    0

c++内核:

代码语言:javascript
复制
[0, 0, 0, 0.0303030303030303, 0, 0, 0;
 0, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0;
 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303;
 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303;
 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303;
 0, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0.0303030303030303, 0;
 0, 0, 0, 0.0303030303030303, 0, 0, 0]

我不知道这些值是如何在matlab中计算的。

下面的行应该是在tha矩阵中创建一个值的“圆”。但在行维度中,边处有3*2个零,列维2 *2为零。但是每个角落应该只有一个零。

代码语言:javascript
复制
Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(radius * 2 + 1, radius * 2 + 1));
EN

回答 2

Stack Overflow用户

发布于 2020-09-10 11:53:15

fspecial('disk',3)的等效值是cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(radius * 2 + 1, radius * 2 + 1)),除以内核的和,所以总和等于1。

代码语言:javascript
复制
Mat m = cv::imread("lena.jpg");
int radius = 3;
Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(radius * 2 + 1, radius * 2 + 1));
double sum = cv::sum(cv::sum(kernel))[0]; // use cv::sum twice to get sum of all elements
kernel.convertTo(kernel, CV_64F, 1 / sum);
cv::filter2D(m, m, CV_64F, kernel);
m.convertTo(m, CV_8U);

除非需要显示图像,否则不需要将图像转换为<0,1>范围。在本例中,您也不需要将其转换为double,并将最后两行交换为:

代码语言:javascript
复制
cv::filter2D(m, m, CV_8U, kernel);
票数 1
EN

Stack Overflow用户

发布于 2020-09-11 07:48:37

您可以通过单击编辑器中函数名称上的鼠标右键,并在菜单中选择“打开‘函数名’”项来查看matlab的函数实现。它将显示该函数的matlab代码,您可以将其准确地移植到C++。

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

https://stackoverflow.com/questions/63827364

复制
相关文章

相似问题

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