【OpenCV C++20 学习笔记】提取图片中的水平和垂直对象

原理

在腐蚀和膨胀操作中,通过卷积核(kernel),或者结构元素(structuring element),将每次被结构元素扫描到的区域中的最小值或最大值赋予其锚点(一般为结构元素的中心),从而实现扩大或缩小图像中的对象的轮廓。

关于膨胀和腐蚀运算,可以参考本合集中的另一篇文章《腐蚀和膨胀》

从腐蚀和膨胀的具体操作中可以看出,结构元素是非常重要的,它决定了最终的计算效果。
结构元素由0和1组成,可以自由排列。它的矩阵尺寸要比被计算的图片的矩阵尺寸小很多。结构元素的中心,被称为原点(origin)或者锚点(anchor point)。这个点是用来定位每次被操作的像素点的。
结构元素可以有很多形状:线型、钻石型、圆盘型等等。要根据具体用途来选择结构元素的形态。通常是,想要在图片中提取或者操作什么形态的对象就用什么形态的结构元素。比如说,如果想要在图片中定位线条,就可以创建一个线型的结构元素。这也是本文的示例中要进行的操作。

实操——去除五线谱的五线

这里使用的图片可以在安装OpenCV的路径中找到:...\opencv\sources\samples\data\note.png。目标是去掉图中的五线谱,只保留谱号、升降号和音符。
五线谱图片
在导入图片之后,要将图片进行灰度化,或者直接以灰度格式读取图片:

Mat src{
    imread("notes.png", IMREAD_GRAYSCALE) };

二值化

读入灰度图片之后,要先进行二进制化。使用的是adptiveThreshold()函数,该函数能够应用自适应的阈值将灰度图片转换成二值化的图片(即只有2种颜色值)。它包含两种阈值类型:THRESH_BINARYTHRESH_BINARY_INV。它们各自的算法如下:

  • THRESH_BINARY
    d s t ( x , y ) = { m a x V a l u e if  s r c ( x , y ) > T ( x , y ) 0 otherwise dst(x,y)= \begin{cases} maxValue & \quad \text{if } src(x,y)>T(x,y)\\ 0 & \quad \text{otherwise} \end{cases} dst(x,y)={ maxValue0if src(x,y)>T(x,y)otherwise
  • THRESH_BINARY_INV
    d s t ( x , y ) = { 0 if  s r c ( x , y ) > T ( x , y ) m a x V a l u e otherwise dst(x,y)= \begin{cases} 0 & \quad \text{if } src(x,y)>T(x,y)\\ maxValue & \quad \text{otherwise} \end{cases} dst(x,y)={ 0maxVa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值