OpenCV學(xué)習(xí)之路(五)——初級(jí)圖像混合&調(diào)整圖像亮度與對(duì)比度

初級(jí)圖像混合

理論——線性混合操作

  • g(x) = (1-α)f<small><small><small>0</small></small></small>(x) + αf<small><small><small>1</small></small></small>(x)
    其中α取值范圍為0~1之間。

addWeighted函數(shù)
這個(gè)函數(shù)的作用是鳞溉,計(jì)算兩個(gè)數(shù)組(圖像陣列)的加權(quán)和卑惜。原型如下:

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
  • 第一個(gè)參數(shù)膏执,InputArray類(lèi)型的src1,表示需要加權(quán)的第一個(gè)數(shù)組残揉,常常填一個(gè)Mat對(duì)象胧后。
  • 第二個(gè)參數(shù),alpha抱环,表示第一個(gè)數(shù)組的權(quán)重值壳快,0~1之間。
  • 第三個(gè)參數(shù)镇草,src2眶痰,表示第二個(gè)數(shù)組,它需要和第一個(gè)數(shù)組擁有相同的尺寸和通道數(shù)梯啤。
  • 第四個(gè)參數(shù)竖伯,beta,表示第二個(gè)數(shù)組的權(quán)重值,一般為1-alpha七婴。
  • 第五個(gè)參數(shù)祟偷,gamma,一個(gè)加到權(quán)重總和上的標(biāo)量值打厘⌒蕹Γ看下面的式子自然會(huì)理解。
  • 第六個(gè)參數(shù)户盯,dst嵌施,輸出的數(shù)組,它和輸入的兩個(gè)數(shù)組擁有相同的尺寸和通道數(shù)莽鸭。
  • 第七個(gè)參數(shù)吗伤,dtype,輸出陣列的可選深度硫眨,有默認(rèn)值-1足淆;當(dāng)兩個(gè)輸入數(shù)組具有相同的深度時(shí),這個(gè)參數(shù)設(shè)置為-1(默認(rèn)值)捺球,即等同于src1.depth()缸浦。

如果用數(shù)學(xué)公式來(lái)表達(dá)夕冲,addWeighted函數(shù)計(jì)算如下兩個(gè)數(shù)組(src1和src2)的加權(quán)和氮兵,得到結(jié)果輸出給第四個(gè)參數(shù)。即addWeighted函數(shù)的作用可以被表示為為如下的矩陣表達(dá)式為:
dst = src1[I]*alpha + src2[I]*beta + gamma;
示例代碼:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[]) {
    
    //加載原圖像 (必須兩張相同的尺寸和通道數(shù)的圖片)
    Mat src1, src2, dst, addResult, multiplyResult;
    src1 = imread("/Users/Longxia/Downloads/IMG_0590.PNG", IMREAD_COLOR);
    src2 = imread("/Users/Longxia/Downloads/IMG_0589.PNG", IMREAD_COLOR);
    if (src1.empty()) {
        cout << "could not load src1 image" << endl;
        return -1;
    }
    if (!src2.data) {
        cout << "could not load src2 image" << endl;
        return -1;
    }
    double alpha = 0.5;
    if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) {
        add(src1, src2, addResult); // 很生硬的相加
        multiply(src1, src2, multiplyResult); // 相乘
        addWeighted(src1, alpha, src2, 1-alpha, 0, dst);
        
        imshow("addResult", addResult);  //顯示相加的圖像
        imshow("multiplyResult", multiplyResult);  //顯示相乘的圖像
        imshow("addWeighted", dst);  //addweighted函數(shù)所得圖像
    }
    else{
        cout << "src1 is not same as src2" << endl;
    }
    
    waitKey(0);
    return 0;
}

調(diào)整圖像亮度與對(duì)比度

圖像變換可以看做如下:
像素變換——點(diǎn)操作
領(lǐng)域操作——區(qū)域
調(diào)整圖像亮度和對(duì)比度屬于像素變換——點(diǎn)操作

  • g(i,j) = αf(i,j) + β歹鱼,其中α>0泣栈,β是增益變量

示例代碼:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[]) {
    
    //加載原圖
    Mat src, dst;
    src = imread("/Users/Longxia/Downloads/psb.jpeg", IMREAD_COLOR);
    if (src.empty()) {
        cout << "could not load src image" << endl;
        return -1;
    }
//    cvtColor(src, src, CV_RGB2GRAY);    //三通道轉(zhuǎn)變成單通道圖片
    imshow("src", src);
    
    int height = src.rows;
    int width = src.cols;
    dst = Mat::zeros(src.size(), src.type());
    float alpha = 1.2;  //對(duì)比度
    float beta = 100;    //亮度
    
    // 變成float就可以Vec3f讀取bgr值
    Mat m1;
    src.convertTo(m1, CV_32F);
    
    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {
            if (src.channels() == 3) {
                float b = src.at<Vec3b>(row, col)[0];
                float g = src.at<Vec3b>(row, col)[1];
                float r = src.at<Vec3b>(row, col)[2];
//                float b = m1.at<Vec3f>(row, col)[0];
//                float g = m1.at<Vec3f>(row, col)[1];
//                float r = m1.at<Vec3f>(row, col)[2];
                // 增加亮度、對(duì)比度后的圖片
                dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
                dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
                dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
            }
            else if (src.channels() == 1){
                float v = src.at<uchar>(row, col);
                dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
            }
        }
    }
    
    char output_title[] = "contrast and brightness Demo";
    imshow(output_title, dst);
    
    waitKey(0);
    return 0;
}

若圖片大小不一樣弥姻,示例代碼如下:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <math.h>

using namespace cv;
using namespace std;

int main(int argc, const char * argv[]) {

    Mat src1, src2;
    src1 = imread("/Users/Longxia/Downloads/IMG_0590.PNG", IMREAD_COLOR);
    src2 = imread("/Users/Longxia/Downloads/asdf.jpeg", IMREAD_COLOR);
    
    if (src1.empty()) {
        cout << "could not load src1 image" << endl;
        return -1;
    }
    if (!src2.data) {
        cout << "could not load src2 image" << endl;
        return -1;
    }
    Mat imageROI=src1(Rect(20,20,src2.cols,src2.rows));
    double alpha = 0.5;
    addWeighted(imageROI, alpha, src2, 1-alpha, 0, imageROI);
    imshow("src1", src1);
    
    waitKey(0);
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末南片,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子庭敦,更是在濱河造成了極大的恐慌疼进,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秧廉,死亡現(xiàn)場(chǎng)離奇詭異伞广,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)疼电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)嚼锄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人蔽豺,你說(shuō)我怎么就攤上這事区丑。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵沧侥,是天一觀的道長(zhǎng)可霎。 經(jīng)常有香客問(wèn)我,道長(zhǎng)宴杀,這世上最難降的妖魔是什么啥纸? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮婴氮,結(jié)果婚禮上斯棒,老公的妹妹穿的比我還像新娘。我一直安慰自己主经,他們只是感情好荣暮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著罩驻,像睡著了一般穗酥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上惠遏,一...
    開(kāi)封第一講書(shū)人閱讀 51,708評(píng)論 1 305
  • 那天砾跃,我揣著相機(jī)與錄音,去河邊找鬼节吮。 笑死抽高,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的透绩。 我是一名探鬼主播翘骂,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼帚豪!你這毒婦竟也來(lái)了碳竟?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狸臣,失蹤者是張志新(化名)和其女友劉穎莹桅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體烛亦,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诈泼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了此洲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂汗。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖呜师,靈堂內(nèi)的尸體忽然破棺而出娶桦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布衷畦,位于F島的核電站栗涂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏祈争。R本人自食惡果不足惜斤程,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望菩混。 院中可真熱鬧忿墅,春花似錦、人聲如沸沮峡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邢疙。三九已至棍弄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疟游,已是汗流浹背呼畸。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颁虐,地道東北人蛮原。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像聪廉,于是被迫代替她去往敵國(guó)和親瞬痘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容