OpenCV Java 图像扩张与侵蚀

package com.opencv;

import org.opencv.core.Core;
import org.opencv.core.Mat;
import org.opencv.core.Point;
import org.opencv.core.Size;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class OpenCVDemo {
	public static void main(String[] args) {
		/*	1.加载本地动态链接库
		 * 	加载动态链接库有很多种方法,也可以写成static静态代码块。
		 */
		System.loadLibrary(Core.NATIVE_LIBRARY_NAME);

		/*	2 读取测试图片
		 *	imread:输入图片所在地址,返回Mat矩阵对象。
		 *	Mat对象中保存着加载图片的大小、通道、像素数据等等与图片有关的数据
		 */
		Mat image = Imgcodecs.imread("c:\\123.jpg");
		// 3. 设置图片的大小,让图片显示的时候小一点 
		//Imgproc.resize(image, image, new Size(image.cols()/2,image.rows()/2));
		
		HighGui.imshow("原图", image);
		HighGui.waitKey();
		
		//使用相同次数的腐蚀与膨胀,可以使目标表面更平滑。
		erode(image);
		dilate(image);
		
	}
	
	/**
	 * 	图像腐蚀-暗色扩张亮色被侵蚀
	 * 	腐蚀就是使用算法,将图像的边缘腐蚀掉。作用就是将目标的边缘的“毛刺”踢除掉
	 */
	public static void erode(Mat src) {
		Mat image = new Mat(src.size(),src.type());
		/*	getStructuringElement()
		 *	返回指定大小和形状的结构元素以进行形态学操作。该函数构造并返回可以进一步传递给#erode,#dilate或#morphologyEx的结构元素。
		 *	但是,您也可以自己构造一个任意的二进制掩码,并将其用作结构元素。
		 *	@param shape 枚举中元素形状之一
		 *	@param ksize结构元素的大小。
		 *	@param锚元素内的锚位置。 默认值(-1,-1)表示锚点位于中心。 注意,只有十字形元件的形状取决于锚位置。
		 *	在其他情况下,锚点仅调节形态运算结果偏移了多少。
		 *	第一个参数 -> 矩形: MORPH_RECT 交叉形: MORPH_CROSS 椭圆形: MORPH_ELLIPSE
		 */
		Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3), new Point(-1,-1));
		/*	erode() 该功能支持就地模式(无需新建Mat对象,可直接操作输入对象)
		 *	通过使用特定的结构元素腐蚀图像。 该函数使用指定的结构化元素腐蚀源图像,
		 *	该结构化元素确定在其上采用最小值的像素邻域的形状 。
		 *	可以进行多次(迭代)腐蚀。 在多通道图像的情况下,每个通道都是独立处理的。
		 *	@param src输入图像; 通道数可以是任意的,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
		 *	@param dst输出图像的大小和类型与src相同。
		 *	@param用于腐蚀的内核结构元素; 如果{element = Mat()},则默认使用{3 x 3}矩形结构元素。
		 *	可以使用#getStructuringElement创建内核。
		 *	@param元素内锚点的锚点位置; 默认值(-1,-1)表示锚点位于元素中心。
		 *	@param迭代应用腐蚀的次数。
		 */
		Imgproc.erode(src, image, kernel,new Point(-1,-1),1);
		HighGui.imshow("图像腐蚀-暗色扩张亮色被侵蚀", image);
		HighGui.waitKey();
	}

	/**
	 * 	图像膨胀-亮色扩张暗色被侵蚀
	 * 	膨胀就是使用算法,将图像的边缘扩大些。作用就是将目标的边缘或者是内部的坑填掉
	 */
	public static void dilate(Mat src) {
		Mat image = new Mat(src.size(),src.type());
		Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(3,3), new Point(-1,-1));
		/*	dilate()该功能支持就地模式(无需新建Mat对象,可直接操作输入对象)
		 *	通过使用特定的结构元素来放大图像。 该函数使用指定的结构化元素来扩展源图像,
		 *	该结构化元素确定在其上获取最大值的像素邻域的形状。
		 *	可以进行几次(迭代)扩张。 在多通道图像的情况下,每个通道都是独立处理的。
		 *	@param src输入图像; 通道数可以是任意的,但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
		 *	@param dst输出图像的大小和类型与src相同。
		 *	@param用于扩展的内核结构元素; 如果elemenat = Mat(),则使用3 x 3的矩形结构元素。
		 *	可以使用#getStructuringElement创建内核
		 *	@param元素内锚点的锚点位置; 默认值(-1,-1)表示锚点位于元素中心。
		 *	@param迭代应用膨胀的次数。
		 */
		Imgproc.dilate(src, image, kernel ,new Point(-1,-1),1);
		HighGui.imshow("图像膨胀-亮色扩张暗色被侵蚀", image);
		HighGui.waitKey();
	}
	
}

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

作用:

  • 消除噪音
  • 隔离单个元素并连接图像中的不同元素。
  • 查找图像中的强度凸点或孔

腐蚀:

  • 它计算给定内核区域的局部最小值。
  • 当内核在图像上扫描时,我们计算由重叠的最小像素值,并用该最小值替换锚点下的图像像素,图像的明亮区域(背景,显然)变得更薄,而黑暗区域(“写作”)变得更大。

扩张:

  • 该操作包括将图像与某些内核进行卷积,其可以具有任何形状或尺寸,通常为正方形或圆形。
  • 内核具有定义的锚点,通常是内核的中心。
  • 当内核在图像上扫描时,我们计算由内核B重叠的最大像素值,并用该最大值替换锚点位置中的图像像素。您可以推断,这种最大化的操作会使图像中的亮区“增长”(因此称为扩张)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里藍天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值