探索OpenCV中的addWeighted函數

在計算機視覺和圖像處理的領域中,我們常常需要對兩個圖像進行融合,以達到某種合成效果。OpenCV中提供了addWeighted函數,可以實現兩個圖像的疊加融合。本文將詳細介紹這個函數並提供相應的代碼示例。

一、addWeighted介紹

addWeighted函數是OpenCV中用於合成兩張圖像的函數,其函數原型如下:

void cv::addWeighted(
    InputArray src1,       //第一幅輸入圖像
    double alpha,          //第一幅圖像的權重
    InputArray src2,       //第二幅輸入圖像
    double beta,           //第二幅圖像的權重
    double gamma,          //亮度調整因子
    OutputArray dst,       //輸出圖像
    int dtype = -1         //輸出圖像的數據類型
);

其中,src1和src2為輸入的兩張圖像,alpha和beta為權重參數,gamma是亮度調整係數,用於調整融合後圖像的整體亮度;dst為輸出圖像,dtype為輸出圖像的數據類型。

addWeighted函數的作用是計算出輸出圖像dst,其中輸出圖像的像素值由下式計算得出:

其中,src1和src2分別乘以alpha和beta表示了兩幅圖像各自的權重,gamma則用於調節融合後圖像的亮度。

二、使用示例

接下來我們將通過幾個實例來演示如何使用addWeighted函數實現圖像融合。

1. 簡單的圖像融合

下面的示例實現了對兩幅圖像進行簡單的加權融合,其中兩幅圖像分別由原圖像和水平翻轉後的圖像構成,權重分別是0.5和0.5。

Mat src1 = imread("image1.jpg");
Mat src2, flip_src2;
flip(src2, flip_src2, 1);    //水平翻轉圖像2
Mat dst;
addWeighted(src1, 0.5, flip_src2, 0.5, 0, dst);    //圖像融合
imshow("dst", dst);
waitKey(0);

上述代碼中,首先讀入圖像1,並通過flip函數水平翻轉圖像2,然後將兩幅圖像進行融合,得到輸出圖像dst。

2. 對圖像添加遮罩

在實際應用中,我們可能需要在一幅圖像上添加一些遮罩,以達到特定的效果。下面的示例演示了如何在一張圖像上添加一個不透明的矩形遮罩,以達到將圖像中心區域變亮的效果。

Mat src = imread("image.jpg");
Mat mask(src.size(), CV_8UC1, Scalar(0));
Rect roi(src.cols/4, src.rows/4, src.cols/2, src.rows/2);
mask(roi) = Scalar(255);
Mat dst;
addWeighted(src, 1.0, src, 0.4, 0, dst, -1, mask);
imshow("dst", dst);
waitKey(0);

上述代碼中,我們首先讀入圖像,並定義一個與其尺寸相同的遮罩mask,將遮罩初始值設為0。然後我們定義了一個矩形roi,用於限制要處理的圖像區域。接着,我們將矩形區域在遮罩中對應的像素值設為255,表示該區域是不透明的。最後,我們將圖像src與圖像src的0.4倍進行加權融合,並輸出輸出圖像dst,mask參數用於指定融合的像素點。

3. 融合彩色圖像

下面的例子演示了如何融合彩色圖像,其中兩幅圖像分別由原圖像和將原圖像轉換為灰度圖像後再轉換為彩色圖像得到的圖像構成,權重分別是0.5和0.5。

Mat src = imread("image.jpg");
cvtColor(src, src, COLOR_BGR2GRAY);    //轉灰度圖像
cvtColor(src, src, COLOR_GRAY2BGR);    //轉彩色圖像
Mat src_gray;
cvtColor(src, src_gray, COLOR_BGR2GRAY);   //轉灰度圖像
Mat dst;
addWeighted(src, 0.5, src_gray, 0.5, 0, dst);
imshow("dst", dst);
waitKey(0);

上述代碼中,我們首先將圖像轉換為灰度圖像,然後通過轉換回彩色圖像得到一張與原圖像尺寸相同的彩色圖像。接着,我們又將彩色圖像轉換為灰度圖像,得到一張與原圖像尺寸相同的灰度圖像,用於和原圖像進行融合。最後,我們將原圖像和灰度圖像進行融合,得到融合後的輸出圖像dst。

三、總結

addWeighted是一個非常實用的函數,在計算機視覺和圖像處理領域有着廣泛的應用。本文介紹了addWeighted的函數原型和使用方法,並給出了幾個代碼示例,希望能夠幫助讀者更加深入地了解和掌握OpenCV中這個重要的圖像處理函數。

原創文章,作者:CLNP,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/131571.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CLNP的頭像CLNP
上一篇 2024-10-03 23:46
下一篇 2024-10-03 23:46

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • Python中capitalize函數的使用

    在Python的字符串操作中,capitalize函數常常被用到,這個函數可以使字符串中的第一個單詞首字母大寫,其餘字母小寫。在本文中,我們將從以下幾個方面對capitalize函…

    編程 2025-04-29
  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python中set函數的作用

    Python中set函數是一個有用的數據類型,可以被用於許多編程場景中。在這篇文章中,我們將學習Python中set函數的多個方面,從而深入了解這個函數在Python中的用途。 一…

    編程 2025-04-29
  • 單片機打印函數

    單片機打印是指通過串口或並口將一些數據打印到終端設備上。在單片機應用中,打印非常重要。正確的打印數據可以讓我們知道單片機運行的狀態,方便我們進行調試;錯誤的打印數據可以幫助我們快速…

    編程 2025-04-29
  • 三角函數用英語怎麼說

    三角函數,即三角比函數,是指在一個銳角三角形中某一角的對邊、鄰邊之比。在數學中,三角函數包括正弦、餘弦、正切等,它們在數學、物理、工程和計算機等領域都得到了廣泛的應用。 一、正弦函…

    編程 2025-04-29
  • Python3定義函數參數類型

    Python是一門動態類型語言,不需要在定義變量時顯示的指定變量類型,但是Python3中提供了函數參數類型的聲明功能,在函數定義時明確定義參數類型。在函數的形參後面加上冒號(:)…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Python實現計算階乘的函數

    本文將介紹如何使用Python定義函數fact(n),計算n的階乘。 一、什麼是階乘 階乘指從1乘到指定數之間所有整數的乘積。如:5! = 5 * 4 * 3 * 2 * 1 = …

    編程 2025-04-29
  • Python定義函數判斷奇偶數

    本文將從多個方面詳細闡述Python定義函數判斷奇偶數的方法,並提供完整的代碼示例。 一、初步了解Python函數 在介紹Python如何定義函數判斷奇偶數之前,我們先來了解一下P…

    編程 2025-04-29

發表回復

登錄後才能評論