OpenCV 笔记(6):像素间的基本关系——邻域、邻接、通路、连通、距离

这篇具有很好参考价值的文章主要介绍了OpenCV 笔记(6):像素间的基本关系——邻域、邻接、通路、连通、距离。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

像素是图像的基本元素,像素与像素之间存在着某些联系,理解像素间的基本关系是数字图像处理的基础。常见的像素间的基本关系包括:邻域、邻接、通路、连通、距离。

Part11. 邻域

邻域表示了像素之间的连接关系。

像素(x,y)的邻域,是指与像素(x,y)对应的点的集合{(x+p,y+q)} ,其中 (p,q) 为一对有意义的整数。邻域是像素(x,y)附近像素形成的区域,像素 (x,y) 也被称为中心像素。

最常用的邻域有以下几种:

  • 4 邻域:对于像素(x,y),上下左右4个像素被称为 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 邻域,使用

    表示。那么,
比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
邻域.png

邻域是一个很基础的概念。后续我们对图像进行卷积操作的时候,通常是对当前像素的邻域像素进行操作的

以一个最简单的均值滤波为例,均值滤波是对于每一个像素点, 将其设定为取其邻域窗口内的所有像素的平均值。

算术均值滤波器的公式:

其中,

表示以像素(x,y)为中心的区域,m*n 是 模板的大小。f(x,y) 表示原图像,g(x,y) 表示使用 定义的邻域中的像素所计算出的算术平均值。

这里的模板,也可以被称为核(kernels)、窗口(windows)、掩模(mask)。

下图以 3*3 的模板为例,均值滤波会对原图像的每一个像素点,计算它的邻域像素和模版矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。窗口的移动是从左到右,然后从上到下依次移动。

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
卷积.png

下面,实现一个简单的均值滤波函数

Mat meanFilter(Mat &src, int ksize = 3)
{
    cv::Mat dst = src.clone();

    int k0 = ksize/2;
    int sum[3] = {0,0,0};
    for(int i=k0;i<dst.rows-k0-1;i++)
    {
        for(int j=k0;j<dst.cols-k0-1;j++)
        {
            memset(sum,0, sizeof(sum));

            for(int channel = 0; channel<3; channel++)
            {
                for(int m = 0;m<ksize;m++)
                {
                    for (int n=0;n<ksize;n++)
                    {
                        sum[channel] += src.at<cv::Vec3b>(i-k0+m,j-k0+n)[channel];
                    }
                }

                dst.at<Vec3b>(i,j)[channel] = saturate_cast<uchar>((float)sum[channel] /(ksize*ksize));
            }
        }
    }
    return dst;
}

当然这个代码只是粗略地实现均值滤波,存在着很多优化的空间,例如使用积分图、卷积核分离等。OpenCV 也提供了均值滤波函数 blur() 函数。

int main(int argc,char *argv[])
{
    Mat src = imread(".../flower.jpg");
    imshow("src",src);
    Mat dst;

    dst = meanFilter(src, 15);
    imshow("meanFilter",dst);

    blur(src,dst,Size(15,15));
    imshow("blur",dst);

    waitKey(0);
    return 0;
}
比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
均值滤波函数效果.png

上面只是简单例举了领域的使用场景,后续会有专门的文章来详细介绍卷积和滤波。

Part22. 邻接

邻接是指两个像素,在位置上相邻并且取值相同或相近

我们用 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 邻接会带来二义性。

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
邻接.png

从图中可以看到,p 是中心像素。

  1. q1、q2 和 p 是 8 邻接的。

  2. q1 和 p 非 m 邻接的。

  3. q2 和 p 是 m 邻接的。

某条通路经过像素 q2、p、q1,那会有几种走法呢?

如果从 p、q1、q2 是 8 邻接的角度看,p 到 q1 可以有2种走法,所以 q2 到 q1 的通路有2条。

同理,从 m 邻接角度看,p 和 q1 只有1种走法,所以 q2 到 q1 的通路只有1条。

所以,m 邻接的引入是为了消除 8 邻接常常带来二义性

从集合的角度看:

邻接邻接邻接

Part33. 通路

通路:从像素 p

到像素 q 的通路是特定的像素序列,其坐标为:

,,,

并且满足,

和 对于 是邻接的。

闭合通路:如果满足

,则通路是闭合通路。

由不同的邻接定义,可以得到不同的通路:4 邻接 => 4 通路,8 邻接 => 8 通路,m 邻接 => m 通路

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
通路.png

所以,从中间的图可以看到 q2 和 q1 之间存在 8 通路,从最右的图可以看到 q2 和 q1 之间存在 m 通路。

从集合的角度看:

通路通路通路

下图中,p-q 通路对应的是不同的通路。

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
多种通路.png

Part44. 连通

连通:若 S 是图像中的一个像素子集,对于任意的

。如果存在一条由 S 中像素组成的从 p 到 q 的通路,则称 p 在图像集 S 中与 q 连通

邻接连通的一种特例,连通是由一系列依次邻接的像素组成的。

连通分为 4 连通8 连通

连通分量:对于 S 中任意像素 p,所有与 p 相连通且又在 S 中的像素集合。

连通集:如果 S 中仅有一个连通分量,则 S 称为连通集。

在之前基本图形的绘制那篇文章里, 曾介绍过绘图函数所使用的 lineType 参数。

下面对这个参数做一些补充说明:

  • LINE_4 :基于 4 连通 Bresenham 算法处理的直线。

  • LINE_8 :基于 8 连通 Bresenham 算法处理的直线。

  • LINE_AA :基于高斯滤波平滑处理的直线。

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
lineType 参数.png

下面的例子,展示了使用不同的 lineType 参数的效果

int main(int argc,char *argv[])
{
    Mat image = Mat::zeros(Size(80, 80), CV_8UC3);
    image.setTo(255);// 设置屏幕为白色

    Point p1(20, 0);
    Point p2(80, 60);
    Point p3(0, 0);
    Point p4(80, 80);
    Point p5(0, 20);
    Point p6(60, 80);

    line(image, p1, p2, Scalar(0, 0, 255), 1, LINE_4);
    line(image, p3, p4, Scalar(255, 0, 0), 1, LINE_8);
    line(image, p5, p6, Scalar(0, 255, 0), 1, LINE_AA);

    imshow("src", image);

    waitKey(0);
    return 0;
}

将生成的图片放大,可以看到使用 LINE_4、LINE_8、LINE_AA 画出来的线段效果是不同的。使用 LINE_AA 效果看上去是最好的,其次是 LINE_8。

比较说明像素邻域,邻接及联通的概念,联系及区别,opencv,笔记,人工智能,计算机视觉
不同lineType参数的效果.png

通过邻接可以引申很多概念,邻接 -> 通路 -> 连通 -> 连通集 -> 区域/邻接区域 -> 前景和背景 -> 边界

Part55. 距离

对于像素 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) 之间的距离公式:

表示从像素 p 向像素 q 出发,每次能走的点必须是在当前像素点的 8 邻域中。一步一步走到 q 点后,一共经过的像素点数就是切比雪夫距离。

Part66. 总结

本文涉及到很多概念,这些概念代表着像素间的基本关系。像邻域、连通在后续文章中很多都会涉及到,像距离又跟相似度有关,所以它们是数字图像的基础。

Java与Android技术栈】公众号

关注 Java/Kotlin 服务端、桌面端 、Android 、机器学习、端侧智能

更多精彩内容请关注:文章来源地址https://www.toymoban.com/news/detail-761998.html

到了这里,关于OpenCV 笔记(6):像素间的基本关系——邻域、邻接、通路、连通、距离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Opencv-C++笔记 (10) : opencv-图像像素计算

    我们可以将数字图像理解成一定尺寸的矩阵,矩阵中每个元素的大小表示了图像中每个像素的亮暗程度,因此统计矩阵中的最大值,就是寻找图像中灰度值最大的像素,计算平均值就是计算图像像素平均灰度,可以用来表示图像整体的亮暗程度。因此针对矩阵数据的统计工作

    2024年02月09日
    浏览(37)
  • Opencv-C++笔记 (15) : 像素重映射 与 图像扭曲

    重映射,就是把一幅图像中某位置的像素放置到另一图像指定位置的过程。即: 在重映射过程中,图像的大小也可以同时发生改变。此时像素与像素之间的关系就不是一一对应关系,因此在重映射过程中,可能会涉及到像素值的插值计算。 头文件 quick_opencv.h:声明类与公共

    2024年02月13日
    浏览(48)
  • OpenCV学习(五)——图像基本操作(访问图像像素值、图像属性、感兴趣区域ROI和图像边框)

    访问像素值并修改 访问图像属性 设置感兴趣区域(ROI) 分割和合并图像 5.1 访问像素值并修改 访问像素值 修改像素值 简单访问每个像素值并修改比较缓慢,一般不使用。 Numpy数组方法 array.item() 和 array.itemset() 被认为更好,但是它们始终返回标量。 更好的像素访问和编辑方

    2024年02月06日
    浏览(80)
  • OpenCV——八邻域断点检测

    OpenCV——八邻域断点检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 图1 八邻域示意图 图2 八邻域对应坐标关系   首先将图像进行二值化,然后检测以 P 1 P_1 P 1 ​ 为中心的它的八个领域, P 2 + P 3 + P 4 + P 5 + P 6

    2024年01月19日
    浏览(29)
  • LA@向量组间的表示关系

    向量组的相互表出 设有两个同维向量组 A : α 1 , ⋯   , α s A:alpha_1,cdots,alpha_s A : α 1 ​ , ⋯ , α s ​ , B : β 1 , ⋯   , β t {B}:beta_1,cdots,beta_{t} B : β 1 ​ , ⋯ , β t ​ 若 β 1 , ⋯   , β t beta_1,cdots,beta_t β 1 ​ , ⋯ , β t ​ 都可以被 A A A 线性表示,则称向量组 B {B} B 可以由

    2024年02月11日
    浏览(37)
  • 概率论与数理统计——事件间的关系

    事件A发生必然导致事件B发生。 代数中经常用这种方法证明两个事件相等。 A与B至少有一个发生 A与B同时发生 无限可列个:能按某种规律能把他排成一个序列(实变函数的概念) (1)自然数,(2)整数,(3)有理数 n个事件中任意两个都互不相容则称为两两互不相容 若A

    2024年02月09日
    浏览(46)
  • 字体号数与像素对应关系

    1 英寸=25.4 毫米 1 寸=33.3333333 毫米 1点( 英美点 )(PT)(磅)=0.3527毫米=1/72英寸(Office里面的点) Word默认的图片 分辨率 为 96 dpi,像素必须为整数。程序计算时尽量先算乘法再除。 八号=5磅(5pt)=(5/72)*96=6.67=6px 七号=5.5磅=(5.5/72)*96=7.3=7px 小六=6.5磅=(6.5/72)*96=8.67=8px

    2024年02月08日
    浏览(69)
  • 【计算机视觉—python 】 图像处理入门教程 —— 图像属性、像素编辑、创建与复制、裁剪与拼接【 openCV 学习笔记 005 to 010 and 255】

    OpenCV中读取图像文件后的数据结构符合Numpy的ndarray多维数组结构,因此 ndarray 数组的属性和操作方法可用于图像处理的一些操作。数据结构如下图所示: img.ndim:查看代表图像的维度。彩色图像的维数为3,灰度图像的维度为2。 img.shape:查看图像的形状,代表矩阵的行数(高

    2024年01月19日
    浏览(66)
  • Python 将关系对数据转换为图数据 / 邻接矩阵

    在深度学习任务,例如推荐系统中,将关系转换为图表示,即邻接矩阵是常用的操作。 通常的做法是先将关系对数据转换为图数据,然后生成该图的邻接矩阵,再存储为稀疏矩阵。但这种方法不适用于大型矩阵的操作,通常会报内存溢出的错误。以推荐系统的Amazon的评级数据

    2023年04月27日
    浏览(34)
  • 城市数字化管理、智慧城市、数字孪生城市间的关系和演变

    基于《基于数字孪生的智慧城市》和《2023版数字孪生世界白皮书》,我们可以全面了解从数字城市管理到智慧城市,再到数字孪生城市的关系和发展历程。 以下是这一顺序和继承关系的要点总结: 这是城市地区向智慧城市演进的初始阶段。它涉及利用数字技术来管理和优化

    2024年02月04日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包