亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

圖像卷積不根據實際算法工作

圖像卷積不根據實際算法工作

慕工程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 關注
  • 137 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號