0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

图像的几种常见的灰度是什么

新机器视觉 来源:新机器视觉 2023-08-07 10:02 次阅读

灰度变换也被称为图像的点运算(只针对图像的某一像素点)是所有图像处理技术中最简单的技术,其变换形式如下:

4ebe7750-3461-11ee-9e74-dac502259ad0.png

其中,T是灰度变换函数;r是变换前的灰度;s是变换后的像素。

图像灰度变换的有以下作用:

改善图像的质量,使图像能够显示更多的细节,提高图像的对比度(对比度拉伸);

有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征;

可以有效的改变图像的直方图分布,使像素的分布更为均匀。

常见的灰度变换

灰度变换函数描述了输入灰度值和输出灰度值之间变换关系,一旦灰度变换函数确定下来了,那么其输出的灰度值也就确定了。

可见灰度变换函数的性质就决定了灰度变换所能达到的效果。用于图像灰度变换的函数主要有以下三种:

线性函数 (图像反转)

对数函数:对数和反对数变换

幂律函数:n次幂和n次开方变换

4ed55d3a-3461-11ee-9e74-dac502259ad0.jpg 上图给出了几种常见灰度变换函数的曲线图,根据这几种常见函数的曲线形状,可以知道这几种变换的所能达到的效果。

例如,对数变换和幂律变换都能实现图像灰度级的扩展/压缩,另外对数变换还有一个重要的性质,它能压缩图像灰度值变换较大的图像的动态范围(例如,傅立叶变换的频谱显示)

线性变换

令r为变换前的灰度,s为变换后的灰度,则线性变换的函数:

4eed061a-3461-11ee-9e74-dac502259ad0.png

其中,a为直线的斜率,b为在y轴的截距。选择不同的a,b值会有不同的效果:

a>1,增加图像的对比度

a<1,减小图像的对比度

a=1且b≠0a=1且b≠0,图像整体的灰度值上移或者下移,也就是图像整体变亮或者变暗,不会改变图像的对比度。

a<0且b=0 a<0且b=0,图像的亮区域变暗,暗区域变亮

a=1且b=0a=1且b=0,恒定变换,不变

a=−1且b=255a=−1且b=255,图像反转。

在进行图像增强时,上述的线性变换函数用的较多的就是图像反转了,根据上面的参数,图像反转的变换函数为:s=255−s。

图像反转得到的是图像的负片,能够有效的增强在图像暗区域的白色或者灰色细节

其效果如下:

图像反转的实现是比较简单的,在 OpenCV 中有对Mat的运算符重载,可以直接 Mat r = 255 - img 或者 ~img 来实现。

对数变换

对数变换的通用公式是:

4f1a85ea-3461-11ee-9e74-dac502259ad0.png

其中,c是一个常数,,假设r≥0,根据上图中的对数函数的曲线可以看出:对数变换,将源图像中范围较窄的低灰度值映射到范围较宽的灰度区间,同时将范围较宽的高灰度值区间映射为较窄的灰度区间,从而扩展了暗像素的值,压缩了高灰度的值,能够对图像中低灰度细节进行增强

从函数曲线也可以看出,反对数函数的曲线和对数的曲线是对称的,在应用到图像变换其结果是相反的,反对数变换的作用是压缩灰度值较低的区间,扩展高灰度值的区间。

基于 OpenCV 的实现,其对数变换的代码如下:

floatpixels[256];
for(inti=0;i< 256; i++)
        pixels[i] = log(1 + i);

    Mat imageLog(image.size(), CV_32FC3);
    for (int i = 0; i(i,j)[0]=pixels[image.at(i,j)[0]];
imageLog.at(i,j)[1]=pixels[image.at(i,j)[1]];
imageLog.at(i,j)[2]=pixels[image.at(i,j)[2]];
}
}
//归一化到0~255
normalize(imageLog,imageLog,0,255,CV_MINMAX);
//转换成8bit图像显示
convertScaleAbs(imageLog,imageLog);

这使用的对数函数的底为10。由于灰度变换是灰度值之间的一对一的映射,而灰度值区间通常为[0,255],所以在进行灰度变换时,通常使用查表法。

也就是,现将每个灰度值的映射后的结果计算出来,在变换时,通过查表得到变换后的灰度值。执行上面结果得到的结果如下:

左边为原图像,其拍摄环境较暗,无法分辨出很多的细节;右边为变换后的图像,整个图像明亮许多,也能分辨出原图中处于暗区域的狗狗的更多细节


对数变换,还有一个很重要的性质,能够压缩图像像素的动态范围。例如,在进行傅立叶变换时,得到的频谱的动态范围较大,频谱值的范围通常为[0,106],甚至更高。

这样范围的值,显示器是无法完整的显示如此大范围的灰度值的,因而许多灰度细节会被丢失掉。而将得到的频谱值进行对数变换,可以将其动态范围变换到一个合适区间,这样就能够显示更多的细节。

幂律变换(伽马变换)

伽马变换的公式为:

4f43f40c-3461-11ee-9e74-dac502259ad0.png

其中c和γ为正常数。


伽马变换的效果与对数变换有点类似,当γ>1时将较窄范围的低灰度值映射为较宽范围的灰度值,同时将较宽范围的高灰度值映射为较窄范围的灰度值;当γ<1时,情况相反,与反对数变换类似。

其函数曲线如下:


4f5dee7a-3461-11ee-9e74-dac502259ad0.jpg

当γ<1时,γ的值越小,对图像低灰度值的扩展越明显;当γ>1时,γ的值越大,对图像高灰度值部分的扩展越明显。这样就能够显示更多的图像的低灰度或者高灰度细节。


伽马变换主要用于图像的校正,对灰度值过高(图像过亮)或者过低(图像过暗)的图像进行修正,增加图像的对比度,从而改善图像的显示效果。

基于 OpenCV 的实现:

floatpixels[256];
for(inti=0;i< 256; i++)
        pixels[i] = i * i *i;

    Mat imageLog(image.size(), CV_32FC3);
    for (int i = 0; i(i,j)[0]=pixels[image.at(i,j)[0]];
imageLog.at(i,j)[1]=pixels[image.at(i,j)[1]];
imageLog.at(i,j)[2]=pixels[image.at(i,j)[2]];
}
}
//归一化到0~255
normalize(imageLog,imageLog,0,255,CV_MINMAX);
//转换成8bit图像显示
convertScaleAbs(imageLog,imageLog);

这里选择的参数为c = 1,γ=3,来扩展图像的高灰度区域,其结果如下:

当选择参数为c = 1,γ=0.4,来扩展图像的低灰度区域,其效果如下:

根据以上的结果,结合伽马变换的函数曲线图,做如下总结:

γ>1时,会将低于某个灰度值K的灰度区域压缩到较小的灰度区间,而将高于K的灰度区域扩展到较大灰度区间。

令L为灰度的最大值,k = 3/4L . 那么就有[0,3/4L]的灰度区域映射到为[0,1/8L]的输出;而将[3/4L,L]这部分高灰度区域映射到[1/8L,L]区间。

这样变换的结果就是,低于K的灰度区域被压缩到更低灰度区间,而较亮的高灰度区域的灰度值被扩展到较大的灰度区间变的不那么亮,整体的效果就是图像的对比度增加了,但是由于亮度区域被扩展,也就不那么亮了。

γ<1时,会将灰度值较小的低灰度区域扩展到较宽的灰度区间,而将较宽的高灰度区域压缩到较小的灰度区间。

这样变换的效果就是,低灰度区域扩展开来,变亮;而宽的高灰度区域,被压缩的较窄的区间,也变亮了,故变换后的整体效果是变亮了。

基于OpenCV的灰度变换实现

灰度变换属于点对点的一一变换,在实现的时候,可以利用查表法。也就是实现将[0,255]区间的各个灰度值的变换后的值计算出来,在变换的时候直接根据灰度值进行查表得到变换后的结果。

其实现如下:

/////////////////////////////////////////////////////////////////////
//
//灰度线性变换函数
//参数:
//src,输入原图像
//dst,输出图像,类型为CV_32F,大小及通道数与原图像相同
//mapping,灰度映射表,可以根据不同的变换函数,提前计算好图像的灰度映射表
//
////////////////////////////////////////////////////////////////////
voidgray_trans(constMat&src,Mat&dst,float*mapping)
{
intchannels=src.channels();
if(channels==1)
{
dst=Mat(src.size(),CV_32FC1);
for(inti=0;i< src.rows; i++)
        {
            float* p1 = dst.ptr(i);
constuchar*p2=src.ptr(i);
for(intj=0;j< src.cols; j++)
                p1[j] = mapping[p2[j]];
        }
    }
    else if (channels == 3)
    {
        dst = Mat(src.size(), CV_32FC3);
        for (int i = 0; i < src.rows; i++)
        {
            float* p1 = dst.ptr(i);
constuchar*p2=src.ptr(i);
for(intj=0;j< src.cols * 3; j+=3)
            {
                p1[j] = mapping[p2[j]];
                p1[j+1] = mapping[p2[j+1]];
                p1[j+2] = mapping[p2[j+2]];
            }            
        }
    }
}

其调用也比较简单,根据具体的灰度变换函数,填充灰度映射表即可,以伽马变换为例:

floatpixels[256];
for(inti=0;i< 256; i++)
        pixels[i] = powf(i, 1.5);
    Mat imageLog;
    gray_trans(image, imageLog, pixels);

总结

本文主要对图像的几种常见的灰度变换进行了总结。

图像反转,是图像线性变换的一种,可以得到图像负片,能够有效的增强图像的暗色区域中的白色或者灰色细节

对数变换,扩展图像中的低灰度区域,压缩图像中的高灰度区域,能够增强图像中的暗色区域的细节;反对数变换与此相反。对数变换还有个重要作用是,能够压缩图像灰度值的动态范围,在傅立叶变换中能够显示更多的变换后的频谱细节。

伽马变换,主要用于图像的校正,根据参数γ的选择不同,能够修正图像中灰度过高(γ>1)或者灰度过低(γ<1)

责任编辑:彭菁

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 图像
    +关注

    关注

    2

    文章

    1083

    浏览量

    40410
  • 图像处理技术

    关注

    0

    文章

    33

    浏览量

    10057
  • 频谱
    +关注

    关注

    7

    文章

    876

    浏览量

    45575
  • 函数
    +关注

    关注

    3

    文章

    4303

    浏览量

    62408

原文标题:图像处理基础:图像的灰度变换

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于FPGA的HDTV视频图像灰度直方图统计算法设计

    本文介绍了如何在FPGA 中利用Block RAM 的特殊结构实现HDTV 视频增强算法中灰度直方图统计。灰度直方图统计灰度直方图统计是图像处理过程中很常用的一个步骤,简单来讲,就是对
    发表于 05-14 12:37

    怎样用Labview的vision相关模块实现图像灰度扫描以及灰度差分

    怎样用Labview的vision相关模块实现图像灰度扫描以及灰度差分,可以详细点:具体用到哪些模块,求赐教。
    发表于 06-26 20:08

    用labview获取图像灰度

    `要实现的功能是:给出一幅图像,能够得到图像中没一点的灰度值,从而能够用各点的灰度值进行计算,对图像的清晰度进行评价。新手,现在一点思路都没
    发表于 07-12 20:44

    VHDL生成灰度图像

    大神们,有谁会用VHDL语言生成8位灰度图像的思路呢?
    发表于 12-07 15:57

    请问TFT_LCD支持灰度图像吗?

    我打算将一幅彩色图像转换为灰度图像,请问能在我们的TFT评上显示出来吗?听说TFT只支持RGB565?
    发表于 07-30 00:11

    LabVIEW和VDM提取色彩和生成灰度图像

    LabVIEW和VDM提取色彩和生成灰度图像在LabVIEW中使用视觉开发模块(Vision Development Module)。如何将彩色图像转换为灰度
    发表于 05-26 20:39

    灰度相关和区域特征的图像拼接算法

    本文提出一种结合灰度特点和区域特征的图像拼接算法。首先采用灰度直方图均衡化的方法降低光照条件不同造成的灰度差异;其次为减少匹配块的计算量,在选取的特征块上计算
    发表于 03-07 15:34 60次下载
    <b class='flag-5'>灰度</b>相关和区域特征的<b class='flag-5'>图像</b>拼接算法

    常见水印攻击对灰度图像位平面噪声分布研究_冯思玲

    常见水印攻击对灰度图像位平面噪声分布研究_冯思玲
    发表于 03-19 11:28 0次下载

    基于OpenCV的灰度图像伪彩色化研究边栓成

    基于OpenCV的灰度图像伪彩色化研究_边栓成
    发表于 03-17 08:00 2次下载

    基于分块颜色矩和灰度共生矩阵的图像检索_岳磊

    基于分块颜色矩和灰度共生矩阵的图像检索_岳磊
    发表于 03-17 09:57 1次下载

    基于灰度特征的虹膜图像质量评价方法_罗晓庆

    基于灰度特征的虹膜图像质量评价方法_罗晓庆
    发表于 03-16 11:05 0次下载

    基于PCNN和最大灰度图像分量的彩色图像分割_李建兵

    基于PCNN和最大灰度图像分量的彩色图像分割_李建兵
    发表于 03-19 19:12 0次下载

    MATLAB如何实现图像增强灰度变换直方图均衡匹配

    在MATLAB数字图像处理领域,如何实现空间域图像增强的灰度变换,以及图像直方图的均衡和匹配(配准)?本文通过大量的图片增强案例,从图像的显
    发表于 01-13 21:56 1.1w次阅读
    MATLAB如何实现<b class='flag-5'>图像</b>增强<b class='flag-5'>灰度</b>变换直方图均衡匹配

    如何使用FPGA实现图像灰度级拉伸算法

    为了调整图像数据灰度,介绍了一种图像灰度级拉伸算法的FPGA实现方法,并针对FPGA的特点对算法的实现方法进行了研究,从而解决了其在导引系统应用中的实时性问题。仿真验证结果表明:基于F
    发表于 04-01 14:14 1次下载
    如何使用FPGA实现<b class='flag-5'>图像</b><b class='flag-5'>灰度</b>级拉伸算法

    为什么图片识别要将彩色图像灰度化?

        先前在为大家介绍OCR识别技术时,在图像预处理部分提到了灰度化,大家可能会产生疑惑: 为什么做图片识别要将彩色图像灰度化呢?   正式解释这个问题之前,我们需要了解, 什么是
    发表于 05-28 11:36 1972次阅读
    为什么图片识别要将彩色<b class='flag-5'>图像</b><b class='flag-5'>灰度</b>化?