我注意到 imresize 的抗鋸齒實作如下(contributions.m,第 12-13 行):
h = @(x) scale * kernel(scale * x);
kernel_width = kernel_width / scale;
這是核函式的尺度輸入和輸出,也是擴大核寬度,雖然它似乎有一些直觀的方面,例如根據尺度擴大核寬度。但是這個公式是如何顯式匯出的讓我很困惑,誰能詳細解釋一下這些代碼背后的原理?
uj5u.com熱心網友回復:
他們在https://blogs.mathworks.com/steve/2017/01/16/aliasing-and-image-resizing-part-3/ 中做了一些解釋。
如果你看一看,他們用一個信號重采樣的例子來解釋它。但它們也顯示了影像示例和用于插值的內核圖形。內核是三次插值,用于將影像修改為新的所需大小。但是,如果您想使用較小的尺寸,那么他們會使用新尺寸和先前尺寸(比例變數)的關系來修改三次插值。
h = @(x) scale * kernel(scale * x);
這種修改使得三次插值的峰值更小,寬度更大,所以這就是為什么使用它來存盤寬度值以備后用。由于 scale 是一個 < 1 的因子(他們使用一個if條件來確保它永遠不會 > 1),因此寬度擴展得更多。
kernel_width = kernel_width / scale;
隨著寬度更大,他們使用更多的像素來計算每個輸出像素(使影像更小是有意義的)。
% What is the maximum number of pixels that can be involved in the
% computation? Note: it's OK to use an extra pixel here; if the
% corresponding weights are all zero, it will be eliminated at the end
% of this function.
P = ceil(kernel_width) 2;
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/374897.html
