gpt4 book ai didi

c++ - 在C++中使用imfilter(matlab)

转载 作者:行者123 更新时间:2023-12-02 17:17:51 58 4
gpt4 key购买 nike

我有一个带过滤器的Matlab代码。现在我想将其转换为c++。我读了这个here
但是我无法用openCV3.3实现filterEngine(不再有filterEngine了)。
那是matlab中的过滤器:

imfilter(im2double(image),k,'same','replicate');
那就是我的内核k:
k = fspecial('disk',3)
该行的结果是一个7x7矩阵,其值介于0-1之间。
因此,滤镜将获得输入图像。该值介于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 0
C++内核:
[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));

最佳答案

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);

关于c++ - 在C++中使用imfilter(matlab),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63827364/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com