1、先介绍一个函数saturate_cast()
功能为防止数据越界溢出;将像素值规定在0-255之间
2、代码演示如下:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src1,dst;
src1 = imread("D:/VS2015Program/buildsrc1.jpg");
if (src1.empty())
{
cout << "could not load image1" << endl;
return -1;
}
namedWindow("input", CV_WINDOW_AUTOSIZE);
imshow("input", src1);
dst = Mat::zeros(src1.size(), src1.type());
int rows = src1.rows;
int cols = src1.cols;
float alpha = 1.2;
float beta = 30;
//利用双层for循环遍历图像中的每一个像素值
for (int row = 0; row < rows; row++)
{
for (int col = 0; col < cols; col++)
{
if (src1.channels() == 3)//如果图像为RGB图像
{
//分别分离出BGR三通道
float b = src1.at<Vec3b>(row, col)[0];
float g = src1.at<Vec3b>(row, col)[1];
float r = src1.at<Vec3b>(row, col)[2];
//将每个像素值做线性运算,使用saturate_cast对像素值做归一化
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if (src1.channels() == 1) //如果图像为单通道图像
{
//直接做操作
float v = src1.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
namedWindow("output", CV_WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}
本文介绍了一个防止数据越界的函数saturate_cast(),并演示了如何利用该函数对图像进行线性变换,实现图像亮度和对比度的调整。通过遍历图像的每一个像素值,并应用特定的线性运算,可以有效地增强图像的质量。
27万+

被折叠的 条评论
为什么被折叠?



