我正在Android Studio中构建文档扫描器应用程序,以演示我最近提出的算法。但是,在创建“ maxFilter”函数时遇到了问题,该函数应返回图像的每个n x n块的最大值。
由于我是Android Studio的新手,所以我尝试了与中值过滤器相同的编码结构:将Mat转换为1d数组>在每个窗口中查找最大值并另存为数组>将1d数组转换为Mat。
private Mat maxFilter(Mat src, int windowSize) {
Mat max = new Mat();
int size = (int) (src.total());
double[] d = new double[size];
double window[];
for (int j = 0; j < src.rows(); j++){
for (int i = 0; i < src.cols(); i++){
window = new double [windowSize * windowSize];
int count = 0;
for (int r = j - (windowSize / 2); r <= j + (windowSize / 2); r++){
for (int c = i - (windowSize / 2); c <= i + (windowSize / 2); c++) {
if (r < 0 || r >= src.rows() || c < 0 || c >= src.cols()) {
/** Some portion of the mask is outside the image. */
window[count] = 0;
} else {
window[count] = src.get(c, r)[0];
}
count++;
}
}
java.util.Arrays.sort(window);
d[i + j * src.cols()] = window[(windowSize*windowSize)-1];
}
}
for(int j = 0; j < src.rows(); j++) {
for (int i = 0; i < src.cols(); i++) {
src.put(i, j, d[i + j * src.cols()]);
Core.divide(src, new Scalar(255), max);
}
}
return max;
}
编辑器中没有显示错误消息,但是在实际电话上运行时,logcat中显示了致命异常。
java.lang.NullPointerException:尝试从空数组读取 在com.myapps.documentscanner.ImageProcessor.maxFilter(ImageProcessor.java:382)
指向行window[count] = src.get(c, r)[0];