[英]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.