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
}
在图片处理软件中经常看到两幅图片的叠加,其实原理很简单,就是两幅图像素值的加权叠加。一个公式说明原理:
#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,但通常都是那么干的。
顾名思义,这是针对多通道图像的,例如彩色图像。啥也不说给出API即懂。
void split(InputArray m, OutputArrayOfArrays mv);
void merge(InputArrayOfArrays mv, OutputArray dst);
void mixChannels(InputArrayOfArrays src, InputOutputArrayOfArrays dst,