java - 图像卷积不根据实际算法工作

标签 java image-processing convolution

我已经在 java 中实现了一个卷积过滤器。我在 ap cs 中做过一段时间,但现在我确实需要它来做某事,所以我重新实现了它以确保我仍然知道如何去做。不幸的是,我丢失了我的工作副本,所以我无法将当前代码与我以前的工作代码进行比较。我很确定我正确地实现了算法,但代码仍然无法正常工作。有经验的程序员能解释一下我做错了什么吗。

这是卷积类:

import java.awt.*;
import java.util.Arrays;

public class ConvolutionFilter {

    private int[][] image;
    private int[][] weights;
    private double[][] doubleWeights;

    private int[][] convolved;

    public ConvolutionFilter(int[][] image, int[][] weights) {

        this.image = image;
        this.weights = weights;

        convolve();
    }

    public void convolve() {

        int sum;
        int[][] convolved = new int[image.length][image[0].length];

        for (int r = 0; r < convolved.length - weights.length - 1; r++) {
            for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
                sum = 0;
                for (int i = 0; i < weights.length; i++) {
                    for (int j = 0; j < weights[i].length; j++) {
                        sum += image[r + i][c + j] * weights[i][j];
                    }
                }
                convolved[r][c] = sum / weight();
            }
        }

        this.convolved = convolved;
    }

    public int numWeights() {
        return weights.length * weights[0].length;
    }

    public int weight() {
        int sum = 0;
        for (int r = 0; r < weights.length; r++) {
            for (int c = 0; c < weights[r].length; c++) {
                sum += weights[r][c];
            }
        }
        if (sum == 0) return 1; else return sum;
    }

    public int[][] getConvolved() {
        return convolved;
    }

}

感谢任何帮助!

最佳答案

为了使其适应 RGB,算法应该针对每个 channel 进行,而不是在打包表示上进行,例如(未测试)

public void convolve() {
    int[][] convolved = new int[image.length][image[0].length];
    double invScale = 1.0 / weight();

    for (int r = 0; r < convolved.length - weights.length - 1; r++) {
        for (int c = 0; c < convolved[r].length - weights.length - 1; c++) {
            int rsum = 0, gsum = 0, bsum = 0;
            for (int i = 0; i < weights.length; i++) {
                for (int j = 0; j < weights[i].length; j++) {
                    int pixel = image[r + i][c + j];
                    int w = weights[i][j];
                    rsum += ((pixel >> 16) & 0xFF) * w;
                    gsum += ((pixel >> 8) & 0xFF) * w;
                    bsum += (pixel & 0xFF) * w;
                }
            }
            rsum = (int)(rsum * invScale);
            gsum = (int)(gsum * invScale);
            bsum = (int)(bsum * invScale);
            convolved[r][c] = bsum | (gsum << 8) | (rsum << 16) | (0xFF << 24);
        }
    }

    this.convolved = convolved;
}

关于java - 图像卷积不根据实际算法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56815133/

相关文章:

android - 如何提取图像中的红色/绿色像素

matlab - 绘制霍夫变换 MATLAB

numpy - 在 scipy 中对不均匀间隔的向量进行卷积

python - 卷积模糊图像-python

java - Docker 失败,子进程/usr/bin/dpkg 返回错误代码 (1)

python - 提高图像亮度不溢出

java - Log4j Jboss配置

matlab - 矩阵与子矩阵之间的反卷积

java - 从线程中的 Pixmap 对象创建纹理时,纹理为空

java - Spring 3.1 的 Jackson 1.9 配置(全局设置日期格式)