opencv学习笔记之图像变换

文章目录

  • 前言
  • 一、LUT函数
  • 二、图像连接
        • 图像上下连接函数vconcat()
        • 图像上下连接函数hconcat()


前言

opencv中有关图像操作的部分

一、LUT函数

函数功能:用来和多个阈值比较时,使用到的查找表,LUT是一个像素灰度值的映射表

函数原型:

void LUT(InputArray src, InputArray lut, OutputArray dst)

src:输入图像矩阵,数据类型只能是CV_8U

lut:256个像素灰度值的查找表,单通道或者与src通道数相同

dst:输出图像矩阵,尺寸与src相同,数据类型与int相同

lut表的映射关系为:

原灰度值 0 1 2 3 ······ 100 101 102 ······ 253 254 255
映射后 0 0 0 0 1 1 1 2 2 2

LUT()中的第二个参数是一个1*256的矩阵。另外LUT()函数支持多通道的映射,第二个参数lut如果是多通道,则输入变量中的第i个通道按照第二个参数的第 i 个通道LUT进行映射。

示例程序:

#include  //加载OpenCV4的头文件
#include
#include
using namespace std;
using namespace cv; //OpenCV命名空间

int main()
{
	//LUT第一层
	uchar lutFirst[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
		{
			lutFirst[i] = 0;
		}
		else if (i > 100 && i <= 200)
		{
			lutFirst[i] = 100;
		}
		else  //i>200
		{
			lutFirst[i] = 255;
		}
	}
	Mat lutOne(1, 256, CV_8UC1, lutFirst);

	//LUT第二层
	uchar lutSecond[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
		{
			lutSecond[i] = 0;
		}
		else if (i > 100 && i <= 150)
		{
			lutSecond[i] = 100;
		}
		else if (i > 150 && i <= 200)
		{
			lutSecond[i] = 150;
		}
		else  //i>200
		{
			lutSecond[i] = 255;
		}
	}
	Mat lutTwo(1, 256, CV_8UC1, lutSecond);

	//LUT第三层
	uchar lutThird[256];
	for (int i = 0; i < 256; i++)
	{
		if (i <= 100)
		{
			lutThird[i] = 100;
		}
		else if (i > 100 && i <= 200)
		{
			lutThird[i] = 200;
		}
		else
		{
			lutThird[i] = 255;
		}
	}
	Mat lutThree(1, 256, CV_8UC1, lutThird);

	//拥有三通道的LUT矩阵
	vector<Mat> mergeMats;
	mergeMats.push_back(lutOne);
	mergeMats.push_back(lutTwo);
	mergeMats.push_back(lutThree);
	Mat LutTree;
	merge(mergeMats, LutTree);

	//计算图像的查找表
	Mat img = imread("lena.jpg");
	if (img.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	Mat gray, out0, out1, out2;
	cvtColor(img, gray, COLOR_RGB2GRAY);
	LUT(gray, lutOne, out0);
	LUT(img, lutTwo, out1);
	LUT(img, lutThree, out2);
	imshow("out0", out0);
	imshow("out1", out1);
	imshow("out2", out2);
	waitKey(0);
	return 0;  //程序结束
}

out0:

opencv学习笔记之图像变换_第1张图片

out1:

opencv学习笔记之图像变换_第2张图片

out2:

opencv学习笔记之图像变换_第3张图片

二、图像连接

图像上下连接函数vconcat()

函数原型1:

void vconcat(const Mat * src, size_t nsrc, OutputArray dst)

src:Mat矩阵类型的数组

nsrc:数组中Mat类型数据的数目

dst:连接后的Mat类矩阵

该函数用于对存放在数组矩阵中的Mat类型数据进行纵向连接。第一个参数是存放多个Mat类型数据的数组,要求数组中的所有Mat类型具有相同的长度并且具有相同的数据类型和通道数。

函数原型2:

void vconcat(InputArray src1, InputArray src2, OutputArray dst)

src1:第一个需要连接的Mat类矩阵

src2:第二个需要连接的Mat类矩阵,与第一个参数具有相同的宽度、数据类型和通道数

dst:连接后的Mat类矩阵

该函数用于对两个Mat类型数据进行连接,第一个参数在上方,第二个参数在下方

图像上下连接函数hconcat()

函数原型1:

void hconcat(const Mat * src, size_t nsrc, OutputArray dst)

src:Mat矩阵类型的数组

nsrc:数组中Mat类型数据的数目

dst:连接后的Mat类矩阵

要求所有要连接的图像矩阵具有相同的高度

函数原型2:

void hconcat(InputArray src1, InputArray src2, OutputArray dst)

src1:第一个需要连接的Mat类矩阵

src2:第二个需要连接的Mat类矩阵,与第一个参数具有相同的高度、数据类型和通道数

dst:连接后的Mat类矩阵

示例代码:

#include  //加载OpenCV4的头文件
#include
#include
using namespace std;
using namespace cv; //OpenCV命名空间

int main()
{
	//矩阵数组的横竖连接
	Mat matArray[] = { Mat(1,2,CV_32FC1,Scalar(1)),Mat(1,2,CV_32FC1,Scalar(2)) };
	Mat vout, hout;
	vconcat(matArray, 2, vout);
	cout << "图像数组竖向连接:" << endl << vout << endl;
	hconcat(matArray, 2, vout);
	cout << "图像数组横向连接:" << endl << hout << endl;

	//矩阵的横竖拼接
	Mat A = (Mat_<float>(2, 2) << 1, 7, 2, 8);
	Mat B = (Mat_<float>(2, 2) << 4, 10, 5, 11);
	Mat vC, hC;
	vconcat(A, B, vC);
	cout << "多个图像竖向连接:" << endl << vC << endl;
	hconcat(A, B, hC);
	cout << "多个图像横向连接:" << endl << hC << endl;
	
	//读取4个子图像,00表示左上角,01表示右上角,10表示左下角,11表示右下角
	Mat img00 = imread("lena00.png");
	Mat img01 = imread("lena01.png");
	Mat img10 = imread("lena10.png");
	Mat img11 = imread("lena11.png");
	if (img00.empty() || img01.empty() || img10.empty() || img11.empty())
	{
		cout << "请确认图像文件名称是否正确" << endl;
		return -1;
	}
	//显示4个子图像
	imshow("img00", img00);
	imshow("img01", img01);
	imshow("img10", img10);
	imshow("img11", img11);

	//图像连接
	Mat img, img0, img1;
	//图像横向连接
	hconcat(img00, img01, img0);
	hconcat(img10, img11, img1);
	//横向连接结果再进行竖向连接
	vconcat(img0, img1, img);

	//显示连接图像的结果
	imshow("img0", img0);
	imshow("img1", img1);
	imshow("img", img);
	waitKey(0);
	return 0;  //程序结束
}

四个部分的img:

img0:

opencv学习笔记之图像变换_第4张图片

img1:

opencv学习笔记之图像变换_第5张图片

最终拼接而成的img:

opencv学习笔记之图像变换_第6张图片

另外包含此程序中用到的四张图片:

lean00.png:

opencv学习笔记之图像变换_第7张图片

lena01.png:

opencv学习笔记之图像变换_第8张图片

lena10.png:

opencv学习笔记之图像变换_第9张图片

lena11.png:

opencv学习笔记之图像变换_第10张图片

感谢阅读!

也欢迎大家关注小白博主,多多鼓励一下!

你可能感兴趣的:(计算机视觉,opencv,计算机视觉)