为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕工程0101907 2023-02-23 16:37:52
我已经在 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;    }}任何帮助表示赞赏!
查看完整描述

1 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

为了使它适应 RGB,算法应该在每个通道上完成,而不是在打包表示上完成,例如(未测试)


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;

}


查看完整回答
反对 回复 2023-02-23
  • 1 回答
  • 0 关注
  • 199 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号