图像变换有两种变换方式,一种是像素的变换——点操作,另一种是邻域操作下的变化——区域变换,后面这种图像变换可以用来做识别等比较复杂一些的图像计算。
今天主要学会用第一种,像素变换
g(i , j) = ⍺ f(i, j) + β,其中⍺>0,β是增益变量。
⍺是用来调整对比度的,β是用来调整亮度的,i、j是图像的像素点。
/**********************************************************/
/*************调整图像的亮度和对比度*************************/
void AdjustImageLight(void)
{
Mat src, dst;
src = imread("E:/03OpenCV/PIC/test1.jpg");
if (!src.data) { cout << "文件打开失败" << endl; return; }
dst = Mat::zeros(src.size(), src.type());
int height = src.rows;
int width = src.cols;
float alpha = 1.5;
float beta = 10;
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {//多通道rgb
if (src.channels() == 3) {
float b = src.at<Vec3b>(row, col)[0];
float g = src.at<Vec3b>(row, col)[1];
float r = src.at<Vec3b>(row, col)[2];
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 (src.channels() == 1) {
float gray = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(gray*alpha + beta);
}
}
}
char input_title[] = "original";
char output_title[] = "finish";
namedWindow(input_title, 1);
imshow(input_title, src);
namedWindow(output_title, 1);
imshow(output_title, dst);
imwrite("E:/03OpenCV/PIC/TestAdjustImageLight.jpg", dst);//保存处理后的图片
}
--------------彩蛋--------------
dst=Mat::zeros(src.size(),src.type());
可以用来建一张新的空白图像,经常会用的到。
saturate_cast(value);
可以保证色彩值在0~255之间,如果不加这个图片可能会很奇怪很不自然。
--------------end--------------