日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

生成step文件_利用opencv给彦女王生成一副蒙太奇画像

發(fā)布時(shí)間:2024/7/5 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 生成step文件_利用opencv给彦女王生成一副蒙太奇画像 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好呀,前兩天烈陽(yáng)天道1上映了,不知道大家看沒(méi)看呢,里面還有一小段彥穿越蟲(chóng)洞與猴哥相遇的畫(huà)面,彥女王啊啊啊~~

所以我去網(wǎng)上爬了二百來(lái)張我大學(xué)的風(fēng)景畫(huà),然后找了以前存的彥女王的圖片,生成了一幅蒙太奇畫(huà)像。然后我兩個(gè)熱愛(ài)的就合體啦!

先看一下什么是蒙太奇圖像吧,其實(shí)你肯定見(jiàn)過(guò),只不過(guò)不知道叫蒙太奇而已:

一張大的圖片,是由很多小的圖片拼接而成的這種,就是蒙太奇圖像啦(或者叫馬賽克拼圖),我要做的就是把我大學(xué)的風(fēng)景圖拼成彥的圖片。

綜述實(shí)現(xiàn)思路

文末附有python代碼,本文為我寫(xiě)的C++代碼

1:讀取文件夾內(nèi)的風(fēng)景圖片集,將每張剪裁到90*45大小并存入Mat容器內(nèi)

2:將圖片模板(彥的照片)擴(kuò)大為1600*2700大小

3:計(jì)算圖片集的直方圖并將結(jié)果存到MatND容器內(nèi)(直方圖容器)

4:雙重for循環(huán)以90*45的步長(zhǎng)遍歷圖片模板計(jì)算各個(gè)區(qū)域的直方圖,并將區(qū)域直方圖與圖片集的直方圖進(jìn)行比對(duì),得到相似度最高的風(fēng)景圖片,將該風(fēng)景圖片替換模板對(duì)應(yīng)區(qū)域

5:將4步得到的蒙太奇圖與原模板圖線性相加,得到更為逼真的效果

是不是很簡(jiǎn)單的過(guò)程?但就這么個(gè)過(guò)程,我調(diào)了一天的bug,然后被迫深入理解了C++的動(dòng)態(tài)回收機(jī)制... ... 建議感興趣的小伙伴自己實(shí)現(xiàn)一下。

以下代碼在主函數(shù)內(nèi)順次復(fù)制粘貼即可

1:讀取圖片集并預(yù)處理

//【1】圖片集的采集與處理 int Images_number = 256;//圖片集中圖片的數(shù)量 int step_x = 80; //將圖片剪裁為80*45大小 int step_y = 45;Mat srcImage; vector<Mat> load_Images;//圖片集容器 char filename[30];//存儲(chǔ)圖片名字 for (int i = 0; i < Images_number; i++) {Mat dstImage;sprintf_s(filename, "./風(fēng)景圖/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函數(shù)得到圖片集有規(guī)律的命名,然后for循環(huán)依次將imread到的圖片push_back添加到Mat容器內(nèi)就可以了。

二百多張圖片如何快速整齊的命名,,,看鏈接。

https://jingyan.baidu.com/article/b87fe19e4834a95218356814.html

2:調(diào)整原模板圖的尺寸大小

//【2】將原模板圖擴(kuò)大到合適尺寸 Mat originalImage, showImage; originalImage = imread("彥.jpg"); imshow("彥", originalImage); resize(originalImage, showImage, Size(1600, 2700));

沒(méi)啥好說(shuō)的,就在基本保持原先長(zhǎng)寬比例的條件下,讓長(zhǎng)寬都是90*45(圖片集被裁剪的大小)的整數(shù)倍就好了。

3:計(jì)算圖片集直方圖

//【3】計(jì)算圖片集的直方圖 int width = showImage.cols; //模板圖的長(zhǎng)寬 int height = showImage.rows; Mat frame; vector<MatND> hsit_list;//直方圖容器 //計(jì)算直方圖的參數(shù)準(zhǔn)備 int bins = 128; //直條數(shù) int hist_sizes[] = { bins,bins,bins }; //存放每個(gè)維度的直方圖尺寸數(shù)組 // 均為256條寬度 float range[] = { 0,256 }; //每一維數(shù)組的取值范圍 // 均為0-255高度 const float* ranges[] = { range,range,range }; int channels[] = { 0,1,2 }; //for循環(huán)計(jì)算圖片集的直方圖并存儲(chǔ) 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); }

和第一步套路類似,循環(huán)計(jì)算了圖片集所有圖的直方圖并存儲(chǔ)到了一個(gè)直方圖容器內(nèi)。

4:遍歷彥模板圖,計(jì)算每一小塊的直方圖并對(duì)比,替換

//【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)//參數(shù)準(zhǔn)備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_) {//尋找對(duì)比對(duì)最高的number_order = i;match_ = match;}}load_Images[number_order].copyTo(roiImage);} } cout << "【4】遍歷,尋找最匹配的圖片并替換成功" << endl;

首先兩個(gè)步長(zhǎng)分別為step_y和step_x的循環(huán)是遍歷原圖模板各個(gè)小塊區(qū)域,并計(jì)算該塊的直方圖。

之后用一個(gè)for循環(huán)在第三步得到的直方圖容器內(nèi),尋找與該塊直方圖匹配度最高的風(fēng)景圖片,然后將該風(fēng)景圖片替換原圖對(duì)應(yīng)區(qū)域。

到此運(yùn)行完畢我們就可以得到一個(gè)不太完美的蒙太奇圖片了:

雖然有些粗糙,但已經(jīng)可以看出來(lái)了叭!效果可以調(diào)節(jié)裁剪的大小或者原圖模板的大小來(lái)改善。但以我代碼設(shè)置的參數(shù),執(zhí)行完都要好幾分鐘,如果有什么優(yōu)化建議可以交流哈。

來(lái)看看女王的腿!

嗯,,竟然是用碑組成的。

我們還可以通過(guò)第五步,將上圖左圖與右圖加權(quán)得到更為逼真的蒙太奇畫(huà)像。

5:將效果圖與原圖加和

Mat dstImage; addWeighted(showImage, 0.4, montageImage, 0.6, 0, dstImage); imwrite("結(jié)果圖.jpg", dstImage); imwrite("show.jpg", montageImage);

加和后的效果圖:

效果是不是好一些了?可以更改參數(shù)使效果更好。由于我還有毛概論文沒(méi)寫(xiě),就不瞎搞了~

THE END

本文靈感來(lái)自知乎@三木青年,代碼都是我自己敲的,網(wǎng)上關(guān)于蒙太奇的大概只有我用的C++了,python代碼可以看知乎鏈接:

https://zhuanlan.zhihu.com/p/168667043

這么好的一篇文,能不能求個(gè)贊呢?

總結(jié)

以上是生活随笔為你收集整理的生成step文件_利用opencv给彦女王生成一副蒙太奇画像的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。