【问题标题】:Erosion Function in JavaJava中的侵蚀函数
【发布时间】:2013-07-29 19:22:41
【问题描述】:

我必须将腐蚀方法应用于图像。 但是,我遇到了一些困难。 我从一个基本示例开始,但此时我图像的所有像素都将保持第一个像素的值。 如何解决这个问题?

public static int[] erosion(int array[])
{
    //int array1[] = new int[array.length];  
    // System.arraycopy(array, 0, array1, 0, array.length);          
    for(int i=1; i < array.length; i++)
    {
        if (array[i-1] < array[i]) {
            array[i] = array[i-1];
        }
        if (array[i+1] < array[i]) {
            array[i] = array[i+1];
        }
    }
    return array;       
}

【问题讨论】:

    标签: java bufferedimage imagefilter mathematical-morphology


    【解决方案1】:

    问题是数组中的前一个值已在下一次迭代时分配。对于就地替换,您可以尝试以下操作:

    int previous = array[0];
    for (int i = 0; i < array.length - 1; i++) {
        int res = Math.min(previous, array[i]);
        res = Math.min(res, array[i + 1]);
        previous = array[i];
        array[i] = res;
    }
    array[array.length - 1] = Math.min(previous, array[array.length - 1];
    

    编辑:扩展到第一个和最后一个值。

    【讨论】:

    • 感谢 kiheru 的帮助。
    • 但是,如果我想要array[i+2]和array[i+3],是一样的吗?
    • @FCoelho 你的意思是取更大面积的最小值吗?然后您需要保留更多先前的值(假设您还希望在计算中使用 array[i - n] ),这只保留一个(对应于您的问题中的 array[i - 1] )。在某些时候,只处理副本会变得更容易,就像 bas 的回答一样。
    • @FCoelho 另一种可能性是多次运行同一个循环。这与将最小值传播到更广泛的区域具有相同的效果。
    • @FCoelho 6 不适合计算邻居。如果您的意思是每边有 3 个值,那么最简单的方法是运行该循环三次。 (同样适用于不同的宽度;所以有一种简单的方法来配置过滤器)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    相关资源
    最近更新 更多