首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >矩阵乘法问题(java)

矩阵乘法问题(java)
EN

Stack Overflow用户
提问于 2016-12-13 18:32:38
回答 2查看 293关注 0票数 0

我正在处理卷积运算(功能地图),我有一个问题:

当我输入一个正方形图像时,代码运行得很完美,输出就是转换的图像(一切都可以)

这是代码:

代码语言:javascript
复制
   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矩阵)和图像矩阵相乘的循环,这是内核矩阵的一个例子:

代码语言:javascript
复制
int Kernel[][] = {

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

    };

问题是,当我输入一个矩形图像时,系统停止工作,并抛出以下错误:

java.lang.ArrayIndexOutOfBoundsException: 165

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-13 19:11:32

您的代码是不对称的:您对列的处理方式与行不同;就索引而言,应该对它们进行相同的处理:

代码语言:javascript
复制
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.宽度-2,k在0.高度-2

票数 0
EN

Stack Overflow用户

发布于 2016-12-13 20:19:59

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

代码语言:javascript
复制
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() ;
    }

在渐变情况下,边界上的操作没有很好的定义(不同的解决方案,但没有一个是好的),因此在本例中,您将得到零。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41128157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档