前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >图像特效显示(上)

图像特效显示(上)

作者头像
周旋
发布2022-08-07 12:13:08
1K0
发布2022-08-07 12:13:08
举报
文章被收录于专栏:行走的机械人行走的机械人

前言

准备11月份更一个新的系列,之前看的杨淑莹老师的《数字图像处理Visual Studio C++技术实现》,里面的代码都没来得及打,而且其是基于自定义的图像类实现的,这个系列就把所有例程移植为opencv-C++实现,也就是算法逻辑用C++实现,图像对象使用opencv自带的图像类。

该书在B站有配套教程,是天津理工大学杨淑莹老师的公开课,直接搜就行。

所以此系列不详细讲原理,只放基本思路+代码+运行效果,详细原理可以看书,我就不复述书的内容了。

图像扫描显示

向下扫描就是对图像进行分块并延时显示。

可以通过不断的改变显示的roi区域来达到扫描的效果:

代码语言:javascript
复制
void scanning_down()
{
  //读取图片
  Mat srcImage, dstImage;
  srcImage = imread("2.jpg");
  imshow("原图", srcImage);
  //定义变量
  Mat roiImage;
  int ImageHeigth = srcImage.rows;
  int ImageWidth = srcImage.cols;
  namedWindow("向下扫描");
  for (int i = 1; i < ImageHeigth; i++) {//步长为1
    roiImage = srcImage(Rect(0, 0, ImageWidth, i));
    roiImage.copyTo(dstImage);
    imshow("向下扫描", dstImage);
    waitKey(5);
  }
  waitKey(0);
}

动图

向上,向左,向右扫描显示同理。

图像渐显

图像渐显思路是先记录下图像每个像素点的像素值,显示的时候先将屏幕置黑,将循环显示图像n次,n依次为0,1,2,...,256。每一次显示像素值的n/256倍,从而达到渐显的效果。

代码语言:javascript
复制
void fade_in()//淡入
{
  //读取图片
  Mat srcImage, dstImage;
  srcImage = imread("2.jpg");
  dstImage = srcImage.clone();
  imshow("原图", srcImage);
  //定义变量
  Mat roiImage;
  int ImageHeigth = srcImage.rows;
  int ImageWidth = srcImage.cols * 3;
  namedWindow("图像渐显");
  for (int n = 1; n < 256; n++) {
    for (int i = 0; i < ImageHeigth; i++) {
      uchar* data1 = srcImage.ptr<uchar>(i);
      uchar* data2 = dstImage.ptr<uchar>(i);
      for (int j = 0; j < ImageWidth; j++) {
        data2[j] = data1[j] * n / 256;

      }
    }
    imshow("图像渐显", dstImage);
    waitKey(10);
  }
}

动图

马赛克显示

马赛克显示是将图片分为固定大小的小块,并记录下所有小块的左上角坐标,然后随机将这些小块显示出来,就是马赛克效果。

代码语言:javascript
复制
//图像马赛克显示
void mosaic() 
{
  //读取图片
  Mat srcImage, dstImage;
  srcImage = imread("2.jpg");
  dstImage = Mat(srcImage.size(), CV_8UC3);
  imshow("原图", srcImage);
  //定义变量
  Mat roiImage;
  int ImageHeigth = srcImage.rows;
  int ImageWidth = srcImage.cols;
  namedWindow("图像马赛克显示");
  //存储每个小块的首地址并随机打乱
  int step =24;//定义马赛克边长(正方形)
  vector<Point2d> temp;
  unsigned int mi = 0;
  //for循环存储所有节点坐标
  for (int x = 0; x < ImageWidth; x = x + step) {
    for (int y = 0; y < ImageHeigth; y = y + step) {
      if (x > ImageWidth - step) {
        x = ImageWidth - step;
      }
      if (y > ImageHeigth - step) {
        y = ImageHeigth - step;
      }
      temp.push_back(Point2d(x,y));
      mi++;
    }
  }  
  random_shuffle(temp.begin(), temp.end());//打乱容器内元素
  //for循环显示每个随机马赛克
  for (int i = 0; i < mi; i++) {
    srcImage(Rect(temp[i].x, temp[i].y, step, step)).copyTo(dstImage(Rect(temp[i].x, temp[i].y, step, step)));
    imshow("图像马赛克显示", dstImage);
    waitKey(1);
  }
  waitKey(0);
}

动图

THE END

今天就到这里啦。明天更新图像平移,交叉飞入,中间扩张,栅条特效,百叶窗特效这几个图像显示效果。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 周旋机器视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档