提取图片中的水平和垂直对象
原理
在腐蚀和膨胀操作中,通过卷积核(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_BINARY
和THRESH_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)otherwiseTHRESH_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