新人学习opencv图像处理的笔记,一:c++操作图像放大

笔者最近开始接触opencv,并且上学期学了一点数值计算,所以觉得计算机图像挺有意思的,故而诞生了写笔记的想法

好了,废话不多说,由于笔者水平有有限,如有错误,敬请指正(!^ _ ^!)

一些入门基础点

首先,在实践操作前,我们得了解下,什么是计算机图像,对通常的彩色图像而言,计算机图像就是一个个紧密排列的像素点组成,这些像素点呈现不同的颜色,共同组成了一个完整的画面如下图所示


值得注意的是,图像在计算机内,是以矩阵的方式保存的,矩阵的行列代表图像的长宽,其中每个元素代表一个像素点,而每一个元素的组成,则代表了该像素点的颜色(三通道RGB的矩阵分别有红绿蓝三个颜色的通道,每个通道上的数值又代表了该颜色的深浅。例如:(255,255,255)代表的是黑色,(0,0,0)代表的是白色)。

实现图像放大需要面临的问题

这个问题其实笔者大一就想过,但是当时觉得图像既然是像素点保存的,那么就应该是一个离散的数据,当时了解的不多也就不了了之,直到上学期,笔者上了数值计算这门课,才有了思路

问题1:在我们眼中的图像颜色是连续的,渐变的, 这个渐变可以用导数的思维来思考,正是因为导数的存在,使得图像的局部色差不会太大,从而有渐变连续的视觉效果。但正如前面所说,计算机图像是以离散的数据保存下来的,所以我们需要想一个办法,来给离散的数据求导------插值拟合,通过给离散的数据点拟合一个连续的函数,从而可以求导,使得像素是连续的。

问题2:图像放大后,新图会比原图多出很多像素点,我们该如何去定位和确定像素值?比如,上图中,是4x4,而在放大两倍后,会变成8x8的图像,这么多的像素点,我们该如何去确定呢?

解决方法

1:怎么解决第一个问题,那就是插值拟合函数,几种拟合方法,会在后文介绍。

2:怎么解决第二个问题,那我们就需要定义一个映射含函数。把新图中的点和原途中的点,通过一个函数 : f(x) 联系起来。然后通过拟合出的函数来确定像素值。

三种拟合办法

双线性插值法

双线性插值的思想是分别在 x 和 y方向做一次插值,从而实现像素值的填充。这里笔者提供一种简单的方法。
假设原图矩阵 R行 C列,即 RXC,在放大 m 倍数后变成 Rm * Cm,即 r * c 。首先创建一个 r * c的矩阵,然后把原途中的像素均匀有间隔的平铺在新途中,那我需要寻找的像素点就只有 r * c - R * C个了。

然后通过构造一次函数,来计算空白点的值。上图中,从横坐标方向上看,绿色点的值和红色点的值可以通过 像素值Pixle 和 横坐标x来构造一个一次函数。而两点中间空白点的值,则通过这个一次函数来确定。
比如红绿点,构造一次函数。以绿点为起点,有 P = (PR - PG)/(XR - XG) * (X - XG) + PG。公式的意思是,用已知的两点确定一条直线,在直线中确定未知点的值(边界点可以自己设置一个较合适的数值进行处理)。通过第一次循环遍历后,我们处理了有颜色横向像素如图

接下来的工作就是处理纵向像素,操作方法同上

这是笔者的结果图,很明显,数值插值公式的选择的问题,导致像素点间变化生硬,效果不行。

最邻近插值法

先上效果图

这个方法就比双线性插值更粗暴,更简单,但是笔者的效果图比双线性更好,这里是为什么,笔者也没找到答案。可能是写的双线性的程序有点问题,这里先存疑。
这个方法的操作,把新图上的点,重新映射到原图上。通过公式计算

其中i,j是新图中的坐标,XY是原图中对应的整数坐标,R是小数部分。这里解释一下,为什么会有小数和整数之分,因为放大的关系,新的像素点比原图多,那么两者之间的映射就不一定是一一对应的,新图中的整数坐标点不一定对应原图中整数坐标点,所以会有小数部分的存在。

如图,红圈点在原图中对应的不是整数(正中心), 而是有偏差R的。有了这个偏差就好办了。用整数部分去对应原图中的整数点,然后根据这个偏差,看这个还原在原图中的映射靠哪个点近,就把这个邻近点的值赋给新点。(注意,不要看上图来理解,要根据R大小来确定,R>0.5,就取下一个点,否则取这个整数点。)

二次插值(存疑)

由于有双线性插值,笔者就在想,会不会二次插值效果更好一点,结果并非如此。
笔者同样采用多点构造的方法,只不过使用的拟合函数是用三个点确定的二次函数,用二次拉格朗日插值公式得到。看起来合理,但是得到效果图惨不忍睹。


下面是效果图,我写报告时心血来潮的产物,结果不忍直视。

双三插值法

这个插值法笔者也说不清楚是怎么回事,也是在老师提示下,查了这个方法
由于笔者水平有限所以只给了一个公式截图,具体详情请看下方超链接。

参考资料

总结和思考

笔者也是初次写博客,如果有什么不对,还请多多指教。
笔者觉得,对于图像的resize,主要是对于离散数据的操作,要通过一些比较好的插值方法还原函数,尽可能地在导数上做一些优化,使得局部像素变化平滑。对于那些突变地像素点,则可以使用梯度来算法来进行边缘检测(笔者用了一个很笨的方法实现了轮廓检测,感觉自己好蠢,(* ^ _ ^ * ))。一个risize的好坏取决于函数的否平滑,而函数的平滑取决于导数和梯度,所以笔者在想,除开突变点,如果一个函数在满足所有离散点的情况下,且变化平稳,那一定就是最好的办法了。
总之,还是感谢大家看了我的博客。

新人学习opencv图像处理的笔记,一:c++操作图像放大相关推荐

  1. OpenCV图像处理使用笔记(二)——图像矩阵的掩膜操作

    前言 1.数字图像处理中的掩膜的概念是起源于于PCB制版的过程,在半导体制造中,许多芯片工艺步骤采用光刻技术,用于这些步骤的图形"底片"称为掩膜(也称作"掩模" ...

  2. 在pycharm2021.2中学习opencv图像处理,基于python3.9.7、pycharm完成配置

    在pycharm中学习opencv图像处理 安装python 下载python安装包 开始安装 安装pycharm社区版 下载pycharm安装包 开始安装 启动pycharm创建第一个项目 创建第一 ...

  3. [Python图像处理] 三十五.OpenCV图像处理入门、算数逻辑运算与图像融合(推荐)

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  4. OpenCV图像处理使用笔记(四)——图像融合

    前言常用 1.在OpenCV中定义了好多函数用来操作图像矩阵,有两个矩阵相加的,相减的,混合的,下面我使用QT加OpenCV演示图像融合这个函数. 2.我的IDE是Qt creator,OpenCV的 ...

  5. OpenCV图像处理(2)——形态学操作

    形态学操作 Mat element = getStructuringElement(MORPH_RECT, Size(9, 9)); morphologyEx(InputImage, OutputIm ...

  6. OpenCV图像处理使用笔记(七)——卷积运算原理

    前言 1.在图像处理中,特别在深度学习图像处理,最常看到图像卷积操作,那什么是卷积呢,卷积就是两个原函数产生一个新的函数,两个函数之间的这种操作就称着卷积,在图像这里的图像卷积也用输入的图像矩阵与一个 ...

  7. OpenCV图像处理使用笔记(八)——Sobel算子

    前言 前面博客讲了矩阵之间的卷积操作,在图像处理中,使用一些标准的模板的卷积核与原图像进行运算,可以改变像素强度,从而影响周围其他像素的强度,常用于图像模糊.锐化及边缘检测等. Sobel算子 1.S ...

  8. OpenCV图像处理使用笔记(六)——图像滤波

    前言 1.图像滤波也叫图像模糊,是平滑图像像素常用处理的方式,通常是为了达到减少图像噪声和伪影,或者降低图像分辨率,OpenCV提供了常用的五种图像模糊操作. 2.我的这里演示的系统环境是Linux, ...

  9. OpenCV图像处理使用笔记(五)——图像边界拓展

    前言 1.在OpenCV滤波和卷积算法中,在进行核运算的过程时候,矩阵边界拓展是一个非常重要的处理,OpenCV提供的函数copyMakeBorder()来拓展边界. 2.我的系统环境是Linux,加 ...

  10. OpenCV图像处理使用笔记(三)——单通道的Mat对象强转为三通道的Mat对象

    前言 在机器学习和深度学习的时候,对图像进行处理时,会遇到明明是给的三通道的图像,但因为是黑白的,程序判断为单通道的图像,这样让人很无语,还有有时候有些库必须要传入三通道的RGB图像,但为了提升处理的 ...

最新文章

  1. 读《大规模敏捷开发实践》
  2. python使用符号#表示单行注释-Python中注释(多行注释和单行注释)的用法实例...
  3. C语言中typedef的六种用法
  4. android第八步查看与输出日志信息
  5. 构造函数实现窗体间传值
  6. C++重载一些需要注意的地方
  7. 使用Hibernate生成数据库和连接数据库
  8. RocketMQ快速入门之消息过滤器(用户自定义属性)
  9. redis的入门/原理/实战大总结
  10. 求一早间新闻~20170717
  11. 微信视频不能连接到服务器,微信无法连接到服务器
  12. 程序人生:程序员做外包“前途“,“技术“,“经验“如何决策
  13. GPU机器无法使用GPU
  14. html5%3chr%3e的样式,Vbs脚本编程简明教程
  15. SHIMANO套件差别详解
  16. 百家号运营技巧:如何发布图集获得高收益呢?
  17. linux14.04设置DNS,Ubuntu 14.04.4 LTS设置DNS
  18. 8个免费的高质量UI图标大全网站
  19. ESP32-CAM视频流
  20. 【背包问题】基于禁忌搜索算法求解背包问题附Matlab代码

热门文章

  1. 利用阿里云oss实现上传视频和图片功能
  2. div和span标签以及标签分类
  3. 【原】移动web页面给用户发送邮件的方法 (邮件含文本、图片、链接)
  4. 【转载】GitHub中国区前100名到底是什么样的人
  5. ubuntu几款好用的代码编辑器
  6. java中list中放入map_list中放map的几种方式
  7. yii mysql 查询 类型转换_yii2 数据库查询结果字段类型的问题
  8. myeclipse当前页面的脚本发生错误问题
  9. android dialog的格式显示,详解Android Dialog对话框的五种形式
  10. 计算机专业新生研讨课感悟,新生研讨课学习心得与收获