在计算机视觉中,图像处理的方式可以分为两个:空间域处理和转换域处理。空间域处理是对图像中的像素进行直接处理,抑或是使用滤波器对像素进行处理,对像素直接进行处理的可划分为灰度变换中,滤波器对像素处理的可划分为空间滤波中,灰度变换的目的是通过对比度或者是阈值的处理,使图片感兴趣区域显示效果达到最优,而空间滤波则通过像素的领域来锐化或模糊图片,使图片质量得到提高。转换域则通过将图像转换到转换域进行处理,处理完成之后再反转换回空间域(例如傅里叶变换等)。而本文则主要介绍几种灰度变换的函数
—————————————————————————— 下面是正文 ——————————————————————————
一.负片变换
设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);
}
更多推荐
灰度,函数,视觉,计算机
发布评论