JAVA 图像处理基于OpenCv与JVM-----图像物体高亮显示(掩膜)

OpenCv提供了一个非常有用的函数叫做Canny,它可以高亮显示图像中的线条。

OpenCv的canny函数可以检测灰度矩阵中的轮廓。我们需要做的只是把输入的矩阵转换成灰度图像,剩下的由Canny完成。
             Canny函数包含以下参数:
             源矩阵
             目标矩阵
             低阈值,使用150.0
             高阈值,通常是低阈值的2倍或3倍
             光圈,3~7之间的一个奇数,我们使用3。光圈值越大,被检测到的轮廓越多
             L2梯度,暂时设置为true
Canny使用一个卷积矩阵包含一个核心像素和它的邻居像素,得到一个梯度值。如果梯度值大于高阈值,那么它就被检测为边界。如果梯度值在高阈值和低阈值之间,并且有个高阈值和它连接,那么它也会被保留。

通过Core类中的cvtColor函数,OpenCv可以很容易地改变颜色空间。

这篇文章中有关于灰度教程:JAVA 图像处理基于OpenCv与JVM-----加载保存图像

下面直接上代码:

import org.opencv.core.CvType;
import org.opencv.core.Core;
import org.opencv.core.Mat;
import origami.Origami;
import org.opencv.core.Scalar;
import org.opencv.imgproc.Imgproc;
import org.opencv.imgcodecs.Imgcodecs;
public class HelloCv {
    public static void main(String[] args) throws Exception {
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
      Mat tools = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.cvtColor(tools,tools,Imgproc.COLOR_RGB2GRAY);、、
      Imgproc.Canny(tools,tools,900,1100,5,true);
      Imgcodecs.imwrite("./images/dw-1.png",tools);
      Mat inverTools = tools.clone();
      Core.bitwise_not(inverTools, inverTools);
      Imgcodecs.imwrite("./images/dw.png",inverTools);
      Mat kittens = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.cvtColor(kittens,kittens,Imgproc.COLOR_RGB2GRAY);//转换颜色
      Imgproc.Canny(kittens,kittens,900,1100,5,true);
      Core.bitwise_not(kittens, kittens);//反色操作,让物体更容易辨认

        //生成掩膜图片
      Mat target = new Mat(kittens.height(),kittens.width(),CvType.CV_8UC3,new Scalar(0,0,255));
      Mat bg = Imgcodecs.imread("./images/dw.jpg");
      Imgproc.resize(bg,bg,target.size());
      bg.copyTo(target,kittens);
      Imgcodecs.imwrite("./images/target.png",target);
    }
}

猜你喜欢

转载自blog.csdn.net/JavaLLU/article/details/122782773