现在的位置: 首页 > 综合 > 正文

OpenCV学习笔记-阈值化

2013年12月24日 ⁄ 综合 ⁄ 共 2202字 ⁄ 字号 评论关闭
需要的几个函数:

Threshold

對數組元素進行固定閾值操作

void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
src
原始數組 (單通道 , 8-bit of 32-bit 浮點數).
dst
輸出數組,必須與 src 的類型一致,或者為 8-bit.
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)>threshold 0, otherwise threshold_type=CV_THRESH_BINARY_INV: dst(x,y) = 0, if src(x,y)>threshold max_value, otherwise threshold_type=CV_THRESH_TRUNC: dst(x,y) = threshold, if src(x,y)>threshold src(x,y), otherwise threshold_type=CV_THRESH_TOZERO: dst(x,y) = src(x,y), if (x,y)>threshold 0, otherwise threshold_type=CV_THRESH_TOZERO_INV: dst(x,y) = 0, if src(x,y)>threshold src(x,y), otherwise

下面是圖形化的閾值描述:

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

  1. AddWeighted  
  2. 计算两数组的加权值的和  
  3. void  cvAddWeighted( const CvArr* src1, double alpha,  
  4.                      const CvArr* src2, double beta,  
  5.                      double gamma, CvArr* dst );  
  6. src1  
  7. 第一个原数组.  
  8. alpha  
  9. 第一个数组元素的权值  
  10. src2  
  11. 第二个原数组  
  12. beta  
  13. 第二个数组元素的权值  
  14. dst  
  15. 输出数组  
  16. gamma  
  17. 添加的常数项。  
  18. 函数 cvAddWeighted 计算两数组的加权值的和:  
  19. dst(I)=src1(I)*alpha+src2(I)*beta+gamma  
  20. 所有的数组必须有相同的类型相同的大小(或ROI大小)  

具体实现例题为:

  1. #include "StdAfx.h"  
  2. #include <stdio.h>    
  3. #include <cv.h>    
  4. #include <highgui.h>    
  5. #include <cxcore.h>    
  6. void sum_rgb( IplImage* src , IplImage* dst)    
  7. {    
  8.     IplImage* r = cvCreateImage( cvGetSize(src) , IPL_DEPTH_8U , 1);    
  9.     IplImage* g = cvCreateImage( cvGetSize(src) , IPL_DEPTH_8U , 1);    
  10.     IplImage* b = cvCreateImage( cvGetSize(src) , IPL_DEPTH_8U , 1);   
  11.     cvSplit( src, r, g, b,NULL );    
  12.     IplImage* s = cvCreateImage( cvGetSize(src) , IPL_DEPTH_8U , 1);    
  13.     cvAddWeighted( r, 1./3., g, 1./3., 0.0 , s);    

抱歉!评论已关闭.