像素点(x,y)的邻域是指像素点(x,y)对应的点集{(x+p,y+q)},其中(p,q)是一对有意义的整数。邻域为像素(x,y)附近像素形成的区域,像素(x,y) 也称为中心像素。
最常用的社区是:
4 邻域:对于像素(x,y)来说,上、下、左、右四个像素称为4个邻域,用表示。 4个邻域中的四个像素是:(x,y-1)、(x,y+1)、(x-1,y)、(x+1,y)。
D 邻域:对于像素(x,y)来说,左上、右上、左下、右下四个对角像素构成D邻域,用表示。 D 邻域内的四个像素为:(x + 1, y + 1)、(x + 1, y - 1)、(x - 1, y + 1)、(x - 1, y - 1)。
8 邻域:对于像素(x,y),其4邻域点和D邻域点组成8邻域,用表示。所以,
Neighborhood.png 邻里是一个非常基本的概念。当我们后续对图像进行卷积操作时,通常是对当前像素的邻域像素进行操作的。
以最简单的均值滤波器为例,均值滤波是针对每个像素,设置为取其邻域窗口中所有像素的平均值。
算术平均滤波器的公式:
其中,表示以像素(x,y)为中心的区域,m*n为模板的大小。 f(x,y)表示原始图像,g(x,y)表示使用定义的邻域中的像素计算的算术平均值。
这里的模板也可以称为内核、窗口和掩码。
下图以3*3模板为例。均值滤波器会对原始图像的每个像素计算其邻近像素与模板矩阵对应元素的乘积,然后将它们相加作为该像素位置的值。窗口从左到右移动,然后从上到下移动。
Convolution.png 下面,实现一个简单的均值滤波函数
Mat MeanFilter(Mat src, int ksize=3)
{
cv:Mat dst=src.clone();
int k0=k大小/2;
int sum[3]={0,0,0};
for(int i=k0;i(i-k0+m,j-k0+n)[通道];
}
}
dst.at(i,j)[通道]=saturate_cast((float)sum[通道] /(ksize*ksize));
}
}
}
返回目的地;
}当然,这段代码只是粗略地实现了均值滤波,还有很大的优化空间,比如使用积分图、卷积核分离等。OpenCV还提供了均值滤波函数blur()函数。
int main(int argc,char *argv[])
{
Mat src=imread("./flower.jpg");
imshow("src",src);
垫dst;
dst=平均值过滤器(src, 15);
imshow("meanFilter",dst);
模糊(src,dst,大小(15,15));
imshow("模糊",dst);
等待键(0);
返回0;
}均值滤波函数effect.png 以上只是简单介绍了该领域的使用场景。会有专门的文章来详细介绍卷积和滤波。
2. 邻接
邻接指的是位置相邻和取值相同或相近的两个像素。
我们用V来表示定义邻接的灰度值集合。在二值图像中,V={1}表示值为1的像素的相邻性。在灰度图像中,V包含更多元素。
4 邻接:对于灰度值在V集合中的像素p和q,如果q在之间,那么像素p和q是4相邻的。
8 邻接:对于灰度值在V集中的像素p和q,如果q在之间,那么像素p和q是8相邻的。
m 邻接(混合邻接):m 邻接比8 邻接有所改进。只要满足以下任一条件:
q
q 在中,并且该集合在中没有来自V 的像素。
像素p 和q 是4 相邻的,那么它们一定是8 相邻的。反之则不一定。
下图反映了8个邻接造成的歧义。
Adjacency.png 从图中可以看到,p是中心像素。
q1、q2 和p 是8 邻接的。
q1 和p 不相邻。
q2 和p 相邻。
某条路径经过像素q2、p 和q1。可以采取多少种方式?
从p、q1、q2是8相邻来看,从p移动到q1有2种方式,所以通路从q2到q1有2种方式。
同理,从m邻接的角度来看,移动p和q1只有一种方式,所以从通路从q2到q1也只有一种方式。
所以引入m个邻接就是为了消除8个邻接经常带来的二义性。
从收藏角度:
3. 通路
通路:从像素p到像素q的路径是一个特定的像素序列,其坐标为:
并且满足和与相邻。
闭合通路:如果满足,则该路径是闭合路径。
通过不同的邻接定义可以得到不同的路径:4个邻接=4条路径,8个邻接=8条路径,m个邻接=m条路径
Pathway.png 因此,从中间的图片中,我们可以看到q2和q1之间有8条路径,而从最右边的图片中,我们可以看到q2和q1之间有m条路径。
从收藏角度:
下图中,p-q途径对应不同的途径。
Multiple Passs.png
4. 连通
连通:如果S是图像中像素的子集,则对于任何。如果存在一条从p 到q 的路径由S 中的像素组成,则称p 在q 为连通的像素集S 中。
邻接是连通的特例。连接由一系列相邻的像素组成。
连接性分为4 连通和8 连通。
连通分量:对于S中的任何像素p,连接到p并且也在S中的所有像素的集合。
连通集:如果S只有一个连通分量,则S称为连通集。
在上一篇基本图形绘制的文章中,介绍了绘制函数使用的lineType参数。
以下是对该参数的一些补充说明:
LINE_4:基于4连通Bresenham算法处理的直线。
LINE_8:基于8连通Bresenham算法处理的直线。
LINE_AA:基于高斯滤波平滑的直线。
lineType parameter.png 以下示例显示使用不同lineType 参数的效果。
int main(int argc,char *argv[])
{
Mat 图像=Mat:zeros(Size(80, 80), CV_8UC3);
image.setTo(255);//设置屏幕为白色
点p1(20, 0);
点p2(80, 60);
点p3(0, 0);
点p4(80, 80);
点p5(0, 20);
点p6(60, 80);
行(图像, p1, p2, 标量(0, 0, 255), 1, LINE_4);
行(图像, p3, p4, 标量(255, 0, 0), 1, LINE_8);
行(图像, p5, p6, 标量(0, 255, 0), 1, LINE_AA);
imshow("src", 图像);
等待键(0);
返回0;
}将生成的图片放大,可以看到使用LINE_4、LINE_8、LINE_AA绘制的线段效果是不同的。使用LINE_AA 看起来效果最好,其次是LINE_8。
不同lineType 参数的效果.png 许多概念可以通过邻接进行扩展。邻接 -通路 -连通 -连通集 -区域/邻接区域 -前景和背景 -边界
5. 距离
对于像素p(x,y)、q(s,t)和z(u,v),如果满足:
非负性:D(p,q) 0
恒等式:D(p,q)=0,当且仅当p=q
对称性:D(p,q)=D(q,p)
直接性:D(p,z) D(p,q) + D(q,z)
那么D就被称为距离的度量函数。
在欧几里得空间中,点和点之间的闵可夫斯基距离:
曼哈顿距离当p=1 时,为曼哈顿距离、城市距离或街区距离。指两个向量之间的距离,计算距离时不涉及对角线移动。像素p(x,y)和q(s,t)之间的距离公式:
意思是从p像素开始到q像素,每次可移动的点必须在当前像素点的4 邻域范围内。一步一步走到q点后,经过的像素总数就是曼哈顿距离。
欧氏距离当p=2时,为欧氏距离,即笛卡尔坐标系中的距离。像素点p(x,y)和q(s,t)之间的距离公式:
切比雪夫距离当p=时,为切比雪夫距离或棋盘距离。像素点p(x,y)和q(s,t)之间的距离公式:
OK,本文到此结束,希望对大家有所帮助。
【OpenCV 基础教程(6):图像像素关系解析——邻域、邻接、通路、连通及距离计算】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
图像处理中学习到这些概念真帮大忙!
有14位网友表示赞同!
终于理解了什么是相邻像素,离我越来越近了。
有15位网友表示赞同!
这篇文章说的很明白,易于理解!
有16位网友表示赞同!
感觉通路的概念和图像分割有点关联啊。
有5位网友表示赞同!
连通性分析这个东西在图像识别很重要啊, 现在看来学到了新的知识点。
有5位网友表示赞同!
学习OpenCV一直跟不上进度,这篇笔记刚好填补了空白!
有19位网友表示赞同!
距离计算真多地方用到啊,要好好记一下这些公式。
有20位网友表示赞同!
邻域、邻接这几个概念之前都不太清楚,现在终于理解了。
有8位网友表示赞同!
OpenCV学到这些基本关系,才能进一步上手应用吧?
有14位网友表示赞同!
图像处理里像素之间的关系真的很难讲清楚,这篇笔记帮我捋顺思路了。
有11位网友表示赞同!
感谢分享这个实用的笔记!
有12位网友表示赞同!
最近在做视觉相关的项目,这篇文章刚好派上用场。
有18位网友表示赞同!
这些概念都很有理论基础,希望能把它们应用到实际项目中去。
有14位网友表示赞同!
学习OpenCV确实需要积累知识点,这篇笔记让我感觉可以更轻松地学习了。
有7位网友表示赞同!
像素间的各种关系真的很多,要慢慢消化学习。
有15位网友表示赞同!
这篇文章提醒我,做好基础的理论学习才能更好地上手OpenCV。
有11位网友表示赞同!
希望以后还能看到更多OpenCV的笔记分享!
有12位网友表示赞同!