优秀个人网站模板下载,可以观看国外短视频的app,专业网站托管,做网站公司宁波上市大家好呀#xff0c;前两天烈阳天道1上映了#xff0c;不知道大家看没看呢#xff0c;里面还有一小段彦穿越虫洞与猴哥相遇的画面#xff0c;彦女王啊啊啊~~所以我去网上爬了二百来张我大学的风景画#xff0c;然后找了以前存的彦女王的图片#xff0c;生成了一幅蒙太奇画…大家好呀前两天烈阳天道1上映了不知道大家看没看呢里面还有一小段彦穿越虫洞与猴哥相遇的画面彦女王啊啊啊~~所以我去网上爬了二百来张我大学的风景画然后找了以前存的彦女王的图片生成了一幅蒙太奇画像。然后我两个热爱的就合体啦先看一下什么是蒙太奇图像吧其实你肯定见过只不过不知道叫蒙太奇而已一张大的图片是由很多小的图片拼接而成的这种就是蒙太奇图像啦或者叫马赛克拼图我要做的就是把我大学的风景图拼成彦的图片。综述实现思路文末附有python代码本文为我写的C代码1读取文件夹内的风景图片集将每张剪裁到90*45大小并存入Mat容器内2将图片模板彦的照片扩大为1600*2700大小3计算图片集的直方图并将结果存到MatND容器内直方图容器4双重for循环以90*45的步长遍历图片模板计算各个区域的直方图并将区域直方图与图片集的直方图进行比对得到相似度最高的风景图片将该风景图片替换模板对应区域5将4步得到的蒙太奇图与原模板图线性相加得到更为逼真的效果是不是很简单的过程但就这么个过程我调了一天的bug然后被迫深入理解了C的动态回收机制... ... 建议感兴趣的小伙伴自己实现一下。以下代码在主函数内顺次复制粘贴即可1读取图片集并预处理//【1】图片集的采集与处理
int Images_number 256;//图片集中图片的数量
int step_x 80; //将图片剪裁为80*45大小
int step_y 45;Mat srcImage;
vectorMat load_Images;//图片集容器
char filename[30];//存储图片名字
for (int i 0; i Images_number; i) {Mat dstImage;sprintf_s(filename, ./风景图/ysu (%d).jpg, i);cout filename endl;srcImage imread(filename); //Mat类图像resize(srcImage, dstImage, Size(step_x, step_y), 0, 0, INTER_NEAREST);load_Images.push_back(dstImage);
}
cout 图片加载完毕 endl;
主要用到了利用sprintf函数得到图片集有规律的命名然后for循环依次将imread到的图片push_back添加到Mat容器内就可以了。二百多张图片如何快速整齐的命名看链接。https://jingyan.baidu.com/article/b87fe19e4834a95218356814.html2调整原模板图的尺寸大小//【2】将原模板图扩大到合适尺寸
Mat originalImage, showImage;
originalImage imread(彦.jpg);
imshow(彦, originalImage);
resize(originalImage, showImage, Size(1600, 2700));
没啥好说的就在基本保持原先长宽比例的条件下让长宽都是90*45图片集被裁剪的大小的整数倍就好了。3计算图片集直方图//【3】计算图片集的直方图
int width showImage.cols; //模板图的长宽
int height showImage.rows;
Mat frame;
vectorMatND hsit_list;//直方图容器
//计算直方图的参数准备
int bins 128; //直条数
int hist_sizes[] { bins,bins,bins }; //存放每个维度的直方图尺寸数组 // 均为256条宽度
float range[] { 0,256 }; //每一维数组的取值范围 // 均为0-255高度
const float* ranges[] { range,range,range };
int channels[] { 0,1,2 };
//for循环计算图片集的直方图并存储
for (int i 0; i Images_number; i) {/*load_Images[i].copyTo(frame);*/MatND hsit_RGB;Mat frame;load_Images[i].copyTo(frame);calcHist(frame, 1, channels, Mat(), hsit_RGB, 3, hist_sizes, ranges, true, false);hsit_list.push_back(hsit_RGB);
}
和第一步套路类似循环计算了图片集所有图的直方图并存储到了一个直方图容器内。4遍历彦模板图计算每一小块的直方图并对比替换//【4】遍历寻找最匹配的图片并替换
int number_order;
for (int x 0; x height; x x step_y) {for (int y 0; y width; y y step_x) {Mat roiImage montageImage(Rect(y, x, step_x, step_y));//Rect(y, x, step_x, step_y)//参数准备MatND hsit_roi;double match_ 0.0;//匹配度calcHist(roiImage, 1, channels, Mat(), hsit_roi, 3, hist_sizes, ranges, true, false);for (int i 0; i Images_number; i) {double match;match compareHist(hsit_roi, hsit_list[i], HISTCMP_CORREL);if (match match_) {//寻找对比对最高的number_order i;match_ match;}}load_Images[number_order].copyTo(roiImage);}
}
cout 【4】遍历寻找最匹配的图片并替换成功 endl;
首先两个步长分别为step_y和step_x的循环是遍历原图模板各个小块区域并计算该块的直方图。之后用一个for循环在第三步得到的直方图容器内寻找与该块直方图匹配度最高的风景图片然后将该风景图片替换原图对应区域。到此运行完毕我们就可以得到一个不太完美的蒙太奇图片了虽然有些粗糙但已经可以看出来了叭效果可以调节裁剪的大小或者原图模板的大小来改善。但以我代码设置的参数执行完都要好几分钟如果有什么优化建议可以交流哈。来看看女王的腿嗯竟然是用碑组成的。我们还可以通过第五步将上图左图与右图加权得到更为逼真的蒙太奇画像。5将效果图与原图加和Mat dstImage;
addWeighted(showImage, 0.4, montageImage, 0.6, 0, dstImage);
imwrite(结果图.jpg, dstImage);
imwrite(show.jpg, montageImage);
加和后的效果图效果是不是好一些了可以更改参数使效果更好。由于我还有毛概论文没写就不瞎搞了~THE END本文灵感来自知乎三木青年代码都是我自己敲的网上关于蒙太奇的大概只有我用的C了python代码可以看知乎链接https://zhuanlan.zhihu.com/p/168667043这么好的一篇文能不能求个赞呢