图像腐蚀、膨胀属于
形态学的操作,就是基于形状的一系列图像处理操作。数字形态学的基本思想是:用具有一定形态的结构元素去量度和提取图像中的对应形状,以达到图像分析和识别的目的。图像腐蚀、膨胀是基于高亮部分(白色)操作的,膨胀是对高亮部分进行膨胀,类似“领域扩张”,腐蚀是高亮部分被腐蚀,类似“领域蚕食”。膨胀腐蚀的应用主要体现在消除噪声、分割独立元素或者连接相邻元素、寻找图像中明显极大值、极小值区域以及求图像的梯度。
图像腐蚀的作用是将目标图像收缩,运算效果取决于结构元素大小内容以及逻辑运算性质。腐蚀处理可以表示成用结构元素对图像进行探测,找出图像中可以放下该结构元素的区域。腐蚀是一种消除边界点,使边界点内缩的过程。可以用来消除小且无意义的目标物。
与操作;对集合
A和B,使用B对A进行腐蚀,用
表示,并使用
表示B平移z后得到的结果,若平移后的结果包含于A,则我们记录下z点,所有满足上述条件的z点组成的集合就是A被B腐蚀后的结果。表示为:

腐蚀示意图
public static void erode(Mat src, Mat dst, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue)
CV_8U,CV_16U,CV_16S,CV_32F或CV_64FgetStructuringElement()函数生成public static Mat getStructuringElement(int shape, Size ksize, Point anchor)
参数一:shape,结构元素的种类
// C++: enum MorphShapes_c
public static final int
CV_SHAPE_RECT = 0,
CV_SHAPE_CROSS = 1,
CV_SHAPE_ELLIPSE = 2,
CV_SHAPE_CUSTOM = 100;
参数二:ksize,结构元素的尺寸大小
参数三:anchor,中心点的位置,默认参数为结构元素的几何中心点

矩形结构元素

十字形结构元素

椭圆结构元素
/**
* 图像腐蚀
*
* @author yidong
* @date 2020/6/24
*/
class ErosionActivity : AppCompatActivity() {
private lateinit var mBinding: ActivityErosionBinding
private lateinit var mBinary: Mat
private var mFlag = Imgproc.CV_SHAPE_RECT
set(value) {
field = value
doErode(value, mSize.toDouble())
}
private var mSize = 3
set(value) {
field = value
doErode(mFlag, value.toDouble())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_erosion)
mBinding.seekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mSize = progress
Toast.makeText(this@ErosionActivity, "value = $progress", Toast.LENGTH_SHORT).show()
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
}
})
val bgr = Utils.loadResource(this, R.drawable.opencv)
mBinary = Mat()
val gray = Mat()
Imgproc.cvtColor(bgr, gray, Imgproc.COLOR_BGR2GRAY)
Imgproc.threshold(gray, mBinary, 125.0, 255.0, Imgproc.THRESH_BINARY_INV)
mBinding.ivLena.showMat(mBinary)
bgr.release()
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_erosion, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
mFlag = when (item.itemId) {
R.id.erosion_cross -> {
Imgproc.CV_SHAPE_CROSS
}
R.id.erosion_ellipse -> {
Imgproc.CV_SHAPE_ELLIPSE
}
else -> Imgproc.CV_SHAPE_RECT
}
return true
}
private fun doErode(flag: Int, width: Double) {
title = "Flag = $flag,Size = ${width}X${width}"
val kernel = Imgproc.getStructuringElement(flag, Size(width, width))
val result = Mat()
Imgproc.erode(mBinary, result, kernel)
GlobalScope.launch(Dispatchers.Main) {
mBinding.ivResult.showMat(result)
result.release()
}
}
}

腐蚀效果