图像灰度转换,灰度降低70%,调整对比亮度
(2)图像灰度变换。读入lena_gray.tif文件,对其灰度进行下列调整,并显示图像;
将图像的灰度降低70%,同屏显示原图和灰度调整后的图像;将灰度加上一个值(如50),使图像变亮,编程,同屏显示原图像和灰度调整后图像。
知识点一:Mat dst
dst = Mat::zeros(src1.size(),src1.type());
创建一张与原图像src1大小类型一样的空白图像,像素值初始化为0。
知识点二:saturate_cast(value)
这里面value是指的像素值。功能就是无恶报像素值得范围在0—255.举几个例子说明一下。
double g = saturate_cast<uchar>(260) ; //超出255,此时g = 255;
double g = saturate_cast<uchar>(-50) ; //小于0,此时g = 0;
double g = saturate_cast<uchar>(100) ; //在0-255之间,此时g = 100;
知识点三:Mat.at(y,x)[index] = value 。y表示行,x表示列,index表示像素值。
举例说明:Mat dst ;
dst.at(5,20)[0] = 255 ; //表示给图片中的第5行,20 列的像素的b通道赋值为255.
dst.at(5,20)[1] = 255 ; //表示给图片中的第5行,20 列的像素的g通道赋值为255.
dst.at(5,20)[2] = 255 ; //表示给图片中的第5行,20 列的像素的r通道赋值为255.
以上三个知识点来自https://blog.****.net/fanjiule/article/details/81630219
实验代码如下:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat src1,dst,dst1;
src1 = imread("image/grayImage.tif");
if (!src1.data)
{
printf("could not load image3...\n");
return -1;
}
//创建窗口
char input_win[] = "input image"; //给窗口命名名字
namedWindow(input_win,CV_WINDOW_AUTOSIZE);//新建窗口
imshow(input_win,src1); //显示原图
//对比度与亮度的改变
int height = src1.rows;//求出src1的高
int width = src1.cols;//求出src1的宽
dst = Mat::zeros(src1.size(),src1.type()); //这句很重要,创建一个与原图一样大小的空白图片
dst1 = Mat::zeros(src1.size(),src1.type()); //这句很重要,创建一个与原图一样大小的空白图片
float alpha = 0.3;//调整对比度为0.3 这是降低对比度
float beta = 50;//调整亮度加50
//循环操作,遍历每一列,每一行的元素
for(int row = 0;row < height; row++)
{
for(int col = 0;col < width;col++)
{
if(src1.channels() == 3)//判断是否为3通道图片
{
//将遍历得到的原图像素值,返回给变量b,g,r
float b = src1.at<Vec3b>(row,col)[0];//nlue
float g = src1.at<Vec3b>(row,col)[1];//green
float r= src1.at<Vec3b>(row,col)[2];//red
//开始操作像素,对变量b,g,r做改变后再返回到新的图片。
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);
//灰度图像上不调整亮度
dst1.at<Vec3b>(row,col)[0] = saturate_cast<uchar>(b*alpha );
dst1.at<Vec3b>(row,col)[1] = saturate_cast<uchar>(g*alpha);
dst1.at<Vec3b>(row,col)[2] = saturate_cast<uchar>(r*alpha);
}
else if(src1.channels() == 1)//判断是否为单通道的图片
{
float v = src1.at<uchar>(row,col);
dst.at<uchar>(row,col) = saturate_cast<uchar>(v*alpha+beta);
dst1.at<uchar>(row,col) = saturate_cast<uchar>(v*alpha);
}
}
}
char output_title[] = "contrast and brightness change demo";
namedWindow(output_title,CV_WINDOW_AUTOSIZE);
namedWindow("not add brightness",CV_WINDOW_AUTOSIZE);
imshow(output_title,dst);
imshow("not add brightness",dst1);
waitKey(0);
return 0;
}
运行结果如下: