使 OpenCV 调整大小与 Matlab/Octave 调整大小相同



我目前正在将一些代码从 Matlab 移植到 C++ 并且图像大小调整时遇到了一些困难。我正在使用 OpenCV 在 C++ 中调整大小,但结果不匹配。我知道 Matlab 中的抗锯齿选项,但在这种情况下,我正在扩展,因此 Matlab 不使用该选项。

矩阵代码:

imresize(a,1.3, 'bilinear')

C++代码:

double scale = 1.3;
cv::Mat a = (cv::Mat_<double>(5, 5) << 0.7430835, 0.2263354, 0.8372651, 0.4305077, 0.0060997,
0.1850839, 0.4359681, 0.6224524, 0.3951009, 0.3335419,
0.5295836, 0.0202813, 0.8555994, 0.3494351, 0.6370482,
0.3154180, 0.4335316, 0.6281235, 0.3844186, 0.9898034,
0.9576555, 0.0212430, 0.3106115, 0.2677145, 0.1495867);
cv::Mat b;
cv::Mat c;
cv::resize(a, b, cv::Size(), scale, scale, CV_INTER_LINEAR);
cv::resize(a, c, cv::Size(ceil(scale * 5), ceil(scale * 5)), 0, 0, CV_INTER_LINEAR);

我注意到矩阵 b 给了我错误的维度,所以在 c 中我指定了维度而不是比例因子。即使尺寸正确,也不会提供相同的结果:

矩阵:

a=
0.7430835   0.2263354   0.8372651   0.4305077   0.0060997
0.1850839   0.4359681   0.6224524   0.3951009   0.3335419
0.5295836   0.0202813   0.8555994   0.3494351   0.6370482
0.3154180   0.4335316   0.6281235   0.3844186   0.9898034
0.9576555   0.0212430   0.3106115   0.2677145   0.1495867
ans =
0.7430835   0.3985848   0.4299787   0.8372651   0.5660935   0.2890383   0.0060997
0.3710838   0.3677549   0.4754126   0.6940566   0.5026210   0.3460670   0.2243945
0.2999171   0.2982429   0.4316599   0.7001681   0.4866420   0.3981562   0.4347107
0.5295836   0.1900488   0.2987207   0.8555994   0.5181565   0.4453061   0.6370482
0.3868066   0.3261232   0.4318373   0.7039488   0.4831546   0.5392444   0.8722183
0.5294972   0.3739004   0.3714968   0.5222862   0.4044402   0.4669219   0.7097312
0.9576555   0.3333805   0.1176992   0.3106115   0.2820135   0.2283386   0.1495867

C++:

a:
0.743084 0.226335 0.837265 0.430508 0.0060997
0.185084 0.435968 0.622452 0.395101 0.333542
0.529584 0.0202813 0.855599 0.349435 0.637048
0.315418 0.433532 0.628123 0.384419 0.989803
0.957655 0.021243 0.310611 0.267715 0.149587
b:
0.743084 0.40521 0.484806 0.759043 0.446152 0.120363
0.378238 0.368538 0.50446 0.641146 0.41849 0.270586
0.330834 0.284585 0.455135 0.654686 0.389062 0.438749
0.488398 0.234284 0.401026 0.724221 0.373689 0.610999
0.323655 0.385105 0.510391 0.588065 0.392835 0.816538
0.784745 0.35811 0.243873 0.377449 0.302864 0.355159
c:
0.743084 0.447799 0.400887 0.837265 0.546724 0.248619 0.0060997
0.424227 0.379597 0.45138 0.714515 0.497201 0.317247 0.19321
0.283512 0.302763 0.423448 0.689066 0.469771 0.398427 0.420258
0.529584 0.238554 0.258944 0.855599 0.494054 0.472698 0.637048
0.376608 0.341666 0.423362 0.693117 0.465479 0.594963 0.889016
0.590663 0.399905 0.324039 0.492047 0.379444 0.460963 0.62971
0.957655 0.422563 0.10392 0.310612 0.279971 0.217088 0.149587

不幸的是,我无法编辑 Matlab 代码,因此所有更改都需要在C++中完成。有谁知道如何让OpenCV提供与Matlab相同的结果,或者我需要创建自己的函数吗?

此致敬意 桑德雷

相关问题:

MATLAB vs C++ vs OpenCV - imresize

为什么OpenCV cv2.resize给出的答案与MATLAB imresize不同?

不调整大小的双线性 MATLAB

cv::resizeimresize之间有一个重要的区别。重要的是要注意

>> imresize(a, 1.3, 'bilinear')
ans =
0.7431    0.4052    0.4848    0.7590    0.4462    0.1204    0.0061
0.3782    0.3685    0.5045    0.6411    0.4185    0.2706    0.2202
0.3308    0.2846    0.4551    0.6547    0.3891    0.4387    0.4619
0.4884    0.2343    0.4010    0.7242    0.3737    0.6110    0.7049
0.3237    0.3851    0.5104    0.5881    0.3928    0.8165    0.9762
0.7847    0.3581    0.2439    0.3774    0.3029    0.3552    0.3758
0.9577    0.3454    0.1437    0.3024    0.2694    0.1814    0.1496

>> imresize(a, ceil(size(a)*1.3), 'bilinear')
ans =
0.7431    0.4478    0.4009    0.8373    0.5467    0.2486    0.0061
0.4242    0.3796    0.4514    0.7145    0.4972    0.3172    0.1932
0.2835    0.3028    0.4234    0.6891    0.4698    0.3984    0.4203
0.5296    0.2386    0.2589    0.8556    0.4941    0.4727    0.6370
0.3766    0.3417    0.4234    0.6931    0.4655    0.5950    0.8890
0.5907    0.3999    0.3240    0.4920    0.3794    0.4610    0.6297
0.9577    0.4226    0.1039    0.3106    0.2800    0.2171    0.1496

不要产生相同的结果。在第一种情况下,图像真正缩放了1.3倍,而在第二种情况下,缩放是由MATLAB推断出来的,在这种情况下是5/3=1.6666。这可以理解为如下:如果我们为 MATLAB 函数提供一个比例因子imresize则使用该因子精确缩放图像并推断调整大小的图像的大小(使用ceil(。如果我们提供尺寸imresizeMATLAB 使用这些尺寸来推断比例,因此我们最终会得到不同的结果。

另一方面,OpenCV使用round来推断调整后的图像大小,如果只提供比例因子(fxfy(。根据OpenCV的文档,应该可以同时提供dsizefxfy,并实现与MATLAB类似的行为。不幸的是,文档似乎是错误的,如调整大小中所述:无法同时指定大小和 fx/fy

因此,如果不更改OpenCV源代码,我们就无法将MATLAB的行为与OpenCV完全匹配。

height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

缩放只是调整图像的大小。OpenCV为此附带了一个函数cv.resize((。可以手动指定图像的大小,也可以指定比例因子。假设您在 img 变量中读取了图像。这是用Python编写的。希望这会有所帮助

相关内容

  • 没有找到相关文章

最新更新