【问题标题】:Oblique stripes resulting from bilinear interpolation双线性插值产生的斜条纹
【发布时间】:2012-04-27 12:31:14
【问题描述】:

我正在尝试在 GNU Octave 中编写一个对 PGM 图像进行双线性插值的函数。结果不是那么好:我在图像上不断出现不同色调的斜条纹。此外,在插值期间添加的行和列比它们应该的要暗。有人可以通过指出问题来帮助我吗?

function bilinear(img)
    data = imread(img);

    for n = 1 : 2 : (rows(data) - 1)  * 2
        average = average_vector(data(n, 1:end), data(n+1:1:end));
        data = [data(1:n, 1:end); average; data(n+1:rows(data), 1:end)];
    end

    for n = 1 : 2 : (columns(data) - 1) * 2
        average = average_vector(data(1:rows(data), n), data(1:rows(data), n+1));
        data = [data(1:rows(data), 1:n) average data(1:rows(data), n+1:end)];
    end

    imwrite(data, strcat("out_bilinear_", img));
end

function res = average_vector(a, b)
    res = zeros(size(a));
    for n = 1 : length(a)
        res(n) = (a(n) + b(n)) / 2;
    end
end

这是显示问题的图片:

【问题讨论】:

    标签: matlab image-processing interpolation octave


    【解决方案1】:

    您正在逐行(或逐列)迭代输入图像,但会在执行过程中插入新行(或列)。我很确定这会搞砸你的索引。

    我建议创建一个新的输出矩阵,而不是修改原始矩阵。这也会相当快。

    顺便说一句,您的average_vector 函数可以简单地写成res = (a + b) / 2;

    【讨论】:

    • 感谢您指出我可以做到(a + b) / 2 而不需要average_vector。问题是冒号而不是逗号:这个data(n+1:1:end) 而不是这个data(n+1, 1:end)。现在可以了。我知道这不是很有效,但在这一点上它并不重要。
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    相关资源
    最近更新 更多