gpt4 book ai didi

c++ - MATLAB vs C++ vs OpenCV - imresize

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:08 24 4
gpt4 key购买 nike

我有以下 MATLAB 代码,我想将其转换为 C++

假设 Gr 是二维矩阵并且 1/newscale == 0.5

Gr = imresize(Gr, 1 / newScale);

the MATLAB documentation :

B = imresize(A, scale) returns image B that is scale times the size of A. The input image A can be a grayscale, RGB, or binary image. If scale is between 0 and 1.0, B is smaller than A. If scale is greater than 1.0, B is larger than A.

所以这意味着我将得到一个二维矩阵 == matrix_width/2 和 matrix_height/2
我如何计算这些值?根据文档的默认值来自最近 4X4 的三次插值。

我找不到执行相同操作的 C++ 示例代码。您能否提供此类代码的链接?

我还找到了this OpenCV function, resize .

它和 MATLAB 的一样吗?

最佳答案

是的,请注意 MATLAB 的 imresizeanti-aliasing enabled by default :

imresize(A,scale,'bilinear')

对比使用没有抗锯齿的 cv::resize() 会得到什么:

imresize(A,scale,'bilinear','AntiAliasing',false)

正如 Amro 提到的,MATLAB 中的默认值是 bicubic,因此请务必指定。

双线性

无需修改代码即可通过双线性插值获得匹配结果。

示例 OpenCV 片段:

cv::Mat src(4, 4, CV_32F);
for (int i = 0; i < 16; ++i)
src.at<float>(i) = i;

std::cout << src << std::endl;

cv::Mat dst;
cv::resize(src, dst, Size(0, 0), 0.5, 0.5, INTER_LINEAR);

std::cout << dst << std::endl;

输出(OpenCV)

[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]

[2.5, 4.5;
10.5, 12.5]

MATLAB

>> M = reshape(0:15,4,4).';
>> imresize(M,0.5,'bilinear','AntiAliasing',true)
ans =
3.125 4.875
10.125 11.875
>> imresize(M,0.5,'bilinear','AntiAliasing',false)
ans =
2.5 4.5
10.5 12.5

请注意,结果与关闭抗锯齿的结果相同。

双三次差分

但是,在 'bicubic'INTER_CUBIC 之间,由于加权方案不同,结果不同! See here有关数学差异的详细信息。问题出在计算三次插值系数的 interpolateCubic() 函数中,其中使用常数 a = -0.75 而不是 a = -0.5 就像在 MATLAB 中一样。但是,如果您编辑 imgwarp.cpp 并更改代码:

static inline void interpolateCubic( float x, float* coeffs )
{
const float A = -0.75f;
...

到:

static inline void interpolateCubic( float x, float* coeffs )
{
const float A = -0.50f;
...

并重建 OpenCV(提示:在较短的编译时间内禁用 CUDA 和 gpu 模块),然后您会得到相同的结果:

MATLAB

>> imresize(M,0.5,'bicubic','AntiAliasing',false)
ans =
2.1875 4.3125
10.6875 12.8125

OpenCV

[0, 1, 2, 3;
4, 5, 6, 7;
8, 9, 10, 11;
12, 13, 14, 15]
[2.1875, 4.3125;
10.6875, 12.8125]

关于立方体的更多信息 HERE .

关于c++ - MATLAB vs C++ vs OpenCV - imresize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26812289/

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