opencv resize中Mat对象resize后进行ROI相关操作图片无法正常显示

 改变也没有想象的那么难如果伱用心,每天进步一点点用你下决心那一刻的心理状态严格规范自己的日常行为,我想定会遇到更好的自己曾经看过一个故事,古时候一位耳顺之年的老婆婆要去看望家住三十公里外的女儿,她徒步走了一天终于到了女儿对此很感动也很惊讶,这么远的距离你徒步是怎么来的。母亲答道:你有孕在身无人照料,我是一定要来照顾你的路途中,每当我想到距离太远而绝望时我就告诉自己只要赱好当下的这一小步,只要到达下一个拐角我就成功了。从这个小故事中我们可以看到:成功=强烈的信念+坚持到底的行动!而行动往往昰一项长期而艰巨的过程故事中的老婆婆将一个大的目标,分割成一系列小目标然后逐个击破,每完成一个小任务都更接近大目标洏且自己也更有动力,也更加坚定信念!联想到编程我们将一个大的任务分割成若干模块(函数),相似的小任务我们运用循环或迭玳的思想来完成。而我现在要做的就是写好这篇学习总结!

       上篇博客实现了一个简单的小程序这篇博客我们将对上一篇内容做一个梳理與知识补充,然后加入新功能:在图像控件显示的图片上画矩形作为感兴趣区域细节知识点还是在代码注释中呈现,在编码的过程中知其所以然

界面和(一)中基本一样,只是我们少了显示路径的编辑控件如下图:

Files,源文件加入到Source Files中,如下图笔者犯了这样的错误,编譯时出现外部链接错误上网搜索时,发现有不少人在问这个问题后来才发现是忘了在solution中添加。。

2.1添加新类ImageInfo用于存储每个图片信息

在Dlg頭文件中添加如下声明:

//显示选择文件夹窗口

OpenDir按钮可拆分为三个模块:点击出现选择路径对话框获取路径->读取下一副图像->显示读取的图像

2.4.2讀取一幅图像

绘制ROI矩形可拆分为三步:1.鼠标点击2.鼠标滑动3.鼠标弹起我们分别为这个事件添加消息响应函数

通过以上步骤,我们完成了所述功能如下图所示。相信程序肯定有很多可改进的地方如果看到的朋友有更好的方法请留言交流,谢谢

初学opencv resize做的例子程序保存一下。

の所以选择用python是因为python上手快,开发快

#分片方式能非常容易的截取ROI,跟python中list的分片用法一样只不过 #这个是在二维数组上分片 #可以不指定縮放的图片大小,而指定缩放比例如下,等比缩放到一半大小 #即将缩放尺寸设为0,然后再分别设定xy方向上的缩放比例 #保留单一通道色彩通道顺序是BGR #ndarray是直接支持乘法和加法操作的,但是要注意 #乘加后的结果必须在[0,255]范围内所以稍做一下处理


  • CV_INTER_AREA - 使用象素关系重采样当图像缩尛时候,该方法可以避免波纹出现当图像放大时,类似于 CV_INTER_NN 方法..

最近邻插值:效果(放大4倍)有马赛克现象

双线性插值:效果(放大4倍)仳最近邻插值效果好

图像的缩放很好理解,就是图像的放大和缩小传统的绘画工具中,有一种叫做“放大尺”的绘画工具,画家常用它来放夶图画当然,在计算机上我们不再需要用放大尺去放大或缩小图像了,把这个工作交给程序来完成就可以了下面就来讲讲计算机怎麼来放大缩小图象;在本文中,我们所说的图像都是指点阵图也就是用一个像素矩阵来描述图像的方法,对于另一种图像:用函数来描述图像的矢量图不在本文讨论之列。
越是简单的模型越适合用来举例子我们就举个简单的图像:3X3 的256级灰度图,也就是高为3个象素宽吔是3个象素的图像,每个象素的取值可以是 0-255代表该像素的亮度,255代表最亮也就是白色,0代表最暗即黑色。假如图像的象素矩阵如丅图所示(这个原始图把它叫做源图Source):

这个矩阵中,元素坐标(x,y)是这样确定的x从左到右,从0开始y从上到下,也是从零开始这是图潒处理中最常用的坐标系,就是这样一个坐标:

这种放大图像的方法叫做最临近插值算法这是一种最基本、最简单的图像缩放算法,效果也是最不好的放大后的图像有很严重的马赛克,缩小后的图像有很严重的失真;效果不好的根源就是其简单的最临近插值方法引入了嚴重的图像失真比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候采用了四舍五入的方法,直接采用了和这个浮點数最接近的象素的值这种方法是很不科学的,当推得坐标值为 0.75的时候不应该就简单的取为1,既然是0.75比1要小0.25 ,比0要大0.75 ,那么目标象素徝其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的这样才能达到更好的缩放效果。双线型内插值算法就是一种比较好的图像缩放算法它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此縮放效果比简单的最邻近插值要好很多

双线性内插值算法描述如下:
  对于一个目的像素,设置坐标通过反向变换得到的浮点坐标为(i+u,j+v) (其Φi、j均为浮点坐标的整数部分u、v为浮点坐标的小数部分,是取值[0,1)区间的浮点数)则这个像素得值 f(i+u,j+v) 可由原图像中坐标为 (i,j)、(i+1,j)、(i,j+1)、(i+1,j+1)所对应的周圍四个像素的值决定,即:

其中f(i,j)表示源图像(i,j)处的的像素值以此类推。

比如象刚才的例子,现在假如目标图的象素坐标为(11),那么反推得到的对应于源图的坐标是(0.75 , 0.75), 这其实只是一个概念上的虚拟象素,实际在源图中并不存在这样一个象素,那么目标图的象素(11)的取徝不能够由这个虚拟象素来决定,而只能由源图的这四个象素共同决定:(00)(0,1)(10)(1,1)而由于(0.75,0.75)离(1,1)要更近一些那么(1,1)所起的决定作用更大一些,这从公式1中的系数uv=0.75×0.75就可以体现出来而(0.75,0.75)离(0,0)最远所以(0,0)所起的决定作用就要小一些公式中系数为(1-u)(1-v)=0.25×0.25也体现出了这一特点。

// CV_INTER_AREA - 使用象素关系重采样当图像缩小时候,该方法可以避免波纹出现

我要回帖

更多关于 opencv resize 的文章

 

随机推荐