- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正致力于将一些代码从 Matlab 移植到 C++,但在调整图像大小方面遇到了一些困难。我正在使用 OpenCV 在 C++ 中调整大小,但结果不匹配。我知道 Matlab 中的抗锯齿选项,但在这种情况下,我正在按比例放大,因此 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 中我指定了维度而不是比例因子。即使尺寸正确,也不会提供相同的结果:
Matlab:
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
why OpenCV cv2.resize gives different answer than MATLAB imresize?
最佳答案
cv::resize
和 imresize
之间有一个重要的区别。重要的是要注意
>> 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
)。如果我们向 imresize
提供维度,MATLAB 会使用这些维度来推断比例,因此我们最终会得到不同的结果。
另一方面,如果仅提供比例因子(fx
和 fy
),OpenCV 使用 round
来推断调整后的图像大小.根据documentation在 OpenCV 中,应该可以同时提供 dsize
、fx
和 fy
,并实现与 MATLAB 中类似的行为。不幸的是,文档似乎有误,如 resize: cannot specify both size and fx/fy 中所述
因此,在不更改 OpenCV 源代码的情况下,我们无法将 MATLAB 的行为与 OpenCV 完全匹配。
关于c++ - 使 OpenCV 调整大小与 Matlab/Octave imresize 相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50624898/
我找到了一些放大图像的方法,但没有缩小图像的解决方案。我目前正在使用最近邻法。在不使用 imresize 的情况下,我怎么能用双线性插值来做到这一点? MATLAB 中的函数? 最佳答案 在您的评论中
我尝试使用 MATLAB 调整图像的大小,但直接了解有关使用双线性模式的 imresize 函数有些奇怪。 我会给你一些例子来确定问题出在哪里。比如说,以下是一维矩阵。 A: [0 1 2] B: [
我有一个 numpy 数组 A,由多个相同大小的图像组成 [N_images,width,height,3]。 我想以最快的方式将 misc.imresize() 应用于每个人。 所以我定义: def
我用 0.25 的比例调整了一个图像的大小,然后使用 4 的比例放大了它。 imageReduced = imresize(imageOriginal, 0.25, 'nearest'); image
我有一张图片,我想让它的宽度和长度都是原始尺寸的两倍(即原始面积的 4 倍)。我使用的是 imresize(X,2),但有人告诉我应该改用 interp2。 我知道 imresize 默认使用双三次插
我曾经使用 scipy resize 函数来缩小图像。但由于这个函数在最新版本的 scipy 中已被弃用,我正在寻找替代方案。 PIL 似乎很有前途,但我如何将其用于 3d 图像? (600,800,
看完imresize.m documentation ,我不明白如果输入图像实际上是复数矩阵会发生什么。我正在查看一些产生必要输出的代码,它使用 imresize(A,n) 其中 A 是复数矩阵,n
我必须缩小数据以输入神经网络。 我想使用 cv2.imresize , 但关于它如何插入数据以按比例缩小,有多种选择: INTER_NEAREST - 最近邻插值法 INTER_LINEAR - 双线
我正在使用 Matlab/Octave imresize() 函数来重新采样给定的二维数组。我想了解 imresize 中使用的特定插值算法是如何工作的。 (我在 Windows 上使用 Octave
我注意到,在 openCV 中使用双三次插值对矩阵进行下采样时,即使原始矩阵都是正值,我也会得到负值。 我附上下面的代码作为例子: // Declaration of variables cv::Ma
如何将我的函数用作 MATLAB 中 imresize 函数的插值方法? 我看了MATLAB的帮助关于使用自定义函数进行插值方法的方法,但是没有任何明确的例子。我尝试为 ma 编写代码 最佳答案 im
我有一张图片,我想调整它的大小(高档)。我不想在我的图像中引入额外的灰度级。这就是为什么我使用最近邻插值如下: scipy.misc.imresize(image, image2.shape, i
我编写了以下代码以在 mex 文件中使用 imresize 函数。 #include "mex.h" void mexFunction(int nlhs, mxArray *plhs[],
我想使用仍然使用scipy.misc.imresize()的旧脚本,该脚本不仅已弃用,而且已从scipy中完全删除。相反,开发人员建议使用numpy.array(Image.fromarray(arr
我有以下 MATLAB 代码,我想将其转换为 C++ 假设 Gr 是二维矩阵并且 1/newscale == 0.5 Gr = imresize(Gr, 1 / newScale); 在the MAT
我收到以下警告消息: ...\anaconda3\lib\site-packages\ipykernel_launcher.py:1: DeprecationWarning: `imresize` i
我目前正致力于将一些代码从 Matlab 移植到 C++,但在调整图像大小方面遇到了一些困难。我正在使用 OpenCV 在 C++ 中调整大小,但结果不匹配。我知道 Matlab 中的抗锯齿选项,但在
我正在将 MATLAB 代码传输到 python 中并尝试使用 OpenCV 函数 cv2.resize 缩小图像,但我从 MATLAB 输出中得到了不同的结果。 为确保我的代码在调整大小之前没有做错
document scipy.misc.imresize 表示 imresize 已弃用!请改用 skimage.transform.resize。但似乎 skimage.transform.resi
PIL/scipy.misc 中实现的imresize 似乎只适用于 uint8 图像 >>> import scipy.misc >>> im = np.random.rand(100,200) >
我是一名优秀的程序员,十分优秀!