javacv学习之实现matlab中imfill算法(孔洞填充)

javacv学习之实现matlab中imfill算法(孔洞填充)因生产需要计算图像的面积,首先第一步就是要先将图像中有洞的地方给它填上,网上找了半天说是matlab中的imfill算法就能直接填上,但我对matlab也不熟也不想用它,结果网上搜资料看看到很多C++的博主写的可以直接用opencv搞定,我一想opencv能搞定那肯定javacv也能搞,所以就有了下面的内容。废话不多说直接上代码publicstaticvoidmain(String[]args){System.loadLibrary(Core.NATIVE_LIBRAR

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

因生产需要计算图像的面积,首先第一步就是要先将图像中有洞的地方给它填上,网上找了半天说是matlab中的imfill算法就能直接填上,但我对matlab也不熟也不想用它,结果网上搜资料看看到很多C++的博主写的可以直接用opencv搞定,我一想opencv能搞定那肯定javacv也能搞,所以就有了下面的内容。

废话不多说直接上代码

 public static void main(String[] args) {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
        Mat src = Imgcodecs.imread("C:\\Users\\Administrator\\Desktop\\aa\\2020040113285386.jpg", Imgcodecs.IMREAD_GRAYSCALE);
        Mat out_th = new Mat();//二值化后的图像
        Imgproc.threshold(src, out_th, 220, 255, Imgproc.THRESH_BINARY_INV);//灰度图像二值化
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\out_th.jpg", out_th);

        Size lagerSize = new Size();//这里的mat要比原图周围大一个像素,这里是重点
        lagerSize.height = out_th.height() +2;
        lagerSize.width = out_th.width() +2 ;
        Mat lager = Mat.zeros(lagerSize,out_th.type());
        Mat lager1 = lager.rowRange(1,out_th.rows()+1).colRange(1,out_th.cols()+1);//将图片复制到大图的中间,
        out_th.copyTo(lager1);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager.jpg", lager);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager1.jpg", lager1);
        Mat newMat = out_th.clone();
        Imgproc.floodFill(newMat,lager,new Point(0,0),new Scalar(255));//漫水填充法填充 从0,0开始,有空洞的地方用255代替
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager_1.jpg", lager);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\lager1_1.jpg", lager1);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\out_th_1.jpg", out_th);
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\newMat.jpg", newMat);
        Mat inv_ = new Mat();
        Core.bitwise_not(newMat,inv_);//二值化图像取反
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\inv_.jpg", inv_);
        Mat or_ = new Mat();
        Core.bitwise_or(inv_,out_th,or_);//二值图像按位或
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\or_.jpg", or_);
        Mat or_inv = new Mat();
        Core.bitwise_not(or_,or_inv);//二值图像取反
        Imgcodecs.imwrite("C:\\Users\\Administrator\\Desktop\\aa\\or_inv.jpg", or_inv);
    }

解决思路参考:https://www.it610.com/article/1297086611263135744.htm

思路大致:

1.先将图片进行二值化处理

2.将图片向外延伸两个像素

3.调用漫水填充法填充

4.得到的图像在做相应的处理就得到填充的图像

最后这里附上原图和最终处理后的图像,中间的图可以自己处理一下就得到了。注意各个阶段图像像素的变化。

javacv学习之实现matlab中imfill算法(孔洞填充)

javacv学习之实现matlab中imfill算法(孔洞填充)

整理后的代码:

/**
     * 漫水填充法填补漏洞
     * @param src 原图进行二值化处理后的图像
     * @return 填补后输出的二值图
     */
    public static Mat floodFill(Mat src){
        Size lagerSize = new Size();//这里的mat要比原图周围大一个像素,这里是重点
        lagerSize.height = src.height() +2;
        lagerSize.width = src.width() +2 ;
        Mat lager = Mat.zeros(lagerSize,src.type());
        Mat lager1 = lager.rowRange(1,src.rows()+1).colRange(1,src.cols()+1);//将图片复制到大图的中间,
        src.copyTo(lager1);
        Mat src_clone = src.clone();
        Imgproc.floodFill(src_clone,lager,new Point(0,0),new Scalar(255));//漫水填充法填充 从0,0开始,有空洞的地方用255代替
        Mat src_clone_inv = new Mat();
        Core.bitwise_not(src_clone,src_clone_inv);//二值化图像取反
        Mat dst = new Mat();
        Core.bitwise_or(src_clone_inv,src,dst);//二值图像按位或
        return dst;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194617.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了

    deepfakes怎么用_黑科技▍如何使用 Deepfakes 给主播换脸?教程来了下面放教程:1.获取deepfakes工具包gitclonehttps://github.com/deepfakes/faceswap.git2.补齐依赖包:pipinstalltqdmpipinstallcv2pipinstallopencv-contrib-pythonpipinstalldlibpipinstallkeraspipinstalltensorfl…

    2022年5月26日
    61
  • 解决docker端口映射无法访问问题的方法_为什么有的网页无法访问

    解决docker端口映射无法访问问题的方法_为什么有的网页无法访问https://cloud.tencent.com/developer/article/1768097https://blog.csdn.net/li_101357/article/details/78415461

    2022年10月17日
    3
  • 服务器seo优化,SEO诊断之网站服务器优化「建议收藏」

    服务器seo优化,SEO诊断之网站服务器优化「建议收藏」前一章节子凡已经通过网站域名检查做过最基础的SEO诊断,接下来也是网站SEO诊断中最基础,也是较为重要的要素,没有域名,没有服务器,网站就无处容身,也就不会存在子凡分享的SEO话题了。一、网站服务器速度的重要性在网站速度方面我们要求自己的网站速度当然是越快越好,如果网站打开速度在5~40毫秒是为最佳效果。假设你的网站打开速度基本都在100ms左右,对于个人博客或者网站算是比较给力…

    2025年12月11日
    0
  • 蓝桥杯单片机必备知识—–(3)pcf8591–ADC

    蓝桥杯单片机必备知识—–(3)pcf8591–ADC

    2021年4月13日
    321
  • DM368开发 — 你需要了解的知识点

    DM368开发 — 你需要了解的知识点一、标清、高清、全高清、超清(超高清)的区别480×320,640×480标清1024x720p高清1920x1080i(隔行扫描)也属于高清1920x1080p全高清3840×2160,7680×4320超(高)清========================================480P、720P、1080P是什么意思?720P是美国电影电视工程师协会(SMPTE

    2022年8月13日
    4
  • 继电器驱动原理详解(Relay)[通俗易懂]

    继电器驱动原理详解(Relay)[通俗易懂]文章目录继电器内部结构继电器工作原理继电器应用入门进阶这样控制方式的好处继电器使用时注意事项毕设答辩常见问题1、为什么要在继电器线圈上并联一个二极管呢?2、并联的二极管为什么选择开关速度快的?3、电磁继电器和固态继电器(SSR)有什么区别啊?4、不加三极管,直接用单片机的IO提供继电器线圈的电流可以吗?5、继电器使用单片机的高电平触发好呢还是低电平触发好呢?电磁继电器(electromagneticrelay)是一种电子控制器件,它具有控制系统(输入回路)和被控制系统(输出回路),通常应用于自动控制电路

    2022年6月24日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号