对进行图像操作可以调整图像的亮度和对比度
对比度调整的理论:
g(x,y)=alpha*f(x,y)+beta
图像灰度值反转理论:
S=L-1-r
图像线性混合操作:
g(x,y)=(1-α)*f(x,y)+α*t(x)
· · · · · · · · 其中α的取值范围为0~1之间
在执行像素操作之前,我们需要读取图像的宽、高、通道数;
获取图像的宽:image.cols
获取图像的高:image.rows
获取图像的通道数:image.channels()
image.at<uchar>(x,y)读取单通道图像的像素值
float alpha=1.2;
float beta=30;
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int pixel = src.at<uchar>(row, col);
//亮度和对比度调整
dst.at<uchar>(row,col)=alpha*pixel+beta;
//像素反转操作
dst.at<uchar>(row, col) = 255 - pixel;
}
}
image.at<Vec3b>(x,y)[i]读取三通道图像的像素值
for (int row = 0; row < height; row++)
{
for (int col = 0; col < width; col++)
{
int src_bule_pixel = src.at<Vec3b>(row, col)[0];
int src_gule_pixel = src.at<Vec3b>(row, col)[1];
int src_red_pixel = src.at<Vec3b>(row, col)[2];
//亮度和对比度调整
dst.at<Vec3b>(row,col)[0]=alpha*src_blue_pixel+beta;
dst.at<Vec3b>(row,col)[1]=alpha*src_gule_pixel+beta;
dst.at<Vec3b>(row,col)[2]=alpha*src_red_pixel+beta;
//像素反转操作
dst.at<Vec3b>(row, col)[0] = 255 - src_bule_pixel;
dst.at<Vec3b>(row, col)[1] = 255 - src_gule_pixel;
dst.at<Vec3b>(row, col)[2] = 255 - src_red_pixel;
}
}
图像混合:利用相关API“addWeighted(src1,alpha,src2,(1-alpha),gamma,dst,dtype=-1)”
注意:两张图像的大小和类型必须一致才可以进行图像混合
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
int main(int agrc,char*agrv)
{
Mat src1,src2,dst;
src1=imread("读取一张图像");
src2=imread("读取一张图像");
if(src1.empty()||src2.empty())
{
std::cout<<"could not load image!"<<std::endl;
return -1;
}
if(src1.rows==src2.rows&&src1.cols==src2.cols&&src1.channels()==src2.channels())
{
std::cout<<"Two images are not matched!"<<std::endl;
}
float alpha=0.5;
addWeighted(src1,alpha,src2,(1-alpha),dst,0.0,-1);
nameWindow("Output Window",CV_WINDOW_AUTOSIZE);
imshow("Output Window",dst);
waitkey(0);
return 0;
}
获取浮点类型(Vec3f)三通道像素值
Vec3f pixel=image.at<Vec3f>(x,y);
float bule=pixel.val[0];
float gule=pixel.val[1];
float red=pixel.val[2];
图像类型转换
使用image.converTo(dst,type)对图像进行类型转换
CV_8UC1为单通道uchar类型
CV32F1 为单通道float类型
确保值大小范围在0~255之间的API
saturate_cast<uchar>(value)