织梦CMS - 轻松建站从此开始!

罗索

OPENCV下针对IplImage实现图像增强处理

落鹤生 发布于 2010-04-25 17:49 点击:次 
因为使用的摄像头图像质量很差,不能直接用做分割等后续的处理,需要根据直方图进行图像增强,OPENCV没有现成的方法,只有自己想办法了。
TAG:

因为使用的摄像头图像质量很差,不能直接用做分割等后续的处理,需要根据直方图进行图像增强,OPENCV没有现成的方法,只有自己想办法了。 参考了网上文章.原理就是利用直方图统计分布,将图像灰度的域值拉伸到0-255,原来网上的代码有些问题,而且是使用bmp的,我就改成了IplImage了,于是在OPENCV实现了这个功能,感觉效果不错,可以看到昏暗的图像可以增强的很好。

结果如下:

代码如下,

  1. WW_RETURN HumanMotion::ImageStretchByHistogram(IplImage *src,IplImage *dst) 
  2. /************************************************* 
  3.   Function:         
  4.   Description:     因为摄像头图像质量差,需要根据直方图进行图像增强, 
  5.                    将图像灰度的域值拉伸到0-255 
  6.   Calls:           
  7.   Called By:       
  8.   Input:           单通道灰度图像                   
  9.   Output:          同样大小的单通道灰度图像  
  10.   Return:           
  11.   Others:           http://www.xiaozhou.net/ReadNews.asp?NewsID=771 
  12.   DATE:               2007-1-5 
  13. *************************************************/ 
  14.     //p[]存放图像各个灰度级的出现概率; 
  15.     //p1[]存放各个灰度级之前的概率和,用于直方图变换; 
  16.     //num[]存放图象各个灰度级出现的次数; 
  17.  
  18.     assert(src->width==dst->width); 
  19.      
  20.     float p[256],p1[256],num[256]; 
  21.     //清空三个数组 
  22.     memset(p,0,sizeof(p)); 
  23.     memset(p1,0,sizeof(p1)); 
  24.     memset(num,0,sizeof(num)); 
  25.  
  26.     int height=src->height; 
  27.     int width=src->width; 
  28.     long wMulh = height * width; 
  29.  
  30.     //求存放图象各个灰度级出现的次数 
  31.     // to do use openmp 
  32.     for(int x=0;x<width;x++) 
  33.     { 
  34.         for(int y=0;y<height;y++) 
  35.         { 
  36.             uchar v=((uchar*)(src->imageData + src->widthStep*y))[x]; 
  37.             num[v]++; 
  38.         } 
  39.     } 
  40.  
  41.     //求存放图像各个灰度级的出现概率 
  42.     for(int i=0;i<256;i++) 
  43.     { 
  44.         p[i]=num[i]/wMulh; 
  45.     } 
  46.  
  47.     //求存放各个灰度级之前的概率和 
  48.     for(int i=0;i<256;i++) 
  49.     { 
  50.         for(int k=0;k<=i;k++) 
  51.             p1[i]+=p[k]; 
  52.     } 
  53.  
  54.     //直方图变换 
  55.     // to do use openmp 
  56.     for(int x=0;x<width;x++) 
  57.     { 
  58.         for(int y=0;y<height;y++) 
  59.         { 
  60.             uchar v=((uchar*)(src->imageData + src->widthStep*y))[x]; 
  61.             ((uchar*)(dst->imageData + dst->widthStep*y))[x]= p1[v]*255+0.5;             
  62.         } 
  63.     } 
  64.     return WW_OK; 

 

(hardVB)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201004/9262.html]
本文出处:CSDN博客 作者:hardVB
顶一下
(5)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容