图像特效显示 | 马赛克显示,扫描显示等
点击上方“AI算法与图像处理”,选择加"星标"或“置顶”
重磅干货,第一时间送达
来源:Opencv视觉实践

之前看的杨淑莹老师的《数字图像处理Visual Studio C++技术实现》,里面的代码都没来得及打,而且其是基于自定义的图像类实现的,这个系列就把所有例程移植为opencv-C++实现,也就是算法逻辑用C++实现,图像对象使用opencv自带的图像类。
该书在B站有配套教程,是天津理工大学杨淑莹老师的公开课,直接搜就行。
所以此系列不详细讲原理,只放基本思路+代码+运行效果,详细原理可以看书,我就不复述书的内容了。
向下扫描就是对图像进行分块并延时显示。
可以通过不断的改变显示的roi区域来达到扫描的效果:
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++) {//步长为1roiImage = srcImage(Rect(0, 0, ImageWidth, i));roiImage.copyTo(dstImage);imshow("向下扫描", dstImage);waitKey(5);}waitKey(0);}
动图

向上,向左,向右扫描显示同理。
图像渐显思路是先记录下图像每个像素点的像素值,显示的时候先将屏幕置黑,将循环显示图像n次,n依次为0,1,2,...,256。每一次显示像素值的n/256倍,从而达到渐显的效果。
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(i); uchar* data2 = dstImage.ptr(i); for (int j = 0; j < ImageWidth; j++) {data2[j] = data1[j] * n / 256;}}imshow("图像渐显", dstImage);waitKey(10);}}
动图

马赛克显示是将图片分为固定大小的小块,并记录下所有小块的左上角坐标,然后随机将这些小块显示出来,就是马赛克效果。
//图像马赛克显示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;//定义马赛克边长(正方形)vectortemp; 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);}
动图

如果喜欢此系列,可以帮忙点下底部小卡片支持一下。
下载1:何恺明顶会分享
在「AI算法与图像处理」公众号后台回复:何恺明,即可下载。总共有6份PDF,涉及 ResNet、Mask RCNN等经典工作的总结分析
下载2:leetcode 开源书
在「AI算法与图像处理」公众号后台回复:leetcode,即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有!
下载3 CVPR2020 在「AI算法与图像处理」公众号后台回复:CVPR2020,即可下载1467篇CVPR 2020论文 个人微信(如果没有备注不拉群!) 请注明:地区+学校/企业+研究方向+昵称 
觉得不错就点亮在看吧

评论

