opencv图像处理学习(二十三)——掩码

版权声明:不得随意转载 https://blog.csdn.net/qq_35789421/article/details/88952309

图像的掩码操作是指通过掩码核算子重新计算图像中各个像素的值,掩码核算子刻画邻域像素点对新像素值的影响程度,同时根据掩码算子中权重因子对原像素点进行加权平均。图像掩码操作常用于图像平滑、边缘检测及特征分析等领域,opencv中常用的计算图像掩码的操作有下面两种。

<1>基于像素邻域遍历

对于源图像数据f(x,y),卷积核算子为3x3,计算源图像数据4邻域均值掩码可通过下式来完成。

f(x,y)=\frac{f(x-1,y)+f(x+1,y)+f(x,y-1)+f(x,y+1)}{4}

对于图像矩阵而言,上式可变换成下面的矩阵操作:

f(x,y) =f(x,y)\times Mask

Mask=\begin{bmatrix} 0 & \frac{1}{4} & 0 \\ \frac{1}{4}&0 & \frac{1}{4} \\ 0& \frac{1}{4} &0 \end{bmatrix}

基于像素邻域遍历就是通过对源数据矩阵进行操作,利用上面的公式以当前像素点为计算像素点为计算中心目标点,逐像素移动掩码核算子模板,对源图像数据进行遍历,进而更新新图像每个像素点。

<2>基于filter2D函数

opencv中提供了filter2D函数专门应用于计算图像卷积的操作:

void filter2D(InputArray src.OutputArray dst,int depth,InputArray kernel,Point anchor=Point(-1,-1),double delta=0,int borderType = BORDER_DEFAULT)

其中参数src代表源图像,dst代表输出图像,depth代表输出深度,如果设置为负值,其深度与输入源数据深度一样,否则就需要根据输入源图像的深度进行相关设置,若src.depth()=CV_8U,则depth=-1/CV_16S/CV_32F/CV_64F;参数kernel是卷积核算子,为单通道浮点矩阵,如果对多通道应用不同卷积核算子计算,需要分离通道然后对其进行单个操作。参数anchor是卷积核描点,默认是(-1,-1),表示卷积核中心。参数delta是平滑系数,目标图像生成前可设定值用于平滑操作。

filter2D函数常应用于线性滤波技术中,当使用卷积核算子计算的图像目标点在图像外部时,需要对指定边界进行插值运算。该函数实际计算的是图像相关性,而不是卷积操作,filter2D的计算公式是:

dst(x,y)=\sumkernel(x',y')*src(x+x'-anchor.x,y+y'-anchor.y)

其中0\leq x'\leq kernel.cols,0\leq y'\leq kernel.rows

猜你喜欢

转载自blog.csdn.net/qq_35789421/article/details/88952309
今日推荐