新人学习opencv图像处理的笔记,二:c++操作简单的图像缩小和边缘检测思路

新人学习opencv图像处理的笔记,二:c++操作简单的图像缩小和边缘检测思路

图像缩小的两种思路

一:间隔取样

这种思路笔者也没想到,是看网友的博客才知道的。间隔取样的基本操作就是通过计算,有选择地、等间隔地在原图中选择像素,放入新图中。

这种方法在宏观上来看,好像没什么毛病。毕竟图像的缩小在我们肉眼中,就是在原图的基础上去删减像素点,从而实现图像的缩小。但是仔细思考,这种方法会造成图像的特征丢失
在这里插入图片描述
在原图像素与缩小比例满足一定关系时,确实间隔取样是个不错的方法,毕竟算法简单,计算量小。从上图来看,等间隔1取样,确实完美做到了缩小的关系。可是下图呢?
在这里插入图片描述
上图(视为精密排列的像素点)中的两种取样都不合适。如果取红色,那么黑色点作为特征点丢失了,取黑色也一样。所以间隔取样的方法要慎用,计算简单的代价可能是图的失真。

二:通过局部取样的图像缩小

上学期笔者感兴趣CNN,查卷积池化时想到的一种方法。

首先,我们需要定义一个核K,用于提取局部的像素值,然后需要确定滑动步长S(笔者建议滑动步长S的大小要小于K的大小,不然就重新回到了间隔取样的问题,特征丢失),这里笔者自己推了一个公式,可供参考:
在这里插入图片描述

其中MN是指原图的行列数,mn是缩小倍数后的行列数,S是滑动步长,K是核大小。这个公式里只有两个未知数,S和K。为了避免变形为间隔取样,笔者的思路是先确定滑动步长S,然后根据滑动步长来算核K的大小。笔者把K设成了一个未确定大小的方阵,具体K是个什么样的矩阵还要看情况。其次,滑动步长S分成x和y方向,两个方向的值可以相同,可以不同,这就取决于操作者了。

确定了需要的参数后,我们的工作就只剩下算值和赋值了。步骤如下
在这里插入图片描述

假设K的大小是2x2,S的大小是2。如上图所示,先将K放入原图中的第一个区域(左上角的块),使用均值的方法((P1+P2+P3+P4)/4),也可以用不同权重取处理四个点,将4个Pixel的平均值作为得到的像素点,放入新图的对应点处。然后按滑动步长的大小依次向左下移动核,按照上述方法求像素。

笔者想的这种方法相比于间隔取样而言,计算量大,操作性不高,而且也不是完全不失真。比如得事先在函数中设置S的大小,然后让计算机算K的大小,然而K如果过大,操作过后的图像会出现模糊,也会丢失某些特征点或者说是特征点被掩盖了。

这个是笔者的结果图:
在这里插入图片描述

边缘检测的两种思路

第一种:Canny

边缘检测现在opencv用的是canny算子,最主要的算法。是根据四个方向(横竖两对角)的梯度来算的。当梯度出现零点时,代表导数不变,这个不变点就可视为一个边缘点。Canny算子需要的数学知识有点多,笔者也没弄清楚,所以要想知道详情,请参看下方其他作者博客
Canny边缘检测算子详情

第二种:基于Canny的简化版

笔者的思路和Canny算子的核心差不多,都是找像素断层点。不过笔者确实没那么高的水平,没想到用梯度的方法,而是取周围八个相邻区域的像素点值,做差比较。这个方法比较适合和笔者一样c++水平有限,高数有限的入门新手试试。

同上文中的缩小算法一样,先定义一个核K大小3x3,然后确定步长S(因为是原图检测,不需要放缩,这里就直接定为1了)。OK,准备工作搞定了,那么就开始简化吧,同样的选取一个点,以这个点为中心,做一个K,包起来,按照自己需要的权重算出来这个K的值。
---------------------------------用核的原因是减少噪声的干扰。
在这里插入图片描述
如图得到K后,分别以周围8个点中心(图中只标出了以四个顶点为中心的K),分别得到:K0,K1,K2,K3,K4,K5,K6,K7。用这8个值与K做差且做绝对值处理。得到八个值。我们需要用这8个值来与一个标准C进行比较,这个C由我们自己决定,笔者想法中,C代表像素变化的上界,当八个值都小于C时,表示在操作者眼中变化平滑,所以不是边缘,反之则是边缘点,给边缘点打上标记就行了。由此完成了终极简化版检测。
注意:其实上述思路是有问题的,变化平滑与否,终究是取决于梯度,客观表现在导数,而不是直观的像素做差,这里是笔者的一个脑洞算法,只能用一些简单,色差大,轮廓明显的图像。如下是笔者在两种不同图上的效果
第一张,效果还不错,O(∩_∩)O
在这里插入图片描述
第二张,简直就是见鬼了在这里插入图片描述

总上边缘检测的算法还是得用到数值计算去找函数,用梯度算法找,笔者的算法只能是一种兴趣。加油吧。

笔者水平有限,若有错误,敬请指正。总之,还是感谢大家看了我的博客。O(∩_∩)O!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值