膨胀dilate与腐蚀erode
/**膨胀函数dilate,用结构元素的中心点对准当前正在遍历的这个像素,
* 然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值,用这个最大值替换当前像素值,
* 给图像中的对象边界添加像素,使二值图像扩大一圈可用于减淡图片文字等
* dilate(
* Mat src, --输入图像
* Mat dst, --输出图像
* Mat kernel, --用于膨胀操作的结构元素,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素,可以使用getStructuringElement()来创建结构元素
* Point anchor = Point(-1,-1), --结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心
* int iterations = 1, --膨胀操作被递归执行的次数
* int borderType = BORDER_CONSTANT, --推断边缘类型
* Scalar borderValue --边缘值
* );
*
* 腐蚀函数erode,腐蚀会把物体的边界腐蚀掉,卷积核沿着图像滑动,如果卷积核对应的原图的所有像素值为1,
* 那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体,可用于加深图片文字等
* erode(
* Mat src, --输入图像
* Mat dst, --输出图像
* Mat kernel, --结构单元,如果取值为Mat(),那么默认使用一个3 x 3 的方形结构元素
* Point anchor=Point(-1, -1), --结构元素的锚点位置,默认值value(-1,-1)表示锚点位于结构元素中心
* int iterations=1, --腐蚀操作被递归执行的次数
* int borderType=BORDER_CONSTANT, -推断边缘类型
* Scalar borderValue --边缘值
* );
*/
@Test
public void testDilate() {
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0003.jpg");
Mat dilateMat = new Mat();
Mat erodeMat = new Mat();
//定义结构元素5x5大小矩形
Mat structuringElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,new Size(5, 5), new Point(-1, -1));
//膨胀
Imgproc.dilate(src, dilateMat, structuringElement, new Point(-1, -1), 1);
GeneralUtils.saveByteImg(dilateMat, "C:\\图片\\test\\dilateMat.jpg");
//腐蚀
Imgproc.erode(src, erodeMat, structuringElement, new Point(-1,-1), 1);
GeneralUtils.saveByteImg(erodeMat, "C:\\图片\\test\\erodeMat.jpg");
}
形态学变换 morphologyEx函数
/**
* 形态学变换 morphologyEx函数
* 开运算:MORPH_OPEN
* 先腐蚀,再膨胀,可清除一些小东西(亮的),放大局部低亮度的区域
* 闭运算:MORPH_CLOSE
* 先膨胀,再腐蚀,可清除小黑点
* 形态学梯度:MORPH_GRADIENT
* 膨胀图与腐蚀图之差,提取物体边缘
* 顶帽:MORPH_TOPHAT
* 原图像-开运算图,突出原图像中比周围亮的区域
* 黑帽:
* 闭运算图-原图像,突出原图像中比周围暗的区域
*morphologyEx(
* Mat src, --输入图像
* Mat dst, --输出图像
* int op, --形态学运算的类型:
* Mat kernel, --形态学运算的内核。为NULL,使用参考点位于中心3x3的核
* Point anchor=Point(-1,-1), --锚的位置,其有默认值(-1,-1),表示锚位于中心。
* int iterations=1, --迭代使用函数的次数,默认值为1。
* int borderType=BORDER_CONSTANT, --用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_CONSTANT。
* Scalar borderValue --边缘值
* );
*/
@Test
public void TestMorphologyEx() {
Mat src = GeneralUtils.converMat("C:\\图片\\test\\0003.jpg");
//二值化
Mat gray = new Mat();
Mat binary = new Mat();
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
Imgproc.GaussianBlur(gray, gray, new Size(5,5), 0, 0);
Imgproc.adaptiveThreshold(gray, binary, 255, Imgproc.ADAPTIVE_THRESH_GAUSSIAN_C, Imgproc.THRESH_BINARY, 35, 15);
//定义结构元素5x5大小矩形
Mat structuringElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(5, 5));
//开运算
Mat morphologyMat = new Mat();
Imgproc.morphologyEx(binary, morphologyMat, Imgproc.MORPH_OPEN, structuringElement);
GeneralUtils.saveByteImg(morphologyMat, "C:\\图片\\test\\MORPH_OPEN.jpg");
//闭运算
Imgproc.morphologyEx(binary, morphologyMat, Imgproc.MORPH_CLOSE, structuringElement);
GeneralUtils.saveByteImg(morphologyMat, "C:\\图片\\test\\MORPH_CLOSE.jpg");
//形态学梯度
Imgproc.morphologyEx(binary, morphologyMat, Imgproc.MORPH_GRADIENT, structuringElement);
GeneralUtils.saveByteImg(morphologyMat, "C:\\图片\\test\\MORPH_GRADIENT.jpg");
//顶帽
Imgproc.morphologyEx(binary, morphologyMat, Imgproc.MORPH_TOPHAT, structuringElement);
GeneralUtils.saveByteImg(morphologyMat, "C:\\图片\\test\\MORPH_TOPHAT.jpg");
//黑帽
Imgproc.morphologyEx(binary, morphologyMat, Imgproc.MORPH_BLACKHAT, structuringElement);
GeneralUtils.saveByteImg(morphologyMat, "C:\\图片\\test\\MORPH_BLACKHAT.jpg");
}
《思考中医》