OPenCv java 形态学操作(12)

创建图片

	Mat mat=new Mat();
	mat.create(new Size(516,516),CvType.CV_8UC3);
	Imgproc.putText(mat, "hello I'm wdg!", new 
    Point(50,mat.cols()/2),Imgproc.FONT_HERSHEY_PLAIN,4, new Scalar(255,255,255),2);

创建出来的结果如下:

形态学操作函数

Imgproc.morphologyEx(src, dst, op, kernel);

  • src:输入图像
  • dst:输出图像
  • op:模式
  • kernel:卷积核(和上一篇一样的获取方法)

这里的模式(op)有以下几种:

  • MORPH_ERODE = 0:腐蚀
  • MORPH_DILATE = 1:膨胀
  • MORPH_OPEN = 2:开操作
  • MORPH_CLOSE = 3:闭操作
  • MORPH_GRADIENT = 4:基本梯度
  • MORPH_TOPHAT = 5:顶帽
  • MORPH_BLACKHAT = 6:黑帽

膨胀和腐蚀

这个我们好理解,我们对上面创建的图片进行膨胀和腐蚀

		Mat mat=new Mat();
		mat.create(new Size(516,516),CvType.CV_8UC3);
		Imgproc.putText(mat, "hello I'm wdg!", new Point(50,mat.cols()/2),Imgproc.FONT_HERSHEY_PLAIN,4, new Scalar(255,255,255),2);
		
		Mat dst=new Mat();
		Mat dilate=new Mat();
		Mat kernel=Imgproc.getStructuringElement(Imgproc.CV_SHAPE_CROSS, new Size(3,3));
		Imgproc.morphologyEx(mat, dst, Imgproc.MORPH_ERODE, kernel);
		Imgproc.morphologyEx(mat, dilate, Imgproc.MORPH_DILATE, kernel);

		HighGui.imshow("原图", mat);
		HighGui.imshow("原图腐蚀", dst);
		HighGui.imshow("原图膨胀", dilate);

		HighGui.waitKey(0);

效果:

显然可以看到 的是在膨胀之后整个字体都变粗了,但是在腐蚀之后整个字体变的很细

我们来看看元素是怎样变化的:

通过矩阵元素的变化,我们可以看到元素255的数据的多少,来判断线条的粗细

开操作和闭操作

	Mat mat = new Mat();
		mat.create(new Size(516, 516), CvType.CV_8UC3);
		Imgproc.putText(mat, "hello I'm wdg!", new Point(50, mat.cols() / 2), Imgproc.FONT_HERSHEY_PLAIN, 16,new Scalar(255, 255, 255), 2);

		double d[]=new double[3];
        d[0]=255;
        d[1]=125;
        d[2]=86;
		
		mat.put(150, 260,d);
		mat.put(150, 261,d);
		mat.put(150, 262,d);
		
		Mat dst = new Mat();
		Mat dilate = new Mat();
		Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_CROSS, new Size(3, 3));
		Imgproc.morphologyEx(mat, dst, Imgproc.MORPH_CLOSE, kernel);
		Imgproc.morphologyEx(mat, dilate, Imgproc.MORPH_OPEN, kernel);

		File file = new File("D:\\360MoveData\\Users\\lxn\\Desktop\\opencvtest");

		if (!file.exists()) {
			file.mkdir();
		}
		String filename1 = "1.txt";

		File file1 = new File(file.getAbsoluteFile() + "//" + filename1);
		if (!file1.exists()) {
			file1.createNewFile();
		}

		FileWriter fw = new FileWriter(file1);

		fw.write("核:");
		fw.write("\n");
		fw.write(kernel.dump());

		fw.write("原图:");
		fw.write("\n");

		fw.write(mat.submat(145, 160, 258, 300).dump());

		fw.write("腐蚀:");
		fw.write("\n");

		fw.write(dst.submat(145, 160, 258, 300).dump());

		fw.write("膨胀");
		fw.write("\n");

		fw.write(dilate.submat(145, 160, 258, 300).dump());

		fw.close();

		HighGui.imshow("原图", mat);
		HighGui.imshow("原图闭操作", dst);
		HighGui.imshow("原图开操作", dilate);

		HighGui.waitKey(0);

我们在程序中伪造一些噪点,看开操作和闭合操作对噪点的影响

在原图中的噪点,开操作之后噪点看不到了

从数据元素上看,开操作将噪点直接去除了,但是我们看出来闭操作原图有什么影响

看来还是明显的,如果内核设置为7x7

我是datouniao这几个字体根本就没有了

从元素上变化是这样的:

上面的红线有什么样的变化,在闭操作前后,整个图像更加的紧凑了,也就是临近大小的元素更加的紧凑

获取这样还不够明显

我们这样来看

黑色的线条就像是红色方框上的嘴巴,直接闭合了,剩下红色的方框

黑帽和顶帽

		Mat kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_CROSS, new Size(3, 3));
	
		Imgproc.morphologyEx(src, dst2, Imgproc.MORPH_BLACKHAT, kernel);
	
		Imgproc.morphologyEx(src, dst, Imgproc.MORPH_TOPHAT, kernel);
		

除了黑帽和顶帽的操作之外,还有其他的梯度操作和焊接操作

            MORPH_ERODE = 0,
            MORPH_DILATE = 1,
            MORPH_OPEN = 2,
            MORPH_CLOSE = 3,
            MORPH_GRADIENT = 4,
            MORPH_TOPHAT = 5,
            MORPH_BLACKHAT = 6,
            MORPH_HITMISS = 7;

梯度操作和焊接操作

我们来看其中形态的变化

换一张图:

感觉梯度操作让整个图像更加的线条明显

上面就是我们对图像形态的一种操作,希望对你有所帮助

 

Java OpenCV是一个开源的计算机视觉库,它提供了丰富的图像处理和计算机视觉算法。膨胀和腐蚀是OpenCV中常用的图像处理操作之一,用于改变图像的形状和结构。 膨胀(Dilation)是一种图像形态学操作,它通过将图像中的物体边界向外扩展来增加物体的大小。膨胀操作可以用于填充图像中的空洞、连接相邻的物体以及增加物体的大小。 腐蚀(Erosion)是一种图像形态学操作,它通过将图像中的物体边界向内收缩来减小物体的大小。腐蚀操作可以用于去除图像中的噪声、分离相邻的物体以及减小物体的大小。 在Java OpenCV中,可以使用`Imgproc.dilate()`方法进行膨胀操作,使用`Imgproc.erode()`方法进行腐蚀操作。这两个方法都需要传入源图像和输出图像作为参数,并可以设置膨胀或腐蚀的内核大小和形状。 以下是一个简单的示例代码,演示了如何在Java OpenCV中进行膨胀和腐蚀操作: ```java import org.opencv.core.Core; import org.opencv.core.Mat; import org.opencv.core.Size; import org.opencv.core.CvType; import org.opencv.core.MatOfFloat; import org.opencv.core.MatOfInt; import org.opencv.core.Scalar; import org.opencv.imgcodecs.Imgcodecs; import org.opencv.imgproc.Imgproc; public class DilationErosionExample { public static void main(String[] args) { // 加载OpenCV库 System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // 读取源图像 Mat srcImage = Imgcodecs.imread("path/to/source/image.jpg"); // 创建输出图像 Mat dilatedImage = new Mat(); Mat erodedImage = new Mat(); // 定义膨胀和腐蚀的内核大小和形状 Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3, 3)); // 进行膨胀操作 Imgproc.dilate(srcImage, dilatedImage, kernel); // 进行腐蚀操作 Imgproc.erode(srcImage, erodedImage, kernel); // 保存输出图像 Imgcodecs.imwrite("path/to/dilated/image.jpg", dilatedImage); Imgcodecs.imwrite("path/to/eroded/image.jpg", erodedImage); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值