图像像素的比较
白色是255,黑色是0
min(inputarray src1,
inputarray src2,
outputarray dst)
max(inputarray src1,
inputarray src2,
outpurarray dst
- src1:第一个图像矩阵,通道数任意
- src2:第二个图像矩阵,尺寸和通道数以及数据类型都需要与src1一致
- dst:保留对应位置较大(较小)灰度值后的图像矩阵,尺寸、通道数和数据类型与src1一致
lut查找表
lut查找表实际上就是一种映射规则
lut(inputarray src,inputarray lut,outputarray dst)
src:输入图像矩阵,其数据类型只能是cv_8u
lut:256个像素灰度值的查找表,单通道或者与src通道数相同
dst:输出图像矩阵,其尺寸与src相同,数据类型与lut相同
//lut查找表第一层
uchar lutfirst[256];
for (int i = 0; i < 256; i++)
{
if (i <= 100)
lutfirst[i] = 0;
if (i > 100 && i <= 200)
lutfirst[i] = 100;
if (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;
if (i > 100 && i <= 150)
lutsecond[i] = 100;
if (i > 150 && i <= 200)
lutsecond[i] = 150;
if (i > 200)
lutsecond[i] = 255;
}
mat luttwo(1, 256, cv_8uc1, lutfirst);
//lut查找表第三层
uchar lutthird[256];
for (int i = 0; i < 256; i++)
{
if (i <= 100)
lutthird[i] = 100;
if (i > 100 && i <= 200)
lutthird[i] = 200;
if (i > 200)
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("2.jpg");
mat gray, out0, out1, out2;
cvtcolor(img, gray, color_bgr2gray);
lut(gray, lutone, out0);
lut(img, lutone, out1);
lut(img, luttree, out2);
imshow("out0", out0);
imshow("out1", out1);
imshow("out2", out2);
waitkey(0);
图像尺寸改变
图像插值原理
在日常对图像进行操作的过程中会涉及到图像的放大与缩小,这一系列的操作都是通过插值法来实现的;opencv中resize()函数的实现原理0就是通过插值算法,如果不对应用某种算法进行设置,则默认采用双线性插值算法。
常用插值算法
最近邻法(nearest interpolation):计算速度最快,但是效果最差。
双线性插值(bilinear interpolation):双线性插值是用原图像中4(22)个点计算新图像中1个点,效果略逊于双三次插值,速度比双三次插值快,属于一种平衡美,在很多框架中属于默认算法。
双三次插值(bicubic interpolation):双三次插值是用原图像中16(44)个点计算新图像中1个点,效果比较好,但是计算代价过大。
jj’
图像缩放
resize(inputarray src,outputarray dst,size dsize,double fx=0,double fy=0,int interpolation = inter_linear)
dsize:输出图像的尺寸
fx:水平轴的比例因子:如果将水平轴变为原来的两倍,则赋值为2
fy:垂直轴的比例因子
interpolation:插值方法的标志
图像翻转
filp(inputarray src,outputarray dst,int flipcode)
flipcode:翻转方式标志,数值大于0表示绕y轴进行翻转;数值等于0,表示绕x轴进行翻转,数值小于0表示绕两个轴旋转
图像拼接
//横向拼接要求高度一致
hconcat(inputarray src1,inputarray src2,outputarray dst)
//垂直拼接要求宽度一致
vconcat(inputarray src1,inputarray src2,outputarray dst)
mat img = imread("2.jpg");
mat out,out1,out2,out3;
// 缩小
resize(img, out, size(500,500),0, 0, inter_area);
// 最近邻插值
resize(img, out1, size(200, 200), 0, 0, inter_nearest);
//双线性插值
resize(img, out2, size(200, 200), 0, 0, inter_linear);
//双三次插值
resize(img, out3, size(200, 200), 0, 0, inter_cubic);
mat img_x, img_y, img_xy;
flip(img, img_x, 0); //沿x轴对称翻转
flip(img, img_y, 1); //沿y轴对称翻转
flip(img, img_xy, -1);//沿x轴对称,再y轴对称
发表评论