首页 > 编程知识 正文

opencv梯形校正(opencv和openmv区别)

时间:2023-05-03 07:23:30 阅读:74457 作者:3319

声明:正文原文来自@零硬币博文,原文地址为https://blog.csdn.net/linqian bi/article/details/78617615。 正文摘录和少量修订仅用于本人的学习、记录,博客有异议的请联系本人删除。

gamma校正原理:

假设图像中有一个值为200的像素,则必须执行以下步骤来校正此像素:

1 .归一化:将像素值转换为0到1之间的实数。 算法如下:(I0.5 )/256这里包括一个除法和一个加法操作。 对于像素a的情形,对应于该情形的归一化值为0.783至203。

2 .使用事先补偿)式,求出将像素正规化后的数据的1/伽马作为指数的对应值。 这个步骤包括求指数的运算。 假设伽马值为2. 2,则1/伽马值为0. 454545,并且作为对标准化了的a值进行预补偿的结果,1/伽马值为0. 783203 ^0. 454545=0. 894872。

3 .逆正规化:将预补偿的实数值逆转换为0 ~ 255的整数值。 具体算法为: f*256 - 0. 5该步骤包括乘法和减法。 跟在前面的例子之后,将a的预补偿结果0. 894872代入上面的公式,其中,a的预补偿后的对应像素值为228,最后被发送给显示器的数据。

如上所述,直接用数学公式编程时,假设图像分辨率为800*600,为了对其进行伽马校正,需要执行48万个浮点数的乘法运算、除法运算、指数运算。 效率太低,完全得不到实时效果。

针对这种情况,提出了如果能够知道图像像素所取的值的范围、例如0 ~ 255间的整数,则图像中的任意一个像素值只能是0 ~ 255的256个整数中的任意一个的高速算法; 在已知伽马值的情况下,0到255之间的任何整数在经过“归一化、预补偿、逆归一化”操作后,对应的结果是唯一的,并且在0到255的范围内。

如前例所示,如果已知伽马值为2. 2并且像素a的原始值为200,则需要与伽马校正后的a对应的预补偿值为228。 根据上述原理,对0 ~ 255的每个整数进行事前校正操作,只需将对应的事前校正值保存在预先制作的伽马校正查找表LUT:Look Up Table中,就可以使用该表对任意像素值为0 ~ 255的图像进行伽马校正

Gamma校正实现:

# include iostream # include opencv2 corecore.HPP # include opencv2 highguihighgui.HPP # include opencv2 img pencv for(intI=0; i 256; I ) ) floatf=(I0.5f )/255; f=(浮动) ) pow(f,kFactor ); lut [ I ]=saturate _ cast uchar (f * 255.0 f-0.5f ); }Mat resultImage=srcImage.clone (; if(srcimage.channels(==1) mat iterator _ uchar iterator=result image.begin uchar ); mat iterator _ uchariteratorend=result image.end uchar (; for (; 迭代器!=迭代器结束; 迭代器(* iterator=lut ) )迭代器); } else { mat iterator _ ve c3b iterator=result image.begin ve c3b (; mat iterator _ ve C3 biteratorend=result image.endv ec3b (; for (; 迭代器!=迭代器结束; iterator () iterator ) [0]=lut ) () iterator ) [0] ); //b (迭代器[1]=lut ) ) )迭代器) [1] ); //g (迭代器) (2)=lut ) () (迭代器) ) ); //r } }返回结果图像; }int main () matsrcimage=im read (' lake water.jpg ); if (! src image.data (打印(could not loadimage… n ); 返回- 1;//取两种不同伽马值float gamma1=3.33f; 浮动gamma2=0.33 f; floatkfactor1=1/伽马1; floatkfactor2=1/伽马2; mat result1=gamma transform (src image,kFactor1); mat result2=gamma transform (src image,kFactor2); imshow(srcImage )、srcimage ); imshow(res1 )、result1); imshow(res2 )、result2); 维基(0; 返回0; }原图:

伽马=3.33的效果图:

伽马=0.33的效果图:

个人笔记:

Gamma校正对于光照不均匀现象处理较好,简单场景下指数增强的效果与Gamma校正类似,代码如下。但是指数校正更多的用来增加图像对比度,目的为“让高亮区域更亮,让灰暗区域更暗”,达不到通过调整Gamma值增加整个图像亮度或降低的目的。

# include opencv2/highgui/highgui.HPP # include opencv2/img proc/img proc.hppusingnamespacecv; intmain(intargc,char *argv[] ) matimage=imread(file_path ); 常数因子=3; //resize(image,image,size ) image.rows/2,image.rows/2 ); matimagegamma(image.size )、CV_32FC3); for(intI=0; i image.rows; I ) for(intj=0; j image.cols; j ) ) imagegamma.ATVEC3f(I,j ) )=pow ) image.ATVEC3b ) )、factor ); imagegamma.ATVEC3f(I,j ) [1]=pow ) image.ATVEC3b ) I,j ) [1],factor ); imagegamma.ATVEC3f(I,j ) [2]=pow ) image.ATVEC3b ) I,j ) [2],factor ); 标准化为}//0~255normalize(imageGamma,imagegamma,0,255,CV_MINMAX ); 转换为8bit图像并显示转换图像(imagegamma,imagegamma ); imshow (原图)、image ); imshow (“伽马变换图像增强效果”、imageGamma ); 等待密钥(; 返回0; 下图是伽马值与指数补偿的比较,伽马值和指数值采用代码段的值。

原图

指数2-1 :

指数2-2 :

伽马3-1 :

伽马3-2: (伽马factor1) )。

伽玛3-3 (伽玛因子1 ) )。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。