我有一个带有过滤器的matlab代码。现在我想把它转换成c++。我读过这个这里,但是我不能用openCV3.3实现filterEngine (不再有filterEngine了)。
这是matlab中的过滤器:
imfilter(im2double(image),k,'same','replicate');那是我的内核k:
k = fspecial('disk',3)这一行的结果是一个值介于0- 1之间的7x7矩阵。
所以过滤器得到一个输入图像。它的值介于0到1 (im2double)之间。所以我必须把我的8位图像转换成这个范围,我认为它是这样工作的:
cv::normalize(inImage,outImage,0,1,cv::NORM_MINMAX);然后用内核对图像进行过滤。最后,我想再次输出一个8位的图像。
,所以我想把给出的两行Matlab转换成C++.
我在链接中看到,您不能简单地使用filter2D。但我怎么能做到呢?有谁有主意吗?
++++编辑++++ (测试来自zteffi的代码片段)
我已经测试过密码了。到目前为止,结果是不同的。
内核“磁盘”的结构有点不同(更多的零)。它的数值也与Matlab中的值不同。
Matlabkernel:
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 0c++内核:
[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为零。但是每个角落应该只有一个零。
Mat kernel = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(radius * 2 + 1, radius * 2 + 1));发布于 2020-09-10 11:53:15
fspecial('disk',3)的等效值是cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(radius * 2 + 1, radius * 2 + 1)),除以内核的和,所以总和等于1。
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,并将最后两行交换为:
cv::filter2D(m, m, CV_8U, kernel);发布于 2020-09-11 07:48:37
您可以通过单击编辑器中函数名称上的鼠标右键,并在菜单中选择“打开‘函数名’”项来查看matlab的函数实现。它将显示该函数的matlab代码,您可以将其准确地移植到C++。
https://stackoverflow.com/questions/63827364
复制相似问题