所以在我的代码中,我将图像表示为1和0的双int [] []数组。我希望能够将图像缩小为更小的int [] []数组。这是我想要做的一个例子:
0000000000
0000000000 00000
0000110000 00100
0000110000 => 00100
0000110000 01110
0000110000 00000
0011111100 00000
0000000000
0000000000
0000000000
是否有任何图书馆可以为我做这样的事情?或者关于如何编写代码来为我做这个的任何想法。这将是我正在寻找的方法原型:
int[][] reduceImage(int[][] image, double scaleOfReduction) {
// somehow make image reduced
// how to implement this efficiently???
return reducedImage;
}
答案 0 :(得分:0)
这是一个简单的代码片段,应该按照您的意图执行。
int[][] reduceImage(int[][] image, int scale) {
int[][] reducedImage = new int[image.length/scale][image[0].length/scale];
for (int i=0;i<reducedImage.length;i++) {
for (int j=0;j<reducedImage[0].length;j++) {
int total = 0;
for (int x=0;x<scale;x++) {
for (int y=0;y<scale;y++) {
total += image[i*scale+x][j*scale+y];
}
}
reducedImage[i][j] = total>(scale*scale/2) ? 1 : 0;
}
}
return reducedImage;
}
首先我们创建一个新的图像数组:
int[][] reducedImage = new int[image.length/scale][image[0].length/scale];
然后我们遍历这个新图像中的每个像素:
for (int i=0;i<reducedImage.length;i++) {
for (int j=0;j<reducedImage[0].length;j++) {
然后,对于每个新像素,我们计算旧图像的像素数:
int total = 0;
for (int x=0;x<scale;x++) {
for (int y=0;y<scale;y++) {
total += image[i*scale+x][j*scale+y];
}
}
然后我们检查至少有一半的旧像素是否打开,然后打开新像素。否则我们会关闭此像素:
reducedImage[i][j] = total>(scale*scale/2) ? 1 : 0;
最后,我们返回新图片:
return reducedImage;
这可能不是缩小图像的最佳方法,但它非常简单易懂。