美文网首页程序员
OpenCV(Java)实现不规则区域的模糊效果

OpenCV(Java)实现不规则区域的模糊效果

作者: voxer | 来源:发表于2018-07-11 09:14 被阅读116次

    OpenCV现在应用很广,它是轻量级的跨平台图形库,有几百个算法,还在不断增加中,大部分是C代码,所以可以用于各种平台。
    这边的需求是对很多图片的模糊化效果,但是是局部模糊而且是不规则的,一种是从上向下斜的,一种是先平的,然后再斜的,总之不是正经的矩形。

    1. 搭建环境

    我这里用OpenCV的Java版本来实现,首先下载OpenCV的WinPack ,因为本机是Win10,所以只需要2个文件 :

    image.png
    真正的功能实现在dll里,jar通过jni访问dll。如果在Linux下运行,需要下载opencv的源码编译成so文件,这个OpenCV官网有详细的步骤。

    注意dll或so需要放在系统变量java.library.path所在目录下,如果在eclipse下调试可以放在这个目录下:


    image.png

    最后在Eclipse下的项目目录结构是:


    image.png

    其中TestBlur是我们的实现,Smoothing是官方的一个例子

    2. 全图高斯模糊

    对于OpenCV来说,这个很简单,直接看代码

    // 全图模糊
        public static void TestAllBlur() {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            Mat src = Imgcodecs.imread("src.jpg");
            Mat dst = new Mat();
            Imgproc.GaussianBlur(src, dst, new Size(51, 51), 0);
    
            Imgcodecs.imwrite("dst.jpg", dst);
        }
    

    过程是把图片读成Matirx对象,然后处理成一个新的Mat对象后保存到新的图片。前后效果比较如下:


    image.png

    2. 局部矩形高斯模糊

    代码稍微改进一点

    // 局部矩形模糊
        public static void TestRectBlur() {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            Mat src = Imgcodecs.imread("src.jpg");
            //底部的1/6模糊
            Rect rect = new Rect(0, src.height() * 5 / 6, src.width(), src.height() / 6);
            // System.out.println(rect.toString());
            Mat dst = src.submat(rect);
            Imgproc.GaussianBlur(dst, dst, new Size(51, 51), 0);
    
            Imgcodecs.imwrite("dst.jpg", src);
        }
    

    根据矩形获取Mat对象的区域子对象也是Mat对象,然后模糊处理,最后再保存。前后效果比较如下:


    image.png

    2. 局部不规则区域高斯模糊

    直接处理肯定不行,需要一些变通,可以使用类似微积分的做法,把斜面区域分解成很多个并列的矩形,对每个矩形进行高斯模糊,从而实现不规则区域的模糊效果。

    image.png

    代码改动不大

    // 斜角模糊
        public static void TestDiagBlur() {
            System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    
            Mat src = Imgcodecs.imread("src.jpg");
            //底部的2/6斜斜到底部的1/6
            double _h = (double)src.height()/(6.0* src.width());//高度的步进值
            for (int i = 0; i < src.width(); i++) {
                //宽度为1,高度递减的矩形
                Rect rect = new Rect(i, (int) (2.0*src.height()/3.0 + i * _h), 1, (int) (src.height()/3.0 - i * _h));
                // System.out.println(rect.toString());
                Mat dst = src.submat(rect);
                Imgproc.GaussianBlur(dst, dst, new Size(51, 51), 0);
            }
            Imgcodecs.imwrite("dst.jpg", src);
        }
    

    最后的效果如下:


    image.png

    所有源码可以从Github上下载。

    相关文章

      网友评论

        本文标题:OpenCV(Java)实现不规则区域的模糊效果

        本文链接:https://www.haomeiwen.com/subject/odpcpftx.html