gamma校正中两种不同的访问数据的方法为什么得到的校正图像不同??



用了两种访问数据的方法。一种是用cv::LUT查表的方法遍历进行变换。一种是用迭代器进行遍历变换。对于单通道的灰度图像,两种方法输出的结果图像相同。但是对于3通道彩色图像,两种方法得到的图像不同,问题是出在了split和merge这个操作与直接遍历变换 两个不同操作导致的结果不同吗???????

cv::Mat gammatrans(cv::Mat &srcImg,float gamma)
{

 cv::Mat LUT(1,256,CV_8UC1);
 for(int i=0;i<256;i++)
 {
  LUT.at<uchar>(0,i)=cv::saturate_cast<uchar>(pow((float)(i/255.0f),gamma)*255.0f);
 }
 cv::Mat resultImg=srcImg.clone();
 if(srcImg.channels()==1)
 {
  cv::LUT(srcImg,LUT,resultImg);
 }
 else
 {
  std::vector<cv::Mat> vec;
  cv::split(srcImg,vec);
  cv::LUT(vec[0],LUT,vec[0]);
  cv::LUT(vec[1],LUT,vec[1]);
  cv::LUT(vec[1],LUT,vec[1]);
  cv::merge(vec,resultImg);
 }
 return resultImg;
}
cv::Mat gammatrans2(cv::Mat &srcImg,float gamma)
{
 uchar LUT[256];
 
 for(int i=0;i<256;i++)
 {
  LUT[i]=cv::saturate_cast<uchar>(pow((float)(i/255.0f),gamma)*255.0f);
 }
 cv::Mat resultImg=srcImg.clone();
 if(srcImg.channels()==1)
 {
  cv::MatIterator_<uchar>iterator=resultImg.begin<uchar>();
  cv::MatIterator_<uchar>iteratorEnd=resultImg.end<uchar>();
  for(;iterator!=iteratorEnd;iterator++)
   *iterator=LUT[(*iterator)];
 }
 else
 {
  cv::MatIterator_<cv::Vec3b>iterator=resultImg.begin<cv::Vec3b>();
  cv::MatIterator_<cv::Vec3b>iteratorEnd=resultImg.end<cv::Vec3b>();
  for(;iterator!=iteratorEnd;iterator++)
  {
           (*iterator)[0]=LUT[((*iterator)[0])];
     (*iterator)[1]=LUT[((*iterator)[1])];
     (*iterator)[2]=LUT[((*iterator)[2])];
  }
   
 }
 return resultImg;
}
int _tmain(int argc, _TCHAR* argv[])
{  
 cv::Mat srcImg=cv::imread("C:\\Users\\mona\\Desktop\\新建文件夹\\倩女幽魂.jpg");
 float gamma1=0.45;
 float gamma2=2.2;
 cv::Mat result1=gammatrans(srcImg,gamma1);
 cv::Mat result2=gammatrans(srcImg,gamma2);
 cv::Mat result3=gammatrans2(srcImg,gamma1);
 cv::Mat result4=gammatrans2(srcImg,gamma2);
 cv::imshow("原图",srcImg);
 cv::imshow("0.45gamma", result1);
 cv::imshow("2.2gamma", result2);
  cv::imshow("0.45gamma2", result3);
 cv::imshow("2.2gamma2", result4);
 cv::waitKey(0);
 return 0;
}

split和merge方法得到的图像

迭代器方法得到的图像

结果明显不同!

究竟是为什么呢??????????





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gamma校正和直方图均衡化是用于图像处理两种常见技术,用于增强图像的对比度和亮度分布。它们的原理如下: 1. Gamma校正Gamma校正是一种非线性调整图像亮度的方法,它是通过改变图像的像素值来调整亮度分布。Gamma校正基于一个叫做伽马函数的数学模型,其伽马值(&gamma;)决定了像素值的变换关系。伽马值小于1会使图像变亮,而伽马值大于1会使图像变暗。具体地说,Gamma校正通过将图像每个像素的亮度值进行幂次运算来改变图像的亮度。公式如下所示: V_out = V_in^&gamma; 其,V_in 是输入图像的像素值,V_out 是校正后的输出像素值。 2. 直方图均衡化: 直方图均衡化是一种用于增强图像对比度的技术,它通过重新分配图像的像素值来扩展亮度范围。直方图均衡化的原理是将原始图像的直方图转换为均匀分布的直方图。具体步骤如下: - 计算原始图像的直方图,即统计每个像素值的数量。 - 计算累积分布函数(CDF),即计算每个像素值的累积概率。 - 使用CDF对原始图像的每个像素值进行映射,将像素值替换为对应的累积概率。 - 将映射后的像素值进行归一化处理,以扩展亮度范围。 通过Gamma校正和直方图均衡化,我们可以调整图像的亮度分布以增强图像的视觉效果和对比度。这些技术在图像处理和计算机视觉领域广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值