矩阵乘法的麻烦(java)

时间:2016-12-13 18:32:38

标签: java image-processing matrix matrix-multiplication convolution

我正在使用卷积操作(功能图),我遇到了这个问题:

当我输入一个方形图像时,代码运行完美,输出是图像转换(一切都好了)

这是代码:

   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

我已经搜索了这个错误,但我没有找到解决问题的任何东西,我不知道为什么代码运行时没有问题的方形图像,但如果我输入一个矩形的错误出现。

谢谢你能帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

您的代码是不对称的:您处理的列与行不同;就索引而言,它们都应该被对待:

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

答案 1 :(得分:0)

您必须以处理的像素为中心到内核。以下是灰度图像的基本示例:

   CAST(myColumn as CHAR(100)),
   LEFT(myColumn,100),
   SUBSTRING(myColumn,0,100)

在渐变的情况下,边界上的操作没有很好地定义(不同的解决方案,但没有一个是好的),所以在这个例子中你最终得到零。