工程下载地址https://download.csdn.net/download/qq_16596909/11503962

opencv4 java 验证码噪点 8邻域降噪-LMLPHP

程序运行后,同样会把图片存放在以下路径

opencv4 java 验证码噪点 8邻域降噪-LMLPHP

首先来看一下原图

opencv4 java 验证码噪点 8邻域降噪-LMLPHP

二值化后,可以把这些颜色都去掉

opencv4 java 验证码噪点 8邻域降噪-LMLPHP

噪点还是非常多的,不太利于识别

所以还需要降噪

至于什么连通域 水波填充,网上没有opencv+java的案例

所以采用8邻域降噪

opencv4 java 验证码噪点 8邻域降噪-LMLPHP

可以看到效果还可以,把单个像素的噪点都消除了

还有大块的噪点无法解决

这种,计算连通域然后再消除,应该没问题

不过目前还不会

看代码

首先需要去边框

private org.opencv.core.Mat removeBorder(org.opencv.core.Mat target) {
int row = target.rows();//获取行
int col = target.cols();//获取列数
for (int i = ; i < col; i++) {
target.put(, i, );//第一行
target.put(row - , i, );//最后一行
}
for (int i = ; i < row; i++) {
target.put(i, , );//第一列,左边框
target.put(i, col - , );//最后一列
}
return target;
}

然后8邻域去噪点

  private org.opencv.core.Mat removeNoisePixel(org.opencv.core.Mat target, double pNum) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
int col = target.cols();
int row = target.rows();
//因为去了边框,所以,行列数,做减2处理,即不处理边框上的像素
for (int x = ; x < col - ; x++) {
for (int y = ; y < row - ; y++) {
double[] binDataList = target.get(y, x);
double binData = binDataList[]; if (binData == ) {//黑色
double[] x1list = target.get(y - , x - );
double[] x2list = target.get(y - , x);
double[] x3list = target.get(y - , x + );
double[] x4list = target.get(y, x - );
double[] x6list = target.get(y, x + );
double[] x7list = target.get(y + , x - );
double[] x8list = target.get(y + , x);
double[] x9list = target.get(y + , x + );
double x1 = x1list[];
double x2 = x2list[];
double x3 = x3list[];
double x4 = x4list[];
double x6 = x6list[];
double x7 = x7list[];
double x8 = x8list[];
double x9 = x9list[];
if (x1 + x2 + x3 + x4 + x6 + x7 + x8 + x9 >= ) { target.put(y, x, );//画一个白点
}
}
}
}
return target;
}
05-26 20:48