幻灯片北京大学_第1页
幻灯片北京大学_第2页
幻灯片北京大学_第3页
幻灯片北京大学_第4页
幻灯片北京大学_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、09级计算机 侯世安2010.11第34届SIGGRAPH 2007数字图形学年会上,以色列的两位教授Shai Avidan和Ariel Shamir,展示了一种新的缩放裁剪图像方法,他们称之为这项技术能计算出图像上的关键部分和不重要区域,从而使得随意改变一个图像的高宽比(aspect ratio)但不会让内容变得扭曲成为可能。简单的说,利用这个技术我们可以在缩放时固定图片中特定区域的大小,或者可以在缩小时让特定的区块被周围图像缝合消除,并且因为“seam carving”的缝补算法,你可以让图片缩放后仍然维持整体的完整性。举实际应用的例子来说,利用Seam Carving我们可以将原本窄镜头

2、的夕阳照片,修改成广角镜头的夕照,可是中心主题的太阳不会因为图片拉宽而变形;或者我们可以将原本中间隔著距离的两人合照,修改成靠在一起的合照,但是图片也不会因为修改变形。这是一个很有趣,也让人觉得很厉害的技术,完全不同于一般的图片工具。裁剪图片,保留重要区域拉伸图片,保留重要区域形状无缝去除图片中的一个区域先讨论图片剪裁时的情况一、分析图像中各区域的“重要程度”(能量函数)二、不断寻找能量最小的路径(Seam),将它Carve掉Seam Carving采用的能量函数:图像的梯度信息e(I) = abs(I / x) + abs(I / y)即,图片中色彩反差大的地方,很可能是图片重点区域的边缘。

3、路径:贯穿左右(上下)每向右一格,向上向下最多偏移一个像素(是否可以改进?)n2时间的动态规划的算法M(i, j) = e(i, j)+min(M(i1, j1),M(i1, j),M(i1, j+1)找到Seam后将它去掉,然后图片左右(上下)两部分合并增加保护区域和删除区域(遮罩Mask)让用户可以手动指定哪部分区域是重要的或不重要的。保护区域:能量无限大删除区域:能量减去一个固定值(是否是最好的方法?)梯度函数:void BrightGradient(const IplImage *src,IplImage *gra)for (int h=0;hheight-1;h+)for (int

4、w=0;wwidth-1;w+)G(h,w)=(abs(B(0,0)-B(0,1)+abs(B(0,0)-B(1,0)/3;算法核心(动规):for(i=1;iwidth;i+)for(j=0;jimageData+(a)-widthStep*(y)(x)/提取32S图像a的点#define Ps(a,x,y) (int*)(a)-imageData+(a)-widthStep*(y)(x)/提取8S图像a的点#define Pc(a,x,y) (char*)(a)-imageData+(a)-widthStep*(y)(x)/提取8U3C图像a的点#define Pr(a,x,y,c) (u

5、char*)(a)-imageData+(a)-widthStep*(y)(x)*3+(c)Windows和用户交互的方式是Win32程序的用户界面(UI)部分工作方式:当有很多消息同时产生时,没有被处理的消息会放到消息队列中。每个与窗口相关的线程维护一个消息队列。int WINAPI WinMain((省略))(省略)(建立窗口,等等)MSG msg;while (GetMessage(&msg, NULL, 0, 0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;#include “hi

6、ghgui.h”本质上和Win32编程是一样的,底层还是调用的Win32 API接口。不过确实让编程变得容易了不少。cvSetMouseCallback( “Working Place”, on_mouse, 0 );/将鼠标消息关联到用户自己定义的on_mouse()函数void on_mouse( int event, int x, int y, int flags, void* ) if( !dis ) return; if( event = CV_EVENT_LBUTTONUP | !(flags & CV_EVENT_FLAG_LBUTTON ) ) prev_pt = cv

7、Point(-1,-1);/鼠标左键按下则记录当前鼠标坐标 else if( event = CV_EVENT_LBUTTONDOWN ) prev_pt = cvPoint(x,y); else if( event = CV_EVENT_MOUSEMOVE & (flags & CV_EVENT_FLAG_LBUTTON) )/鼠标坐标滑动时不断调用cvLine函数画直线 CvPoint pt = cvPoint(x,y); if( prev_pt.x 0 ) prev_pt = pt;/在图像 mask 和 dis 中画出直线并改变其对应的像素值 cvLine( mask, prev_pt, pt, cvScalarAll(0 xff), 25, 8, 0 ); cvLine( dis, prev_pt, pt, cvScalarAll(0 xff), 25, 8, 0 ); prev_pt = pt; cvShowImage( Working Place, dis );。(省略右键部分代码)对画面重点的摆放有要求高度压缩下图像易变形,容易出现45度倾斜的边缘用Seam Carving实现图片的拉伸。可以做键盘响应逐步拉伸,也可以通过

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论