首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Matlab:使用自定义插值内核Mitchell-Netravali调整大小

Matlab:使用自定义插值内核Mitchell-Netravali调整大小
EN

Stack Overflow用户
提问于 2017-01-31 17:26:56
回答 2查看 542关注 0票数 0

我已经看到,人们对调整大小的自定义插值内核(MATLAB imresize with a custom interpolation kernel)很感兴趣。有没有人实现了参数化的Mitchell-Netravali内核1,它在ImageMagick中被默认使用,并且愿意分享Matlab1的代码?非常感谢!

1

代码语言:javascript
运行
复制
// Mitchell Netravali Reconstruction Filter
// B = 0    C = 0   - Hermite B-Spline interpolator 
// B = 1,   C = 0   - cubic B-spline
// B = 0,   C = 1/2 - Catmull-Rom spline
// B = 1/3, C = 1/3 - recommended

float MitchellNetravali(float x, float B, float C)
{
 float ax = fabs(x);
 if (ax < 1) {
 return ((12 - 9 * B - 6 * C) * ax * ax * ax +
        (-18 + 12 * B + 6 * C) * ax * ax + (6 - 2 * B)) / 6;
} else if ((ax >= 1) && (ax < 2)) {
  return ((-B - 6 * C) * ax * ax * ax +
          (6 * B + 30 * C) * ax * ax + (-12 * B - 48 * C) *
          ax + (8 * B + 24 * C)) / 6;
} else {
  return 0;
 }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-27 19:34:32

这里我得到了另一种矢量化的方法;根据我的放大测试(1000x1000 -> 3000x3000),即使在大米歇尔半径=6的情况下,这也比标准的双三次曲线快:

代码语言:javascript
运行
复制
function [outputs] = Mitchell_vect(x,M_B,M_C)
   outputs= zeros(size(x,1),size(x,2)); 
   ax = abs(x);
   temp = ((12-9*M_B-6*M_C) .* ax.^3 + (-18+12*M_B+6*M_C) .* ax.^2 + (6-2*M_B))./6;
   temp2 = ((-M_B-6*M_C) .* ax.^3 + (6*M_B+30*M_C) .* ax.^2 + (-12*M_B-48*M_C) .* ax + (8*M_B + 24*M_C))./6;
   index = find(ax<1);
   outputs(index)=temp(index);
   index = find(ax>=1 & ax<2);
   outputs(index)=temp2(index);
end
票数 1
EN

Stack Overflow用户

发布于 2017-02-25 19:31:19

对于Mitchel内核,我使用参数B和C以及使用for-loops (和预分配)的内核半径来调用imresize,得到了以下建议:

代码语言:javascript
运行
复制
img_resize = imresize(img, [h w], {@(x)Mitchell(x,B,C),radius}); 

function [outputs] = Mitchell(x,B,C)
outputs= zeros(size(x,1),size(x,2)); 
    for i = 1 : size(x,1)
        for j = 1 : size(x,2)
            ax = abs(x(i,j));
            if ax < 1
                outputs(i,j) = ((12-9*B-6*C) * ax^3 + (-18+12*B+6*C) * ax^2 + (6-2*B))/6;
            elseif (ax >= 1) && (ax < 2)
                outputs(i,j) = ((-B-6*C) * ax^3 + (6*B+30*C) * ax^2 + (-12*B-48*C) * ax + (8*B + 24*C))/6;
            else 
                outputs(i,j) = 0;
            end
        end
    end
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41953857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档