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

编程入门 行业动态 更新时间:2024-10-28 08:29:23

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

                                                                        ——————————————————————————                      下面是正文     ——————————————————————————

一.负片变换

     设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);
}

 

更多推荐

灰度,函数,视觉,计算机

本文发布于:2023-05-26 18:25:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/275496.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:灰度   函数   视觉   计算机

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!