Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 产生颜色光谱的卷积算子_Image Processing_Java 2d_Gaussian_Convolution - Fatal编程技术网

Image processing 产生颜色光谱的卷积算子

Image processing 产生颜色光谱的卷积算子,image-processing,java-2d,gaussian,convolution,Image Processing,Java 2d,Gaussian,Convolution,我一直在尝试制作自己的卷积运算符,而不是使用Java自带的内置运算符。我在这张图片上应用了内置的卷积算子 使用内置的卷积算子和高斯滤波器,我得到了这张图像。 现在,我使用我的代码运行相同的图像 public static int convolve(BufferedImage a,int x,int y){ int red=0,green=0,blue=0; float[] matrix = { 0.1710991401561097f, 0.2196956447338621f

我一直在尝试制作自己的卷积运算符,而不是使用Java自带的内置运算符。我在这张图片上应用了内置的卷积算子

使用内置的卷积算子和高斯滤波器,我得到了这张图像。

现在,我使用我的代码运行相同的图像

public static int convolve(BufferedImage a,int x,int y){
 int red=0,green=0,blue=0;
      float[] matrix = { 
 0.1710991401561097f, 0.2196956447338621f, 0.1710991401561097f, 
 0.2196956447338621f, 0.28209479177387814f, 0.2196956447338621f, 
 0.1710991401561097f, 0.2196956447338621f, 0.1710991401561097f, 
 };
      for(int i = x;i<x+3;i++){
          for(int j = y;j<y+3;j++){
              int color = a.getRGB(i,j);
              red += Math.round(((color >> 16) & 0xff)*matrix[(i-x)*3+j-y]);
              green += Math.round(((color >> 8) & 0xff)*matrix[(i-x)*3+j-y]);
              blue += Math.round(((color >> 0) & 0xff)*matrix[(i-x)*3+j-y]);

          }
      }

    return (a.getRGB(x, y)&0xFF000000) | (red << 16) | (green << 8) | (blue);
}
公共静态整数卷积(buffereImage a、整数x、整数y){
int红色=0,绿色=0,蓝色=0;
浮点[]矩阵={
0.1710991401561097f、0.2196956447338621f、0.1710991401561097f、,
0.2196956447338621f、0.28209479177387814f、0.2196956447338621f、,
0.1710991401561097f、0.2196956447338621f、0.1710991401561097f、,
};
对于(inti=x;i16)&0xff)*矩阵[(i-x)*3+j-y]);
绿色+=数学圆((颜色>>8)和0xff)*矩阵[(i-x)*3+j-y]);
蓝色+=数学圆((颜色>>0)和0xff)*矩阵[(i-x)*3+j-y]);
}
}

return(a.getRGB(x,y)&0xFF000000)|(red首先,您在循环的每个周期都不必要地(错误地)将结果从float转换为int。您的
红色
绿色
蓝色
应为float类型,并且仅在卷积后(转换回RGB时)才应转换回整数:

模糊卷积矩阵中的系数之和应为1.0。将此矩阵应用于图像时,可能会得到超过255的颜色。当这种情况发生时,通道“出血”到下一个通道(蓝色到绿色等)。 使用此矩阵的完全绿色图像将导致:

green = 255 * 1.8452741 ~= 471 = 0x01D7; rgb = 0xFF01D700; 如果没有,您需要添加一个检查,将通道的大小限制为255,并且不要让它们缠绕。例如:

if (red > 255.0f)
   red = 255.0f;
关于效率/优化:

速度上的差异可能是由这种不必要的强制转换和调用Math.Round来解释的,但更可能的候选者是您访问图像的方式。我对BuffereImage和Raster不够熟悉,无法为您提供访问底层图像缓冲区的最有效方式的建议。

首先,您是不必要的(并且错误地)在循环的每个周期将结果从浮点转换为int。您的
红色
绿色
蓝色
应为float类型,并且仅在卷积后(转换回RGB时)才应转换回整数:

模糊卷积矩阵中的系数之和应为1.0。将此矩阵应用于图像时,可能会得到超过255的颜色。当这种情况发生时,通道“出血”到下一个通道(蓝色到绿色等)。 使用此矩阵的完全绿色图像将导致:

green = 255 * 1.8452741 ~= 471 = 0x01D7; rgb = 0xFF01D700; 如果没有,您需要添加一个检查,将通道的大小限制为255,并且不要让它们缠绕。例如:

if (red > 255.0f)
   red = 255.0f;
关于效率/优化:
速度上的差异可能是由这种不必要的强制转换和调用Math.Round来解释的,但更可能的候选者是您访问图像的方式。我对BuffereImage和Raster不太熟悉,无法为您提供访问底层图像缓冲区的最有效方式的建议

if (red > 255.0f)
   red = 255.0f;