5. 圖像混合(OpenCV基礎課程視頻學習)

課程視頻鏈接:https://www.bilibili.com/video/av29600072?p=6

內容

  • 線性混合操作理論知識
  • 相關 API (addWeighted)
  • 完整代碼

1. 線性混合操作理論知識

g(x) = (1-α) * f_0(x) + α * f_1(x)

其中 f0(x) 表示一幅圖像,f1(x) 表示另一幅圖像, α 表示權重,取值範圍在 0~1 之間,所以最後得到的計算值不會超過 255,最後生成的另一幅圖像就是 g(x) 。x 對每個元素進行遍歷。

2. 相關 API

注意:兩張圖像的大小和類型必須一致纔可以。

2.1 addWeighted

將兩幅圖像的各個像素值先乘以權重然後相加。

void cv::addWeighted( inputArray    src1,           // 輸入圖像Mat src1
                      double        alpha,          // 輸入圖像 src1 的 alpha 值
                      inputArray    src2,           // 輸入圖像Mat src2
                      double        beta,           // 輸入圖像 src2 的 alpha 值
                      double        gamma,          // gamma 值,校驗值,如果前兩項相加值太小,像素太暗,就加一個校驗值
                      OutputArray   dst,            // 輸出混合圖像
                      int           dtype = -1
                    )

計算公式

dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)

2.2 add

單純將兩幅圖像的各個像素值相加。

void cv::add( inputArray    src1,
              inputArray    src2,
              outputArray   dst,
              inputArray    mask = noArray(),
              int           dtype = -1
            )

2.3 multiply

單純將兩幅圖像的各個像素值相乘。

void cv::multiply( inputArray   src1,
                   inputArray   src2,
                   outputArray  dst,
                   double       scale = 1,
                   int          dtype = -1
                )

3. 完整代碼

#include <opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
	cv::Mat src1 = cv::imread(cv::samples::findFile("LBXX1.jpg"), cv::IMREAD_COLOR);
	cv::Mat src2 = cv::imread(cv::samples::findFile("LBXX2.jpg"), cv::IMREAD_COLOR);

	if (!src1.data)
	{
		std::cout << "No such a image" << std::endl;
		return -1;
	}

	cv::namedWindow("src1", cv::WINDOW_AUTOSIZE);
	cv::imshow("src1", src1);

	cv::namedWindow("src2", cv::WINDOW_AUTOSIZE);
	cv::imshow("src2", src2);

	cv::Mat dst;
	//std::cout << src1.type() << std::endl;

	if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
	{
		double alpha = 0.5;

		cv::add(src1, src2, dst);
		cv::multiply(src1, src2, dst);
		cv::addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);

		cv::namedWindow("Blend demo", cv::WINDOW_AUTOSIZE);
		cv::imshow("Blend demo", dst);
	}
	else
	{
		std::cout << "Images' size or type don't fit !" << std::endl;
		return -1;
	}

	cv::waitKey(0);

	return 0;
}

注意:在判斷兩幅原圖像大小是否一致時可以使用

if(src1.size() == src2.size())

示例結果

1. addWeighed α = 0.5

在這裏插入圖片描述

2. add

在這裏插入圖片描述

3. multiply

在這裏插入圖片描述

4. 附

讀入圖像後,判斷是否讀入成功:

cv::Mat src = cv::imread("***.jpg", cv::IMREAD_COLOR);
if(src.empty())
{
    ······
}

或者

cv::Mat src = cv::imread("***.jpg", cv::IMREAD_COLOR);
if(!src.data)
{
    ······
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章