从图像样本中得到卷积矩阵



我试图反编译卷积矩阵的过滤器上的摩托罗拉画廊应用程序

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

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 &过滤样本,并得到卷积矩阵?

我将像这样处理这个问题(如果只应用卷积并且只有一次!):

  1. 首先你需要找到矩阵的大小

    所以你可以循环遍历所有可能的矩阵大小,或者使用一个大的矩阵,期望里面的值为零。这可能很慢,但你可以尝试从尖锐强度边缘的模糊度(到流出的颜色有多少像素)估计矩阵大小。

  2. 对于测试的(大)矩阵大小尝试找到零值

    所以对于每个被测试的矩阵值形成2个数组。一种是卷积图像的少量像素样本,另一种是原始图像的像素样本(通过测试的矩阵位置移位)。现在计算两者之间的相关系数,如果不存在显著的相关性,则可以假设矩阵中的值为零。

  3. 求解矩阵

    剩余非零值

    你可以用代数方法来做这个(你有多少个非零值就形成多少个方程(不要忘记选择不同颜色的像素)。或者你可以通过搜索来最小化卷积输出的误差/距离通过矩阵和实际的卷积输出。你可以使用类似于我的c++类的东西,但是如果你的矩阵很大,那么这将花费很多时间。

(笔记)

如果对图像应用不止一个卷积,那么这很可能不起作用。

卷积矩阵大多是方形和对称的中间值,所以你可以计算值的四分之一,并镜像其余的…加速计算。

参见处理滤镜和颜色,这是一个类似的问题。

子弹头#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为卷积矩阵的中值。所以开始计算#2从x和y方向的中点的相关性。当达到零值时你很可能在卷积矩阵的边缘。所以你可以用它作为矩阵大小(除非矩阵是一些奇怪的过滤器…)。

而且每个颜色通道都可以有自己的卷积矩阵,所以你可能应该在每个通道单独做这个(卷积可以在任何颜色空间中完成,而不仅仅是在RGB)。

可能有其他方法(我的直觉告诉我这应该是由PCA解决的)

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

最新更新