对图像中的三个同澳求和,然后在值为100处度结果进行截断


[cpp] view plain copy
  1. #include <stdio.h>  
  2. #include "opencv/cv.h"  
  3. #include "opencv/highgui.h"  
  4.   
  5.   
  6. void sum_rgb(IplImage* src, IplImage* dst)  
  7. {  
  8.   
  9.     //Allocate individual image planes  
  10.     IplImage* r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
  11.     IplImage* g = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
  12.     IplImage* b = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
  13.     //Split image onto the  color planes  
  14.     cvSplit(src,r,g,b,NULL);  
  15.     //Temporary storage  
  16.     IplImage* s = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);  
  17.       
  18.     //add equally weighted rgb values  
  19.     cvAddWeighted(r,1./3.,g,1./3.,0.0,s);  
  20.     cvAddWeighted(s,2./3.,b,1./3.,0.0,s);  
  21.   
  22.     //Truncate values above 100  
  23.     cvThreshold(s,dst,100,100,CV_THRESH_TRUNC);  
  24.       
  25.     cvReleaseImage(&r);  
  26.     cvReleaseImage(&g);  
  27.     cvReleaseImage(&b);  
  28.     cvReleaseImage(&s);  
  29.      
  30. }  
  31. int main(int argc,char** argv)  
  32. {  
  33.     cvNamedWindow(argv[1],1);  
  34.       
  35.     IplImage* src = cvLoadImage(argv[1]);  
  36.     IplImage*dst = cvCreateImage(cvGetSize(src),src->depth,1);  
  37.     sum_rgb(src,dst);  
  38.     cvShowImage(argv[1],dst);  
  39.     while(1){  
  40.         if((cvWaitKey(10)&0x7f) == 27) break;    }  
  41.           
  42.     cvDestroyWindow(argv[1]);  
  43.       
  44.     cvReleaseImage(&src);  
  45.     cvReleaseImage(&dst);  
  46.   
  47.     return 0;  
  48. }  



CreateImage
创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels );
size
图像宽、高.
depth
图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号 位整型
IPL_DEPTH_8S - 有符号 位整型
IPL_DEPTH_16U - 无符号 16 位整型
IPL_DEPTH_16S - 有符号 16 位整型
IPL_DEPTH_32S - 有符号 32 位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels
每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据
排列是:
b0 g0 r0 b1 g1 r1 ...
虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些 OpenCV 也能处理他但是
这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式header = cvCreateImageHeader(size,depth,channels);cvCreateData(header);



AddWeighted
计算两数组的加磅值的和void cvAddWeighted( const CvArr* src1, double alpha,const CvArr* src2, double beta,double gamma, CvArr* dst );
src1
第一个原数组.
alpha
第一个数组元素的磅值
src2
第二个原数组
beta
第二个数组元素的磅值
dst
输出数组
gamma
作和合添加的数量。函数 cvAddWeighted 计算两数组的加磅值的和:dst(I)=src1(I)*alpha+src2(I)*beta+gamma所有的数组必须的相同的类型相同的大小(或 ROI 大小)


Split
分割多通道数组成几个单通道数组或者从数组中提取一个通道void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1,CvArr* dst2, CvArr* dst3 );#define cvCvtPixToPlane cvSplit
src
原数组.
dst0...dst3
目标通道函数 cvSplit 分割多通道数组成分离的单通道数组 d。可获得两种操作模式 . 如果原数组有 N 通道且前 N 输出数组非 NULL, 所有的通道都会被从原数组中提取,如果前 N个通道只有一个通道非 NULL 函数只提取该指定通道,否则会产生一个错误,余下的通道(超过前 N 个通道的以上的)必须被设置成 NULL,对于设置了 COI 的 IplImage 结使用 cvCopy 也可以从图像中提取单通道。


Threshold
对数组元素进行固定阈值操作void cvThreshold( const CvArr* src, CvArr* dst, double threshold,double max_value, int threshold_type );
src
原始数组 (单通道, 8-比特 of 32-比特 浮点数).
dst
输出数组,必须与 src 的类型一致,或者为 8-比特.
threshold
阈值
max_value
使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
threshold_type
阈值类型 (见讨论)函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。
本函数支持的对图像取阈值的方法由 threshold_type 确定:

threshold_type=CV_THRESH_BINARY:dst(x,y) = max_value, if src(x,y)>threshold0, otherwisethreshold_type=CV_THRESH_BINARY_INV:dst(x,y) = 0, if src(x,y)>thresholdmax_value, otherwisethreshold_type=CV_THRESH_TRUNC:dst(x,y) = threshold, if src(x,y)>thresholdsrc(x,y), otherwisethreshold_type=CV_THRESH_TOZERO:dst(x,y) = src(x,y), if (x,y)>threshold0, otherwisethreshold_type=CV_THRESH_TOZERO_INV:dst(x,y) = 0, if src(x,y)>thresholdsrc(x,y), otherwise


下面是图形化的阈值描述:

阈值化

效果图如下:








[cpp] view plain copy
  1. /* 
  2. 比较自适应阀值和单一阀值 
  3. */  
  4. #include <stdio.h>  
  5. #include "opencv/cv.h"  
  6. #include "opencv/highgui.h"  
  7. #include "math.h"  
  8.   
  9. IplImage* Igray = 0,*It = 0, *Iat;  
  10.   
  11. int main(int argc,char** argv)  
  12. {  
  13.     if(argc != 7){return -1;}  
  14.       
  15.     double threshold = (double)atof(argv[1]);  
  16.     int threshold_type = atoi(argv[1]) ?    
  17.                     CV_THRESH_BINARY : CV_THRESH_BINARY_INV;  
  18.     int adaptive_method = atoi(argv[3]) ?   
  19.                     CV_ADAPTIVE_THRESH_MEAN_C : CV_ADAPTIVE_THRESH_GAUSSIAN_C;  
  20.                       
  21.     int block_size = atoi(argv[4]);  
  22.     double offset = (double)atof(argv[5]);  
  23.       
  24.     //Read in gray image  
  25.     if((Igray = cvLoadImage(argv[6],CV_LOAD_IMAGE_GRAYSCALE)) == 0){  
  26.         return -1;}  
  27.       
  28.     It = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1);  
  29.     Iat = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1);  
  30.       
  31.     cvThreshold(Igray,It,threshold,255,threshold_type);  
  32.     cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,threshold_type,block_size,offset);  
  33.       
  34.     cvNamedWindow("Raw",0);  
  35.     cvNamedWindow("Threshold",0);  
  36.     cvNamedWindow("Adaptive Threshold",0);  
  37.       
  38.     cvShowImage("Raw",Igray);  
  39.     cvShowImage("Threshold",It);  
  40.     cvShowImage("Adaptive Threshold",Iat);  
  41.       
  42.     cvWaitKey(0);  
  43.       
  44.     cvReleaseImage(&Igray);  
  45.     cvReleaseImage(&It);  
  46.     cvReleaseImage(&Iat);  
  47.     cvDestroyAllWindows();  
  48.       
  49.     return 0;  
  50. }  

相关文章: