前言一、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 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:
感谢阅读!
也欢迎大家关注小白博主,多多鼓励一下!



