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;
    }

 

转载于:https://www.cnblogs.com/jnhs/p/11325340.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值