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

罗索

数据结构操作与运算-IplImage数据结构(2)

jackyhwei 发布于 2011-06-24 09:16 点击:次 
上一篇的程序代码列出了IplImage主要用的变量类型,基本上,有这些信息就够用了,而IplImage实际上有那些变量类型呢?请看以下列表
TAG:

上一篇的程序代码列出了IplImage主要用的变量类型,基本上,有这些信息就够用了,而IplImage实际上有那些变量类型呢?请看以下列表

+号以下代表IplImage可用变量类型,-号以下则代表着OpenCV少用,或甚至不用的变量类型.

再来,是用cvLoadImage()来实例IplImage数据结构图像处理相关的算法.

IplImage数据结构灰度图的实例

  1. #include <cv.h> 
  2. #include <highgui.h> 
  3. #include <stdio.h> 
  4.  
  5. uchar Blue[640][480]; 
  6. uchar Green[640][480]; 
  7. uchar Red[640][480]; 
  8. uchar Gray[640][480]; 
  9.  
  10. int main() 
  11.         IplImage *Image1; 
  12.         Image1 = cvLoadImage("rain.jpg",1); 
  13.         cvNamedWindow("Color",1); 
  14.         cvShowImage("Color",Image1); 
  15.         cvWaitKey(0); 
  16.  
  17.         /* Load Image RGB Values */ 
  18.         for(int i=0;i<Image1->height;i++) 
  19.         { 
  20.                 for(int j=0;j<Image1->widthStep;j=j+3) 
  21.                 {
  22. Blue[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j]; 
  23. Green[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+1]; 
  24. Red[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+2]; 
  25.                 } 
  26.         } 
  27.  
  28.         /* Implement Algorithms */ 
  29.         for(int i=0;i<Image1->height;i++) 
  30.         { 
  31.                 for(int j=0;j<Image1->width;j++) 
  32.                 { 
  33. Gray[i][j]=(uchar)(0.299*Red[i][j] + 0.587*Green[i][j] + 0.114*Blue[i][j]); 
  34. Red[i][j]=Gray[i][j]; 
  35. Green[i][j]=Gray[i][j]; 
  36. Blue[i][j]=Gray[i][j]; 
  37.                 } 
  38.         } 
  39.  
  40.         /* Save Image RGB Values */ 
  41.         for(int i=0;i<Image1->height;i++) 
  42.         { 
  43.                 for(int j=0;j<Image1->widthStep;j=j+3) 
  44.                 { 
  45. Image1->imageData[i*Image1->widthStep+j]=Blue[i][(int)(j/3)]; 
  46. Image1->imageData[i*Image1->widthStep+j+1]=Green[i][(int)(j/3)]; 
  47. Image1->imageData[i*Image1->widthStep+j+2]=Red[i][(int)(j/3)]; 
  48.                 } 
  49.         } 
  50.  
  51.         cvSaveImage("rain_gray.jpg",Image1); 
  52.         cvNamedWindow("Gray Level",1); 
  53.         cvShowImage("Gray Level",Image1); 
  54.         cvWaitKey(0); 
  55.  
  56.         cvReleaseImage(&Image1); 
  57.         cvDestroyWindow("Gray Level"); 

原始图片(大小是:高度640 x 宽度480):


执行结果:
(1)

(2)Gray=(Red+Green+Blue)/3,错误的灰级结果

上面的程序代码分成三部分
1.imageData转RGB(Load Image RGB Values)
2.RGB算法实例(Implement Algorithms)
3.RGB转imageData(Save Image RGB Values)
中间那部分的灰级是用转灰级的算法实例出来的,灰级算法转换并不是Gray=(Red+Green+Blue)/3,因为人的眼睛看到的色域范围并不是红 绿蓝各256的,因为人的眼睛对于能看见绿色的比率比较高,占58%,对人来讲能看见绿色的范围占快60%而相对的红色跟蓝色的能看见的区域就比较少,用 加 起来除以3将会是不正确的结果.

对于一般学术论文,创造新的算法,或是图像处理相关作业算法实例,都可以藉由这种方式来对 IplImage数据结构读取RGB值,就如同中值滤波器,转灰度图,小波转换等算法实例都可以在 /* Implement Algorithms */下面的for循环制作,接着将它转回IplImage数据结构,存成图像文件,时间复杂度也只是O(n2)而已,不会造成浪费太多的时间,而OpenCV可以做到的强大功能是,大部分的图像文件格式都可以打开做转换,经由算法处理做更多的应用.

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