从图像样本中获取卷积矩阵?

时间:2015-10-22 21:37:07

标签: java algorithm image-processing convolution

我试图在Motorola Gallery App

上反编译滤镜的卷积矩阵

我使用以下代码读取像素数据:

public static void main(String[] foo) {
new JavaWalkBufferedImageTest1();
}

public void printPixelARGB(int pixel) {
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel) & 0xff;
System.out.println("argb: " + alpha + ", " + red + ", " + green + ", " + blue);
}

private void marchThroughImage(BufferedImage image) {
int w = image.getWidth();
int h = image.getHeight();
System.out.println("width, height: " + w + ", " + h);

for (int i = 0; i < h; i++) {
  for (int j = 0; j < w; j++) {
    System.out.println("x,y: " + j + ", " + i);
    int pixel = image.getRGB(j, i);
    printPixelARGB(pixel);
    System.out.println("");
  }
}
}

  public JavaWalkBufferedImageTest1() {
  try {
  // get the BufferedImage, using the ImageIO class
  BufferedImage image = 
    ImageIO.read(this.getClass().getResource("WhiteSpot.jpg"));
  marchThroughImage(image);
} catch (IOException e) {
  System.err.println(e.getMessage());
}
}

它提供所需的输出。 但这并没有引导我找到矩阵。

如何修改代码,以便我可以输入2个图像文件,Original&amp;过滤。并获得卷积矩阵。或者是否有我可以使用的在线工具,我上传了多个Original&amp;过滤样本,得到卷积矩阵?

1 个答案:

答案 0 :(得分:1)

我会接近这个问题(如果只应用了卷积,只会执行一次!),就像这样:

  1. 首先您需要找到矩阵大小。

    因此,您可以遍历所有可能的矩阵大小,或者使用一个期望零值的大型矩阵。这可能很慢,但您可以尝试从锐利的强度边缘的bluryness(到多少像素是颜色渗出)估计矩阵大小。

  2. 测试(大)矩阵大小尝试找零值

    因此对于每个测试的矩阵值形成2个数组。一个具有来自回旋图像的几个像素样本,另一个具有来自原始图像的像素(通过测试矩阵位置移位)。现在在两者之间计算correlation coefficient,如果没有显着的相关性,你可以假设矩阵中的值为零。

  3. 解决矩阵中剩余的非零值

    您可以用代数方式进行此操作(形成与您拥有的非零值一样多的等式(不要忘记选择具有不同颜色的像素)。或者您可以搜索以最小化矩阵和真实的回旋输出的误差/距离复杂的输出。你可以使用类似mine approx class in C++之类的东西,但是如果你的矩阵很大,那么这将花费很多时间。

  4. <强> [注释]

    如果只有单个卷积应用于图像,那么这很可能不起作用。

    卷积矩阵大多是方形的,并且在中间值附近对称,因此您可以计算出四分之一的值并反映其余的值...加快计算速度。

    另见Dealing with filters and colour's这是类似的问题。

    Bullet #2 可用于检测矩阵大小。通常,最大非零值位于矩阵的中心交叉点。

    0 0 2 0 0
    0 1 2 1 0
    2 2 3 2 2
    0 1 2 1 0
    0 0 2 0 0
    

    2是中心交叉,值3是卷积矩阵的中间值。因此,从x和y方向的中点开始计算#2 相关性。当达到零值时,您很可能处于卷积矩阵的边缘。所以你可以使用它作为矩阵大小(除非矩阵是一些奇怪的过滤器......)。

    此外,每个颜色通道都可以有自己的卷积矩阵,因此您可以按通道单独执行此操作(卷积可以在任何颜色空间中完成,而不仅仅是 RGB )。

    可能还有其他方法(我的胆量告诉我这应该由PCA解决)

    如果原始图像中有黑色区域,那么您可以使用它来更容易地找到矩阵的值(它将显着简化代数方法)