图像的叠加、混合、分离

图像的叠加、混合、分离

1 感兴趣区域ROI

      ROI(region of interest)感兴趣区域,在图像处理过程中,有时候我们希望对图像中的某些区域进行处理,也就是仅对某些区域感兴趣,那么我们就可以定义我们的ROI区域。
方法:定义一个Rect来表示或指定行列范围。

Mat roi1, rot2;
// 左上角
roi1 = img(Rect(0, 0, img.cols / 2, img.rows / 2));
// 右下角
rot2 = img(Range(img.rows/2 , img.rows), Range(img.cols/2, img.cols));
imshow("roi1", roi1);
imshow("rot2", rot2);

注意此时的roi1就是属于img的一部分了,它的改变会改变img。它只是对img某个区域的引用。
例:

#include "QtGuiApplication1.h"

//#define Ui
#ifndef Ui

#include 
#include 
#include 
using namespace cv;

#else

#include 

#endif

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

#ifdef Ui
	QtGuiApplication1 w;
	w.show();
	return a.exec();
#else
	QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
	Mat sorImg = imread(path.toStdString() + "sor1.jpg", IMREAD_GRAYSCALE);
	Mat logImg = imread(path.toStdString() + "log.jpg", IMREAD_GRAYSCALE);
	imshow("sorImg", sorImg);
	imshow("logImg", logImg);

	Rect roiRegion(0, 0, logImg.cols, logImg.rows);
	Mat roi = sorImg(roiRegion);
	logImg.copyTo(roi);	
	imshow("dstImg", sorImg);
	waitKey();
	return 0;
#endif
	
}

效果图:在图片的左上角打上了一个logo。
图像的叠加、混合、分离_第1张图片

2 线性混合

    在图片处理软件中经常看到两幅图片的叠加,其实原理很简单,就是两幅图像素值的加权叠加。一个公式说明原理:

g=f0*(1-a)+a*f1
其中g是目标图像,f0、f1是两幅进行叠加的图片。a是权重范围是(0-1)。 通过公式就可以看出这是基于像素点的操作,自己很容易实现,openCv也提供了API先上例子。
#include "QtGuiApplication1.h"

//#define Ui
#ifndef Ui

#include 
#include 
#include 
using namespace cv;

#else

#include 

#endif

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);

#ifdef Ui
	QtGuiApplication1 w;
	w.show();
	return a.exec();
#else
	QString path = QFileInfo(QCoreApplication::applicationDirPath(), "../../../../../").absoluteDir().absolutePath() + "/imgs/";
	Mat src1 = imread(path.toStdString() + "sor1.jpg", IMREAD_UNCHANGED);
	Mat src2 = imread(path.toStdString() + "sor2.jpg", IMREAD_UNCHANGED);

	imshow("src1", src1);
	imshow("src2", src2);

	Mat dst;
	addWeighted(src1, 0.5, src2, 0.5,0, dst);
	imshow("dst", dst);
	waitKey();

	return 0;
#endif
	
}

效果图:这是一个美女和一幅风景画的叠加。

API:

void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype = -1);
参数:src1:叠加图像1。
alpha:叠加图像1的权重。
src2:叠加图像2。
beta:叠加图像2的权重。
gamma:整体亮度偏移量。
dst:目标输出图像。

值得注意的是:
两幅图像尺寸类型必须的一致,若果两幅图像不一致,那先用ROI提取尺寸较小的图像再来叠加吧。
虽然没有强制两个权重相加必须为1,但通常都是那么干的。

3 图像通道分离、混合

顾名思义,这是针对多通道图像的,例如彩色图像。啥也不说给出API即懂。
void split(InputArray m, OutputArrayOfArrays mv);
void merge(InputArrayOfArrays mv, OutputArray dst);
void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,

你可能感兴趣的:(Opencv学习,学习opencv3)