【计算机视觉】一些灰度变换的函数

       在计算机视觉中,图像处理的方式可以分为两个:空间域处理转换域处理。空间域处理是对图像中的像素进行直接处理,抑或是使用滤波器对像素进行处理,对像素直接进行处理的可划分为灰度变换中,滤波器对像素处理的可划分为空间滤波中,灰度变换的目的是通过对比度或者是阈值的处理,使图片感兴趣区域显示效果达到最优,而空间滤波则通过像素的领域来锐化或模糊图片,使图片质量得到提高。转换域则通过将图像转换到转换域进行处理,处理完成之后再反转换回空间域(例如傅里叶变换等)。而本文则主要介绍几种灰度变换的函数

                                                                        ——                      文     ——

一.负片变换

     设r,s分别为输出前后的像素值,则可以将灰度范围为[0,L-1]的图像根据以下公式得到一张变换后的照片:

                                                                  

       负片变换可以简单地理解为是黑白互换,主要应用于医疗项目中,在激光透射等项目可加大凸显目标的显示效果。如下图胸部肿瘤图像,原图中肿瘤对视觉上的刺激明显没有图像反转后的效果佳:

代码如下:

Mat src = imread("2.jpg", 0);
	Mat dst = src.clone();

	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
			dst.at<uchar>(i, j) = 255 - src.at<uchar>(i, j);

	imshow("处理前", src);
	imshow("处理后", dst);

二.对数变换

       引用书籍《数字图像处理(第三版)》[美] Rafael C.Gonzalez、Richard E.Woods 著上的一副图:

                                              

       可知对数变换可以将低灰度值拓展至高灰度值,部分高灰度值压缩,从而使得图像整体变得更加凸显低灰度值,达到图像增强的效果。简单来说是可以将较亮的区域(低灰度值)进行放大,较暗的区域(高灰度值)进行压缩。可以使用以下公式进行表示,其中C为常数:

                                                                     

       使用对数变换得到的效果如下:

                   

代码如下:

	Mat src = imread("4.jpg",0);
	Mat dst = Mat::zeros(src.size(), src.type());

	for (int i = 0; i < src.rows; i++)
		for (int j = 0; j < src.cols; j++)
			dst.at<uchar>(i, j) = saturate_cast<uchar>(c*log((1 + src.at<uchar>(i, j))));

	normalize(dst, dst, 0, 255, NORM_MINMAX);
	convertScaleAbs(dst, dst);
	
	imshow("src", src);
	imshow("dst", dst);

       代码中有使用opencv的模板类函数saturate_cast,其作用是防止像素溢出,用代码可以简单表示为:

if(data<0)
        data=0;
else if(data>255)
	data=255;

   三.Gamma校正

           Gamma校正可以对输入的图像进行非线性的变换,使得图像信息最大程度得以保留。Gamma校正曲线如图所示:

                                            

       引用书籍《数字图像处理(第三版)》[美] Rafael C.Gonzalez、Richard E.Woods 著上的一副图,可以看到,Gamma校正可以使得低灰度值转换成高灰度值,高灰度值转换为低灰度值,也就是说可以令整体看起来较暗的图像校正得明亮些,也可以让整体看起来较亮得图像校正得暗一些,最大程度地保证图像信息量呈现最大化,Gamma校正公式如下:

                                                                                      

        使用Gamma转换效果如下:

                                                                                    Gamma值等于3.0效果

                                                  

                                                                                       Gamma值等于0.5效果

代码如下:

void GammaTransformation(double Gramma)
{
	Mat src = imread("1.png",0);
	Mat dst = src.clone();
	MatIterator_<uchar> begin, end;

	assert(src.elemSize1() == 1);

	for (begin = dst.begin<uchar>(), end = dst.end<uchar>(); begin != end; begin++)
		*begin = saturate_cast<uchar>((pow(((*begin + 0.5f) / 255),Gramma))*255.0f - 0.5f);

	imshow("src", src);
	imshow("dst", dst);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师兄师兄怎么办

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值