栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

opencv学习笔记之图像变换

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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表的映射关系为:

原灰度值0123······100101102······253254255
映射后0000111222

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 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:

out1:

out2:

二、图像连接 图像上下连接函数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_(2, 2) << 1, 7, 2, 8);
	Mat B = (Mat_(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:

img1:

最终拼接而成的img:

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

lean00.png:

lena01.png:

lena10.png:

lena11.png:

感谢阅读!

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/739093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号