日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

图像的线性混合

發(fā)布時(shí)間:2024/9/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 图像的线性混合 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[TOC]


注:原創(chuàng)不易,轉(zhuǎn)載請(qǐng)務(wù)必注明原作者和出處,感謝支持!

一 圖像的線性混合

什么是圖像的線性混合(linear blending)?

如下面的公式所示。所謂的圖像線性混合是指對(duì)于輸入的兩張圖像$I_0$和$I_1$,取它們相同位置處的像素值進(jìn)行線性相加,然后將結(jié)果賦值給目標(biāo)圖像相同位置處的像素。其中參數(shù)$\alpha$控制了兩張圖片在目標(biāo)圖像中的權(quán)重。

\[ g(x) = \alpha I_0(x) + (1-\alpha)I_1(x) \]

圖像的線性混合有什么作用呢?在幻燈片翻頁(yè)或者電影制作中,經(jīng)常需要產(chǎn)生畫面疊加的效果。在上式中,只要使得$\alpha$從1逐漸減小到0即可產(chǎn)生從圖像$I_0$過(guò)渡到圖像$I_1$時(shí)的疊加效果了。

OpenCV中提供了一個(gè)用于兩張圖像線性混合的API。API所依據(jù)的計(jì)算公式如下:

\[ dst(I) = saturate\_cast(src1(I) * alpha + src2(I) * beta + gamma) \] void cv::addWeighted(InputArray src1, // 輸入圖像1double alpha, // 圖像1的權(quán)重InputArray src2, // 輸入圖像2double beta, // 圖像2的權(quán)重double gamma, // gamma值OutputArray dst, // 輸出圖像int dtype = -1 );

注意:用于線性混合的兩張圖像必須是同等大小和同等類型的!


二 代碼實(shí)現(xiàn)

如果不使用OpenCV提供的API,僅依靠OpenCV提供的像素級(jí)訪問(wèn)功能,則圖像的線性混合可以實(shí)現(xiàn)如下。

#include <iostream> #include <opencv2/opencv.hpp>using namespace cv; using namespace std;int main(int argc, char **argv) {// load two images with the same size and typeMat windows = imread("D:\\IMG\\windows.jpg", IMREAD_COLOR);Mat linux = imread("D:\\IMG\\linux.jpg", IMREAD_COLOR);if (windows.empty() || linux.empty()){cout << "Error : could not load image." << endl;return -1;}imshow("input - windows", windows);imshow("input - linux", linux);// check if two images are with the same size and typeif (windows.size() != linux.size() || windows.type() != linux.type()){cout << "Error : two input images do NOT match in size or type." << endl;return -1;}// parameters for linear blendingdouble alpha = 0.5;double beta = 1 - alpha;double gamma = 0.0;Mat dst(windows.size(), windows.type());decltype(windows.rows) row, col;double output, b, g, r;int f1, f2, b1, b2, g1, g2, r1, r2;for (row = 0; row < windows.rows; ++row){for (col = 0; col < windows.cols; ++col){// single channel (gray image) or three channels (RGB image) onlyif (windows.channels() == 1){f1 = windows.at<uchar>(row, col);f2 = linux.at<uchar>(row, col);output = f1 * alpha + f2 * beta + gamma;dst.at<uchar>(row, col) = saturate_cast<uchar>(output);}else if (windows.channels() == 3){b1 = windows.at<Vec3b>(row, col)[0];b2 = linux.at<Vec3b>(row, col)[0];g1 = windows.at<Vec3b>(row, col)[1];g2 = linux.at<Vec3b>(row, col)[1];r1 = windows.at<Vec3b>(row, col)[2];r2 = linux.at<Vec3b>(row, col)[2];b = b1 * alpha + b2 * beta + gamma;g = g1 * alpha + g2 * beta + gamma;r = r1 * alpha + r2 * beta + gamma;dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b);dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g);dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r);}}}imshow("output (alpha = 0.5)", dst);waitKey(0);return 0; }

如果使用addWeighted(),則可以簡(jiǎn)單地實(shí)現(xiàn)如下

addWeighted(windows, alpha, linux, beta, 0, dst); imshow("output (alpha = 0.9)", dst);

三 實(shí)現(xiàn)效果

(1) 兩張?jiān)瓐D

(2) 手寫代碼實(shí)現(xiàn),$\alpha$值分別為0.1、0.5、0.9

(3) 調(diào)用API實(shí)現(xiàn),$\alpha$值分別為0.1、0.5、0.9

可以看到,手寫代碼實(shí)現(xiàn)所呈現(xiàn)的效果和調(diào)用APIaddWeighted()的效果并沒(méi)有明顯的差異。但很可能的是自己手寫的與API相比,性能會(huì)更差一點(diǎn)。

轉(zhuǎn)載于:https://www.cnblogs.com/laizhenghong2012/p/11253100.html

與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的图像的线性混合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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