ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

OpenCV计算机视觉开发入门与实践<十七>:点运算与灰度变换概述

OpenCV计算机视觉开发入门与实践<十七>:点运算与灰度变换概述 灰度化是图像处理中的一个基本步骤其目的是将彩色图像转换为灰度图像。灰度图像是一种仅包含亮度信息而不包含颜色信息的图像其像素值通常用一个字节即0~255的范围来表示这个值代表了该像素的灰度等级也就是亮度。灰度化是许多图像处理任务的第一步如边缘检测、图像分割、特征提取等因为灰度图像相对于彩色图像来说计算量更小处理速度更快同时保留了图像的大部分重要信息。灰度变换可以改善图像的质量使图像能够显示更多的细节提高图像的对比度对比度拉伸可以有选择地突出图像感兴趣的特征或者抑制图像中不需要的特征可以有效地改变图像的直方图分布使像素的分布更为均匀。1.点运算1.1 基本概念图像点运算或称点处理是指对图像中的每一个像素点依次进行同样的灰度运算使其输出的每一个像素值仅由对应点的值来决定可以理解为点到点之间的映射。在所有图像处理算法中点运算是基本的图像处理操作它既可以单独使用又可以与其他算法组合使用。通过点运算输出图像每个像素的灰度值仅仅取决于输入图像中对应像素的灰度值。因此点运算不能改变图像内的空间关系。点运算是基于像素的处理进行这类处理时每个像素的处理与其他像素无关。点运算以预定的方式改变图像的灰度直方图除了灰度级的改变是根据某种特定的灰度变换函数进行的以外点运算可以被视为一种“从像素到像素”的复制操作。1.2 点运算的目标点运算是实现图像增强处理的常用方法之一经常用于改变图像的灰度范围及其分布。通过这种方法可以使图像的动态范围增大增强图像的对比度使图像变得更加清晰。1.3 点运算的分类通常点运算分为灰度变换和直方图修正两种其中直方图修正包括直方图均衡化和直方图规定化。灰度变换是图像处理的基本方法之一可加大图像动态范围增强对比度使得图像更加清晰特征更加明显是图像增强的重要手段。图像的灰度变换又称为灰度增强是指根据某种目标条件按一定变换关系逐点改变原图像中每一个像素灰度值的方法。直方图均衡化也是一种灰度的变换过程它将当前的灰度分布通过一个变换函数变换为范围更宽、灰度分布更均匀的图像。也就是将原图像的直方图修改为在整个灰度区间内大致均匀分布因此扩大了图像的动态范围增强了图像的对比度。直方图均衡化自动确定了变换函数可以很方便地得到变换后的图像但是在有些应用中这种自动增强并不是最好的方法。有时需要图像具有某一特定的直方图形状也就是灰度分布而不是均匀分布的直方图这时可以使用直方图规定化。1.4 点运算的特点从算法原理来看点运算指的是仅根据图像中像素的原灰度值按一定的规则来确定其新的灰度值。在实现点运算算法时有时还得考虑像素在图像中的位置。由于点运算算法的上述特点单个像素的新灰度值仅仅依赖于该像素原灰度值的大小而与周围像素的灰度值没有关系。正因为像素原灰度值与新灰度值间是单独相关的故点运算算法一般是可逆的。点运算算法通常采取逐点扫描像素的方法来实现每个像素的变换它直接把原像素值映射到一个新值因此点运算可以借助查找表实现。一般来讲点运算算法不会改变一幅图像中各像素之间的空间关系因此不能用于增强图像所包含的细节。有时这种处理又被称为对比度拉伸、对比度增强或灰度变换等。1.1.5 点运算的应用在开始处理图像前有时需要用点运算来克服图像数字化设备的局限性这对于图像的显示十分重要。点运算通常有如下应用1光度学标定数字图像中每一像素的灰度值应该反映原稿和数字化设备的物理特性例如光照强度和反射或透射密度等。利用点运算可以去除图像输入设备传感器的非线性影响。假设一幅图像被一个对光照强度呈非线性反应的仪器数字化则可以利用点运算来变换灰度级使之反映光照强度的等步长增量这就是光度学标定。此外点运算也可以用来产生一幅图像该图像的灰度级表示原稿反射或透射密度的等步长增量。2对比度增强在某些数字图像中人们感兴趣的特征仅占据整个灰度分级相当窄的一个范围。如果出现了这种情况就可以用点运算来扩展感兴趣特征的对比度使之占据可显示灰度级的更大范围。这一方法有时又被称为对比度扩展。3显示标定某些显示设备有特定的优选灰度范围在这一范围内图像的视觉特征表现得最明显。如果用这样的设备显示图像虽然图像中较暗和较亮的部位有相同的对比度但显示时不能得到很好的表示。在这种情况下可以利用点运算将所有的特征突出显示。此外不少显示器不能保持像素的灰度值和屏幕上相应点的亮度间的线性关系有的胶片记录仪不能线性地将灰度值转换为对应的密度值。出现上述情况时可通过在显示或记录前设计合理的点运算算法加以克服。另外还可以将点运算和显示的非线性组合起来使它们互相抵消得到图像显示的线性关系这个过程被称为显示标定。4轮廓线利用点运算算法可以为图像加上轮廓线例如用点运算进行图像的阈值化处理根据图像的灰度等级把一幅图像划分成一些不连接的区域这有助于确定图像中对象的边界或定义蒙版。蒙版是用来遮盖图层的实际效果就是让图层变得透明。5裁剪数字图像通常以整数存储因此可用的灰度分级范围总是有限的。对于8位的灰度图像在存储每一像素值前输出图像的灰度级一定要被裁剪到0~255的范围内。2.灰度变换2.1 灰度变换概述如果拍照时曝光不足或曝光过度照片会显得灰朦朦的或者过白如X光照片或陆地资源卫星多光谱图像。这实际上是因为对比度太小且输入图像亮度分量的动态范围较小造成的。要改善这些图像的质量可以采用灰度变换法通过扩展输入图像的动态范围来达到图像增强的目的。在图像预处理中图像的灰度变换是图像增强的重要手段。印刷图像在成像过程中经过传送和转换如成像、复制、扫描、传输和显示等过程后经常会造成图像质量下降。通过采取适当的处理方法可以把原本模糊不清甚至根本无法分辨的原始图片处理成清楚、富含大量有用信息的可使用目标图像。因此在医学、遥感、微生物、刑侦以及军事等诸多科研和应用领域中图像增强处理技术对原始图像的模式识别、目标检测等起着重要作用。灰度变换主要利用点运算来修正像素灰度由输入像素点的灰度值确定相应输出点的灰度值是一种基于图像变换的操作。基于点运算的灰度变换可表示为sT®。其中T是灰度变换函数r是变换前的灰度s是变换后的像素。2.2 灰度变换的作用图像灰度变换有以下作用1改善图像的质量使图像能够显示更多的细节提高图像的对比度对比度拉伸。2有选择地突出图像感兴趣的特征或者抑制图像中不需要的特征。3可以有效地改变图像的直方图分布使像素的分布更为均匀。2.3 灰度变换的方法灰度变换函数描述了输入灰度值和输出灰度值之间变换关系一旦灰度变换函数确定下来了其输出的灰度值也就确定了。可见灰度变换函数的性质决定了灰度变换所能达到的效果。根据不同的应用要求可以选择不同的变换函数如正比函数和指数函数等。根据函数的性质灰度变换的方法可以分为线性灰度变换、分段线性灰度变换、非线性灰度变换包括对数函数变换和幂律函数变换伽马变换。2.4 灰度化在具体讲述灰度变换之前我们先了解一下灰度的概念。在数字图像中像素是基本的表示单位各个像素的亮暗程度用灰度值来标识。对于单色图像它的每个像素的灰度值用[0255]区间的整数表示即图像分为256个灰度等级。对于彩色图像它的每个像素都由R、G、B三个单色调配而成。如果每个像素的R、G、B完全相同也就是RGBD该图像就是灰度图像其中D被称为各个像素的灰度值。从理论上讲等量的三基色R、G、B相加可以变为白色其数学表达式为白色(1×R)(1×G)(1×B)但是由于人眼对R、G、B三个分量亮度的敏感度不一样等量的R、G、B混合不能得到白色故其混合比例需要调整。通常有3种方法对彩色图进行灰度化。1加权平均值法大量的实验数据表明将0.299份红色、0.587份绿色、0.114份蓝色混合后可以得到白色因此彩色图像可以根据以下公式变为灰度图像D0.299×R0.587×G0.114×B其中D表示点(x,y)转换后的灰度值R、G、B为点(x,y)的3个单色分量。这个公式一般称为经验公式。2取最大值法最大值法是将彩色图像中的3个分量的亮度的最大值作为灰度图像的灰度值。Dmax(R,G,B)取3个分量中的最大值作为灰度值灰度处理首先读入图像的复制文件到内存中找到R、G、B中的最大值使颜色的分量值都相等且等于最大值这样就可以将彩色图像变成灰度图像。3平均值法平均值法是对彩色图像中的3个分量的亮度值求平均值从而得到一个灰度值将其作为灰度图像的灰度D(RGB)/3【例5.1】由经验公式实现RGB图像转灰度图像在代码中通过imread和经验公式来实现将彩色图像转换为灰度图像。imread通过第二个参数的设置可以将读取的图像转为灰度图像。#includeiostream#includeopencv2/opencv.hpp#includeiostreamusingnamespacecv;usingnamespacestd;#pragmacomment(lib,opencv_world4140d.lib)//引用引入库voidgrayImageShow(cv::Matinput,cv::Matoutput){for(inti0;iinput.rows;i)for(intj0;jinput.cols;j)output.atuchar(i,j)cv::saturate_castuchar(0.114*input.atcv::Vec3b(i,j)[0]0.587*input.atcv::Vec3b(i,j)[1]0.2989*input.atcv::Vec3b(i,j)[2]);cv::imshow(gray by experience,output);//由经验公式得到的灰度图像}intmain(void){cv::Mat src,gray,dst;graycv::imread(1.jpg,cv::IMREAD_GRAYSCALE);//读取图像文件srccv::imread(1.jpg);dst.create(src.rows,src.cols,CV_8UC1);cv::imshow(scr,src);cv::imshow(gray by imread,gray);//显示由imread得到的灰度图像grayImageShow(src,dst);//由经验公式得到的灰度图像waitKey(-1);//按键后再继续return0;}【例5.2】优化后的RGB图像转灰度图像boolrgb2gray(unsignedchar*src,unsignedchar*dest,intwidth,intheight){intr,g,b;for(inti0;iwidth*height;i){r*src;// load redg*src;// load greenb*src;// load blue// build weighted average:*dest(r*76g*150b*30)8;}returntrue;}intmain(){Mat src,gray,dst;srccv::imread(1.jpg);dst.create(src.rows,src.cols,CV_8UC1);cv::imshow(scr,src);rgb2gray(src.data,dst.data,src.cols,src.rows);//由经验公式得到的灰度图像cv::imshow(gray by experience,dst);waitKey(-1);//按键后再继续}2.5 对比度前面提到了改善图像的质量以及提高图像的对比度对比度拉伸那么什么是对比度呢对比度就是画面的明亮部分和阴暗部分的灰度的比值。一幅图像的对比度越高图像中被照物体的轮廓就越分明可见图像也就越清晰对比度越低图像中的物体轮廓就越模糊图像也就越不清晰。对比度对视觉效果的影响非常关键一般来说对比度越大图像越清晰醒目色彩也越鲜明艳丽对比度越小则会让整个画面越灰蒙蒙的。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。在一些黑白反差较大的文本显示、CAD显示和黑白照片显示等方面高对比度产品在黑白反差、清晰度、完整性等方面都具有优势。相对而言在色彩层次方面高对比度对图像的影响并不明显。对比度对于动态视频显示效果影响更大一些因为动态图像中明暗转换比较快对比度越高人的眼睛越容易分辨出这样的转换过程。
返回列表