这是一个简单的马赛克程序,利用选定矩形区域的平均值代替该区域各点的像素值。大家有没有更好的方法马赛克呢?

[c-sharp] view plaincopy
  1. #include <cv.h>
  2. #include <highgui.h>
  3. #pragma comment( lib, "cv.lib" )
  4. #pragma comment( lib, "cxcore.lib" )
  5. #pragma comment( lib, "highgui.lib" )
  6. IplImage* org = 0;
  7. IplImage* img = 0;
  8. IplImage* tmp = 0;
  9. IplImage* dst = 0;
  10. int foo=6;
  11. void on_mouse( int event, int x, int y, int flags, void* ustc)
  12. {
  13. CvPoint p0;
  14. CvPoint p1;
  15. if( event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))
  16. {
  17. img=cvCloneImage(tmp);
  18. cvResetImageROI(img);
  19. if(x<foo)
  20. {
  21. if(y<foo)
  22. {
  23. p0=cvPoint(0,0);
  24. p1=cvPoint(2*foo,2*foo);
  25. }
  26. else if(y>img->height-foo)
  27. {
  28. p0=cvPoint(0,img->height-2*foo);
  29. p1=cvPoint(2*foo,img->height);
  30. }
  31. else
  32. {
  33. p0=cvPoint(0,y-foo);
  34. p1=cvPoint(2*foo,y+foo);
  35. }
  36. }
  37. else if(x>img->width-foo)
  38. {
  39. if(y<foo)
  40. {
  41. p0=cvPoint(img->width-2*foo,0);
  42. p1=cvPoint(img->width,2*foo);
  43. }
  44. else if(y>img->height-foo)
  45. {
  46. p0=cvPoint(img->width-2*foo,img->height-2*foo);
  47. p1=cvPoint(img->width,img->height);
  48. }
  49. else
  50. {
  51. p0=cvPoint(img->width-2*foo,y-foo);
  52. p1=cvPoint(img->width,y+foo);
  53. }
  54. }
  55. else
  56. {
  57. if(y<foo)
  58. {
  59. p0=cvPoint(x-foo,0);
  60. p1=cvPoint(x+foo,2*foo);
  61. }
  62. else if(y>img->height-foo)
  63. {
  64. p0=cvPoint(x-foo,img->height-2*foo);
  65. p1=cvPoint(x+foo,img->height);
  66. }
  67. else
  68. {
  69. p0=cvPoint(x-foo,y-foo);
  70. p1=cvPoint(x+foo,y+foo);
  71. }
  72. }
  73. cvRectangle(img,p0,p1,CV_RGB(0,255,0));
  74. cvShowImage( "img", img );
  75. }
  76. else if( event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))
  77. {
  78. if(x<foo)
  79. {
  80. if(y<foo)
  81. {
  82. p0=cvPoint(0,0);
  83. p1=cvPoint(2*foo,2*foo);
  84. }
  85. else if(y>img->height-foo)
  86. {
  87. p0=cvPoint(0,img->height-2*foo);
  88. p1=cvPoint(2*foo,img->height);
  89. }
  90. else
  91. {
  92. p0=cvPoint(0,y-foo);
  93. p1=cvPoint(2*foo,y+foo);
  94. }
  95. }
  96. else if(x>img->width-foo)
  97. {
  98. if(y<foo)
  99. {
  100. p0=cvPoint(img->width-2*foo,0);
  101. p1=cvPoint(img->width,2*foo);
  102. }
  103. else if(y>img->height-foo)
  104. {
  105. p0=cvPoint(img->width-2*foo,img->height-2*foo);
  106. p1=cvPoint(img->width,img->height);
  107. }
  108. else
  109. {
  110. p0=cvPoint(img->width-2*foo,y-foo);
  111. p1=cvPoint(img->width,y+foo);
  112. }
  113. }
  114. else
  115. {
  116. if(y<foo)
  117. {
  118. p0=cvPoint(x-foo,0);
  119. p1=cvPoint(x+foo,2*foo);
  120. }
  121. else if(y>img->height-foo)
  122. {
  123. p0=cvPoint(x-foo,img->height-2*foo);
  124. p1=cvPoint(x+foo,img->height);
  125. }
  126. else
  127. {
  128. p0=cvPoint(x-foo,y-foo);
  129. p1=cvPoint(x+foo,y+foo);
  130. }
  131. }
  132. dst=cvCloneImage(tmp);
  133. cvSetImageROI(dst,cvRect(p0.x,p0.y,p1.x-p0.x,p1.y-p0.y));
  134. CvScalar mean=cvAvg(dst);
  135. cvSet(dst,mean);
  136. cvResetImageROI(dst);
  137. tmp=cvCloneImage(dst);
  138. cvRectangle(dst,p0,p1,CV_RGB(0,255,0));
  139. cvShowImage( "img", dst );
  140. }
  141. }
  142. int main()
  143. {
  144. org=cvLoadImage("lena.jpg",1);
  145. img=cvCloneImage(org);
  146. tmp=cvCloneImage(org);
  147. dst=cvCloneImage(org);
  148. cvNamedWindow("img",1);
  149. cvSetMouseCallback( "img", on_mouse, 0 );
  150. cvShowImage("img",img);
  151. cvWaitKey(0);
  152. cvDestroyAllWindows();
  153. cvReleaseImage(&org);
  154. cvReleaseImage(&img);
  155. cvReleaseImage(&tmp);
  156. cvReleaseImage(&dst);
  157. return 0;
  158. }

效果图如下,这里马赛克了lena图的左眼。

鼠标马赛克图像部分区域相关推荐

  1. 【Opencv系列】之显示图像以及使用鼠标截取图像局部区域进行放大

    序  本文主要介绍通过Opencv显示一副图像,同时又可以使用鼠标左键框选局部区域且放大一倍: 1. 使用IplImage的示例代码 #include <stdio.h> #include ...

  2. XP中准确对图像分区域着色(转)

    XP中准确对图像分区域着色(转) 当在幻灯片中插入图像后,发现图像颜色与幻灯片搭配不合适的话,你也许会使用图像工具栏中的"图像重新着色"命令,不过使用这种方式修改图像颜色时,难以准 ...

  3. OpenCV后投影,利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域。

    一.API函数 void mixChannels(const Mat* src,int nsrc,Mat* dst ,int ndst,const int* fromTo,size_t npairs) ...

  4. 显著性图matlab,cvpr14_saliency_code 2014上的关于图像显著性区域的检测matlab代码。 271万源代码下载- www.pudn.com...

    文件名称: cvpr14_saliency_code下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 4413 KB 上传时间: 2014-09-07 下载次 ...

  5. matplotlib可视化基本散点图、在图像指定区域绘制方框(Draw Rectangle)

    matplotlib可视化基本散点图.在图像指定区域绘制方框(Draw Rectangle) 目录 matplotlib可视化基本散点图.在图像指定区域绘制方框(Draw Rectangle)

  6. matplotlib可视化基本散点图、在图像指定区域绘制方框并进行自定义色彩填充(Draw Rectangle filled with color)

    matplotlib可视化基本散点图.在图像指定区域绘制方框并进行自定义色彩填充(Draw Rectangle filled with color) 目录

  7. 如何用python编写一个绘制马赛克图像的自写程序mask = np.zeros

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 这篇教程将会展示如何用python的图形化包"Pygame"和基础的文件I/O来创建一 ...

  8. Halcon算子--图像、区域、轮廓、测量、拟合、垂足、夹角

    Halcon算子–图像.区域.轮廓.测量.拟合.垂足.夹角 read_image (Image,'fabrik') 画矩形 draw_rectangle1 (3600, Row1, Column1, ...

  9. 图像有用区域 bfs

    图像有用区域 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 "ACKing"同学以前做一个图像处理的项目时,遇到了一个问题,他需要摘取出图片中某个黑 ...

最新文章

  1. js怎么实现对html代码加密解密,javascript脚本加密解密及HTML转JS
  2. python的scripts里没有pip_解决python scripts和pip缺失问题
  3. 社交背水一战?校园日记背后,支付宝野心你真能懂?
  4. p1164【立方体求和】
  5. element-ui 可复选树型表格
  6. 填补服务机器人市场空白,九号机器人提供智能服务场景解决方案!
  7. java平方和和立方和3_平方和与立方和
  8. Python——腾讯在线编程题(2018)
  9. PE格式第七讲,重定位表
  10. PoEdu - Windows阶段班 【Po学校】Windows编程 Lesson004_003-2 文件操作
  11. 基于Socket实现网络编程
  12. 维纳滤波法matlab代码,完整的维纳滤波器Matlab源程序
  13. Mockplus原型设计工具介绍
  14. 数据智仓功能介绍(一)
  15. 剑指offer | 面试题10:斐波那切数列
  16. 提问的智慧 - 艾瑞克.史蒂文.雷蒙德(Eric Steven Raymond)
  17. 合数python_python输出100以内的质数与合数
  18. python中经常使用的包扎材料_以下哪些是经常使用的包扎材料:
  19. RocketMQ 集群告警
  20. 网站架构优化性能概念

热门文章

  1. 10个重要的Linux ps命令实战
  2. linux内核中的GPIO系统之(2):pin control subsystem
  3. Android关机流程源码分析
  4. 在WINCE5.0开始菜单中添加应用程序
  5. python内置数字类型转换函数_Python学习 Day2-2 Python3的基本数据类型、数据内置类型转换函数...
  6. AIDL 客户端与服务端的双向通信
  7. 大数据时代的新型数据库 — 图数据库 Neo4j 的应用
  8. linux中rpm命令管理
  9. Cocos2d-x 基础元素
  10. asp.net treeView 节点 点击 变色