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重叠的最大像素值,并用该最大值替换锚点位置中的图像像素。您可以推断,这种最大化的操作会使图像中的亮区“增长”(因此称为扩张)。