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

图像特效显示(下)

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

图像特效显示(上)

上篇文讲了图像特效显示之扫描显示,图像渐显与马赛克显示。本文继续。

图像的平移

移动是将图像看作一个整体,显示时不能像扫描那样,扫描方式有些像打开一副画,例如显示上部分的时候,下部分可以不现实,而移动则可以看成一块木板画,显示时必须按物理顺序进行,例如从上向下平移时,必须先显示下面的图像,后显示上面的图像,因此平移的算法比扫描难一些。

平移是一复制的方法显示图像的,每显示一次,复制的行数就增加一行,直至显示完成。

代码语言:javascript
复制
//移动显示
void Mobile_display()
{
  //读取图片
  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("移动显示");
  for (int i = 1; i < ImageWidth; i++) {//步长为1
    roiImage = srcImage(Rect(ImageWidth-i, 0, i, ImageHeigth));
    roiImage.copyTo(dstImage(Rect(0, 0, i, ImageHeigth)));
    imshow("移动显示", dstImage);
    waitKey(5);
  }
  waitKey(0);
}

动图

中间扩张

当我们打开电视机时,都有这样的感觉:电视图像是从屏幕中间开始,向上下两个方向展开的,这种效果就是中间扩张。中间扩张特效显示的原理其实并不难,在显示的时候,先将图像分成两部分,将中间分界处显示在屏幕中央,并快速向上向下扫描图像,最后将图像完整的显示在屏幕上,这样人们因为视觉生理的特点就会看到中间扩张的效果。

代码语言:javascript
复制
//中间扩张
void Middle_expansion()
{
  //读取图片
  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("中间扩张");
  for (int i = 1; i <= ImageHeigth/2; i++) {//步长为1
    roiImage = srcImage(Rect(0, ImageHeigth / 2 - i, ImageWidth, i));
    roiImage.copyTo(dstImage(Rect(0, ImageHeigth / 2 - i, ImageWidth, i)));
    roiImage = srcImage(Rect(0, ImageHeigth / 2, ImageWidth, i));
    roiImage.copyTo(dstImage(Rect(0, ImageHeigth / 2, ImageWidth, i)));

    imshow("中间扩张", dstImage);
    waitKey(5);
  }
  waitKey(0);
}

动图

水平栅条特效

栅条特效分为水平栅条和垂直栅条,其效果如同将两手交叉的过程,栅条显示的原理是先将图像分为若干行,将奇数行组成一组,偶数行组成一组,在显示时奇数行从右向左平移,偶数行从左向右平移。

代码语言:javascript
复制
//水平栅条特效
void Grid_effect()
{
  //读取图片
  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;
  int step=10;//每个栅格宽度
  namedWindow("中间扩张");
  for (int i = 1; i < ImageWidth+1; i=i+10) {//步长为1
    for (int j = 0; j < ImageHeigth; j=j+2*step) {//步长为1
      //奇数行从右往左
      roiImage = srcImage(Rect(0, j, i, step));
      roiImage.copyTo(dstImage(Rect(ImageWidth - i, j, i, step)));
      //偶数行从左往右
      int k = j + step;
      roiImage = srcImage(Rect(ImageWidth - i, k, i, step));
      roiImage.copyTo(dstImage(Rect(0, k, i, step)));

      imshow("中间扩张", dstImage);
      waitKey(1);
    }
  }
  waitKey(0);
}

动图

THE END

图像特效显示就到这儿了,比较简单,也没太大实际用途,主要是增强一下对图像操作的熟练度。

下篇更【图像灰度变换】,包括手写二值化与阈值处理,灰度线性,分段线性变换,非线性变换以及直方图。

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档