opencv中有关图像操作的部分
函数功能:用来和多个阈值比较时,使用到的查找表,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:
out1:
out2:
函数原型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类型数据进行连接,第一个参数在上方,第二个参数在下方
函数原型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:
img1:
最终拼接而成的img:
另外包含此程序中用到的四张图片:
lean00.png:
lena01.png:
lena10.png:
lena11.png:
感谢阅读!
也欢迎大家关注小白博主,多多鼓励一下!