击中不击中
击中击不中变换是比图像腐蚀要求更加苛刻的一种形态学操作,图像腐蚀只需要图像能够将结构元素中所有非0元素包含即可,但是击中击不中变换要求原图像中需要存在与结构元素一模一样的结构,即结构元素中非0元素也需要同时被考虑。
API
public static void morphologyEx(Mat src, Mat dst, int op, Mat kernel, Point anchor, int iterations, int borderType, Scalar borderValue)
-
参数一:src,输入的待形态学操作图像,图像的通道数可以是任意的,但是图像的数据类型必须是
CV_8U
,CV_16U
,CV_16S
,CV_32F
或CV_64F
-
参数二:dst,形态学操作后的输出图像,与输入图像src具有相同的尺寸和数据类型
-
参数三:op,形态学操作类型的标志
标志位 | 值 | 作用 |
---|---|---|
MORPH_ERODE | 0 | 图像腐蚀 |
MORPH_DILATE | 1 | 图形膨胀 |
MORPH_OPEN | 2 | 开操作 |
MORPH_CLOSE | 3 | 闭操作 |
MORPH_GRADIENT | 4 | 形态学梯度 |
MORPH_TOPHAT | 5 | 顶帽操作 |
MORPH_BLACKHAT | 6 | 黑帽操作 |
MORPH_HITMISS | 7 | 击中击不中运算 |
-
参数四:kernel,用于形态学操作的结构元素,可以自己定义,也可以用
getStructuringElement()
函数生成 -
参数五:anchor,中心点在结构元素中的位置,默认参数为结构元素的几何中心点
-
参数六:iterations,操作次数,默认值为1
-
参数七:borderType,像素外推法选择标志
-
参数八:borderValue,使用边界不变外推法时的边界值
操作
/**
- 形态学
- author: yidong
- 2020/7/5
*/
class MorphologyExActivity : AppCompatActivity() {
private lateinit var mBinding: Act
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
ivityMorphologyExBinding
private lateinit var mBinary: Mat
private var mFlag = Imgproc.MORPH_OPEN
set(value) {
field = value
doMorphology(value, mSize.toDouble())
}
private var mSize = 3
set(value) {
field = value
doMorphology(mFlag, value.toDouble())
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mBinding = DataBindingUtil.setContentView(this, R.layout.activity_morphology_ex)
mBinding.seekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
mSize = progress
mBinding.tvSize.text = progress.toString()
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
}
})
mBinary = Mat()
val bgr = Utils.loadResource(this, R.drawable.number)
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()
gray.release()
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_morphology_ex, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
title = item.title
mFlag = when (item.itemId) {
R.id.morphology_close -> {
Imgproc.MORPH_CLOSE
}
R.id.morphology_gradient -> {
Imgproc.MORPH_GRADIENT
}
R.id.morphology_top_hat -> {
Imgproc.MORPH_TOPHAT
}
R.id.morphology_black_hat -> {
Imgproc.MORPH_BLACKHAT
}
R.id.morphology_hit_miss -> {
Imgproc.MORPH_HITMISS
}
else -> Imgproc.MORPH_OPEN
}
return true
}
private fun doMorphology(flag: Int, width: Double) {
val kernel = Imgproc.getStructuringElement(Imgproc.CV_SHAPE_RECT, Size(width, width))
val dst = Mat()