我使用以下代码读取像素数据:
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;过滤样本,得到卷积矩阵?
答案 0 :(得分:1)
我会接近这个问题(如果只应用了卷积,只会执行一次!),就像这样:
首先您需要找到矩阵大小。
因此,您可以遍历所有可能的矩阵大小,或者使用一个期望零值的大型矩阵。这可能很慢,但您可以尝试从锐利的强度边缘的bluryness(到多少像素是颜色渗出)估计矩阵大小。
测试(大)矩阵大小尝试找零值
因此对于每个测试的矩阵值形成2个数组。一个具有来自回旋图像的几个像素样本,另一个具有来自原始图像的像素(通过测试矩阵位置移位)。现在在两者之间计算correlation coefficient,如果没有显着的相关性,你可以假设矩阵中的值为零。
解决矩阵中剩余的非零值
您可以用代数方式进行此操作(形成与您拥有的非零值一样多的等式(不要忘记选择具有不同颜色的像素)。或者您可以搜索以最小化矩阵和真实的回旋输出的误差/距离复杂的输出。你可以使用类似mine approx class in C++之类的东西,但是如果你的矩阵很大,那么这将花费很多时间。
<强> [注释] 强>
如果只有单个卷积应用于图像,那么这很可能不起作用。
卷积矩阵大多是方形的,并且在中间值附近对称,因此您可以计算出四分之一的值并反映其余的值...加快计算速度。
另见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解决)
如果原始图像中有黑色区域,那么您可以使用它来更容易地找到矩阵的值(它将显着简化代数方法)