簡體   English   中英

矩陣乘法的問題(java)

[英]Trouble with matrix multiplication (java)

我正在使用卷積運算(功能圖),我有這個問題:

當我輸入一個正方形圖像時,代碼可以完美運行,並且輸出是圖像轉換后的圖像(一切正常)

這是代碼:

   long ImageMatrix[][] = new long[width][height];
   int CounterColumns = 0;

BufferedImage KernelImg = new BufferedImage(width-2,height-2,BufferedImage.TYPE_INT_ARGB);

  try {
        for (j = 0; j < height-2; j++) {
            for (k = 0; k < width-2; k++) {
                for (w = 0; w < 3; w++) {
                    for (v = 0; v < 3; v++) {
                        int Sj = j + w;
                        int Sv = v + CounterColumns;
                        sum += ImageMatrix[Sj][Sv] * Kernel[w][v];
                    }
                }

                int a = 255;
                int p = (a << 24) | (sum << 16) | (sum << 8) | sum;
                sum = 0;
                CounterColumns++;
                count++;
                KernelImg.setRGB(j, k, p);
            }
            CounterColumns = 0;

        }
    }
    catch(Exception e){
        System.out.println(e);
    }

上面的代碼是將內核矩陣(3x3矩陣)和圖像矩陣相乘的循環,這是內核矩陣的一個示例:

int Kernel[][] = {

            {-1,-1,-1},
            {-1,8,-1},
            {-1,-1,-1}

    };

問題是當我輸入矩形圖像時,系統停止工作並拋出此錯誤:

java.lang.ArrayIndexOutOfBoundsException:165

我已經在搜索此錯誤,但是我沒有找到能解決該問題的任何東西,而且我不知道為什么代碼會以正方形圖像運行而沒有問題,但是如果我輸入一個矩形,則會顯示錯誤。

謝謝你能幫我這個忙。

您的代碼是不對稱的:對列的處理與對行的處理不同; 就索引而言,它們應被視為相同:

try {
    for (j = 0; j < width-2; j++) {
        for (k = 0; k < height-2; k++) {
            for (w = 0; w < 3; w++) {
                for (v = 0; v < 3; v++) {
                    int Sj = j + w;
                    int Sv = k+v;
                    sum += ImageMatrix[Sj][Sv] * Kernel[w][v];
                }
            }


    }

您還必須正確使用索引:j的范圍是0..width-2,k的范圍是0..height-2

您必須以要處理的像素為中心。 這是灰度圖像的基本示例:

BufferedImage source = // A TYPE_BYTE_GRAY image
BufferedImage result = new BufferedImage(source.getWidth(), source.getHeight(), BufferedImage.TYPE_BYTE_GRAY) ;

try {
    for (int y=1 ; y < height-1 ; y++)
        for (int x=0 ; x < width-1; x++)
            {
            int sum = 0 ;
            for (int i=-1 ; i <= 1 ; i++)
                for (int j=-1 ; j <= 1 ; j++)
                    sum += source.getRaster().getSample(x, y, 0) * Kernel[i+1][j+1] ;
            result.getRaster().setSample(x, y, 0, sum) ;
            }
    }
catch (Exception e)
    {
    e.printStackTrace() ;
    }

在漸變的情況下,邊界的操作定義不明確(不同的解決方案,但沒有一個是一個好的解決方案),因此在此示例中,您最終使用零。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM