【发布时间】:2015-10-23 18:41:04
【问题描述】:
为了对齐两个灰度图像的强度值(作为进一步处理的第一步),我编写了一个 Java 方法:
-
将两个图像的位图转换为两个包含位图强度的
int[]数组(我这里只取红色分量,因为它是灰度的,即 r=g=b )。public static int[] bmpToData(Bitmap bmp){ int width = bmp.getWidth(); int height = bmp.getHeight(); int anzpixel = width*height; int [] pixels = new int[anzpixel]; int [] data = new int[anzpixel]; bmp.getPixels(pixels, 0, width, 0, 0, width, height); for (int i = 0 ; i < anzpixel ; i++) { int p = pixels[i]; int r = (p & 0xff0000) >> 16; //int g = (p & 0xff00) >> 8; //int b = p & 0xff; data[i] = r; } return data; } -
将位图 2 的累积强度分布与位图 1 的累积强度分布对齐
//aligns the intensity distribution of a grayscale picture moving (given by int[] //data2) the the intensity distribution of a reference picture fixed (given by // int[] data1) public static int[] histMatch(int[] data1, int[] data2){ int anzpixel = data1.length; int[] histogram_fixed = new int[256]; int[] histogram_moving = new int[256]; int[] cumhist_fixed = new int[256]; int[] cumhist_moving = new int[256]; int i=0; int j=0; //read intensities of fixed und moving in histogram for (int n = 0; n < anzpixel; n++) { histogram_fixed[data1[n]]++; histogram_moving[data2[n]]++; } // calc cumulated distributions cumhist_fixed[0]=histogram_fixed[0]; cumhist_moving[0]=histogram_moving[0]; for ( i=1; i < 256; ++i ) { cumhist_fixed[i] = cumhist_fixed[i-1]+histogram_fixed[i]; cumhist_moving[i] = cumhist_moving[i-1]+histogram_moving [i]; } // look-up-table lut[]. For each quantile i of the moving picture search the // value j of the fixed picture where the quantile is the same as that of moving int[] lut = new int[anzpixel]; j=0; for ( i=0; i < 256; ++i ){ while(cumhist_fixed[j]< cumhist_moving[i]){ j++; } // check, whether the distance to the next-lower intensity is even lower, and if so, take this value if ((j!=0) && ((cumhist_fixed[j-1]- cumhist_fixed[i]) < (cumhist_fixed[j]- cumhist_fixed[i]))){ lut[i]= (j-1); } else { lut[i]= (j); } } // apply the lut[] to moving picture. i=0; for (int n = 0; n < anzpixel; n++) { data2[n]=(int) lut[data2[n]]; } return data2; } -
将
int[]数组转换回位图。public static Bitmap dataToBitmap(int[] data, int width, int heigth) { int index=0; Bitmap bmp = Bitmap.createBitmap(width, heigth, Bitmap.Config.ARGB_8888); for (int x = 0; x < width; x++) { for (int y = 0; y < heigth; y++) { index=y*width+x; int c = data[index]; bmp.setPixel(x,y,Color.rgb(c, c, c)); } } return bmp; }
虽然核心过程 2) 简单快速,但转换步骤 1) 和 3) 的效率相当低。在 Renderscript 中完成整个事情会非常酷。但是,老实说,由于缺少文档,我完全迷失了这样做,虽然有很多关于 Renderscript 可以执行的令人印象深刻的示例,但我看不到从这些可能性中受益的方法(没有书籍,没有文档)。任何建议都非常感谢!
【问题讨论】:
-
你的问题到底是什么?
-
至少向我们展示您的 Java 代码,以便我们知道您想在 Renderscript 中实现什么。
-
抱歉不准确。我已经包含了上面的代码,但不幸的是没有设法使布局正确。简而言之,问题如下。不是首先将两个 Bitmap 转换为 int[] 数组 (1.),而是对两个 int[] 数组 (2.) 进行实际的直方图匹配并将(匹配的)int [] 数组转换回 Bitmap (3.),我想在 Renderscript 中将所有这些作为一个过程完成,即 2 个位图输入和 1 个位图(匹配的)输出。
标签: android histogram matching renderscript