Java 图像内核筛选器未生成正确的结果

Java 图像内核筛选器未生成正确的结果,java,imagefilter,Java,Imagefilter,我写了一些代码来改变我的图像内核过滤器的尺寸。您可以选择3x3、5x5或7x7矩阵。问题是,当我切换到5x5或7x7时,只有前3行和前3列中的单元格工作。所以它们就像一个3x3矩阵。当我尝试使用5x5或7x7应用单位矩阵时,我知道它不起作用的一个例子是,在这里,除了中心单元格外,到处都是零,中心单元格将有一个1。对我来说,这会产生一个黑色的图像 下面是应用映像内核的代码 for (int y = 1; y < img.height-1; y++) { // Skip top and b

我写了一些代码来改变我的图像内核过滤器的尺寸。您可以选择3x3、5x5或7x7矩阵。问题是,当我切换到5x5或7x7时,只有前3行和前3列中的单元格工作。所以它们就像一个3x3矩阵。当我尝试使用5x5或7x7应用单位矩阵时,我知道它不起作用的一个例子是,在这里,除了中心单元格外,到处都是零,中心单元格将有一个1。对我来说,这会产生一个黑色的图像

下面是应用映像内核的代码

for (int y = 1; y < img.height-1; y++) {   // Skip top and bottom edges
    for (int x = 1; x < img.width-1; x++) {  // Skip left and right edges
          float sumR = 0; // Kernel sum for this pixel
          float sumG = 0; 
          float sumB = 0; 
      for (int ky = -1; ky <= 1; ky++) {
        for (int kx = -1; kx <= 1; kx++) {
          // Calculate the adjacent pixel for this kernel point
          int pos = (y + ky)*img.width + (x + kx);
          float rVal = red(img.pixels[pos]);
          float gVal = green(img.pixels[pos]);
          float bVal = blue(img.pixels[pos]);
          // Multiply adjacent pixels based on the kernel values
          sumR += kernel[ky+1][kx+1] * rVal;
          sumG += kernel[ky+1][kx+1] * gVal;
          sumB += kernel[ky+1][kx+1] * bVal; 
        }
      }
      //For this pixel in the new image, set the rgb value
      //based on the sum from the kernel
      edgeImg.pixels[y*img.width + x] = color(sumR,sumG,sumB);
    }
  }
for(int y=1;y对于(int ky=-1;ky如果我理解正确,您希望将此代码用于5x5和7x7内核

如果是这种情况,问题在于以下几行:

for (int ky = -1; ky <= 1; ky++) {
for (int kx = -1; kx <= 1; kx++) {
}

我还没有测试过这段代码,但是想法应该很清楚

// Calculate the distance from the center to the edge
int side_width = (kernel_size-1)/2

for (int y = side_width; y < img.height-side_width; y++) {   // Skip top and bottom edges
    for (int x = side_width; x < img.width-side_width; x++) {  // Skip left and right edges
      float sumR = 0; // Kernel sum for this pixel
      float sumG = 0; 
      float sumB = 0; 

for (int ky = 0; ky <= kernel_size - 1; ky++) {
    for (int kx = 0; kx <= kernel_size - 1; kx++) {
        // Calculate the adjacent pixel for this kernel point
        int pos = (y - side_width + ky)*img.width + (x - side_width + kx);
        float rVal = red(img.pixels[pos]);
        float gVal = green(img.pixels[pos]);
        float bVal = blue(img.pixels[pos]);
        // Multiply adjacent pixels based on the kernel values
        sumR += kernel[ky][kx] * rVal;
        sumG += kernel[ky][kx] * gVal;
        sumB += kernel[ky][kx] * bVal; 
    }
}

  //For this pixel in the new image, set the rgb value
  //based on the sum from the kernel
  edgeImg.pixels[y*img.width + x] = color(sumR,sumG,sumB);
}