图像灰度转换,灰度降低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.csdn.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;
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值