opencv4 java 验证码噪点 8邻域降噪
工程下载地址https://download.csdn.net/download/qq_16596909/11503962
程序运行后,同样会把图片存放在以下路径
首先来看一下原图
二值化后,可以把这些颜色都去掉
噪点还是非常多的,不太利于识别
所以还需要降噪
至于什么连通域 水波填充,网上没有opencv+java的案例
所以采用8邻域降噪
可以看到效果还可以,把单个像素的噪点都消除了
还有大块的噪点无法解决
这种,计算连通域然后再消除,应该没问题
不过目前还不会
看代码
首先需要去边框
private org.opencv.core.Mat removeBorder(org.opencv.core.Mat target) { int row = target.rows();//获取行 int col = target.cols();//获取列数 for (int i = 0; i < col; i++) { target.put(0, i, 255);//第一行 target.put(row - 1, i, 255);//最后一行 } for (int i = 0; i < row; i++) { target.put(i, 0, 255);//第一列,左边框 target.put(i, col - 1, 255);//最后一列 } 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 = 1; x < col - 1; x++) { for (int y = 1; y < row - 1; y++) { double[] binDataList = target.get(y, x); double binData = binDataList[0]; if (binData == 0) {//黑色 double[] x1list = target.get(y - 1, x - 1); double[] x2list = target.get(y - 1, x); double[] x3list = target.get(y - 1, x + 1); double[] x4list = target.get(y, x - 1); double[] x6list = target.get(y, x + 1); double[] x7list = target.get(y + 1, x - 1); double[] x8list = target.get(y + 1, x); double[] x9list = target.get(y + 1, x + 1); double x1 = x1list[0]; double x2 = x2list[0]; double x3 = x3list[0]; double x4 = x4list[0]; double x6 = x6list[0]; double x7 = x7list[0]; double x8 = x8list[0]; double x9 = x9list[0]; if (x1 + x2 + x3 + x4 + x6 + x7 + x8 + x9 >= 2040) { target.put(y, x, 255);//画一个白点 } } } } return target; }