图像变换可以看作如下
- 像素变换 - 点操作
- 领域操作 -区域
调整图像亮度和对比度属于像素变换 - 点操作
g(i,j) = αf(i,j)+β 其中α > 0, β是增益变量
g(i,j)输出像素点
αf(i,j)输入像素点
重要API
- Mat new_image = Mat::zeros(image.size(),image.type());创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
- saturate_cast(value)确保值大小范围为0~255之间
- Mat.at(x,y)[index] = value给每个像素点每个通道复制
代码演示
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int grac,char* argv)
{
Mat src,dst;
src = imread("C:/Users/26444/Desktop/testopencvinstall/OIP.jpg");
if(!src.data)
{
printf("could not load image.....\n");
return -1;
}
namedWindowd("input_vin",WINDOW_AUTOSIZE);
imshow("input_vin",src);
int height = ssrc.rows;
int width = src.cols;
dst = Mat::zeros(src.size(),src.type());
float alpha = 1.2;
float beta = 30;
Mat m1;
src.convertTo(m1,CV_32F);
for(int row = 0;row < height;row++)
{
for(int col = 0;col < width;col++)
{
if(src.channels()==3)
{
//Vec3b可以看作是vector<uchar, 3>。
//简单而言就是一个uchar类型的,长度为3的vector向量。
float r = m1.at<Vec3f>(row,col)[0];
float g = m1.at<Vec3f>(row,col)[1];
float b = m1.at<Vec3f>(row,col)[2];
dst.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(b * alpha + beta);
dst.at<Vec3b>(row,col)[1] = saturate_cast<ucahr>(g * alpha + beta);
dst.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(r * alpha + beta);
}
esle if(src.channels() == 1)
{
float v = src.at<uchar>(row,col);
dst.at<uchar>(row,col) = saturate_cast<ucahr>(v * alpha + beta);
}
}
}
namedWinodw("output_title",WINDOW_AUTOSIZE);
imshow("output_title",dst);
waitKey(0);
return 0;
}
上图片