/* Types of thresholding */ #define CV_THRESH_BINARY 0 /* value = value > threshold ? max_value : 0 */ #define CV_THRESH_BINARY_INV 1 /* value = value > threshold ? 0 : max_value */ #define CV_THRESH_TRUNC 2 /* value = value > threshold ? threshold : value */ #define CV_THRESH_TOZERO 3 /* value = value > threshold ? value : 0 */ #define CV_THRESH_TOZERO_INV 4 /* value = value > threshold ? 0 : value */ #define CV_THRESH_MASK 7 #define CV_THRESH_OTSU 8 /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */ /* Applies fixed-level threshold to grayscale image. This is a basic operation applied before retrieving contours */ CVAPI(double) cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
#include "stdafx.h" #include <cv.h> #include <highgui.h> #include <iostream> #include <stdio.h> using namespace std; void sum_rgb( IplImage* src, IplImage* dst ); int main(int argc, char** argv) { cvNamedWindow( "example", 1 ); //create a window IplImage* src = cvLoadImage("C:\\Users\\Administrator\\Desktop\\1002.png" ); IplImage* dst = cvCreateImage( cvGetSize(src), src->depth, 1 ); // sum_rgb( src, dst ); cvShowImage( "example", dst ); while (1) { if( (cvWaitKey( 10 )) == 27 ) break; } cvDestroyWindow( argv[1] ); cvReleaseImage( &src ); cvReleaseImage( &src ); return 0; } void sum_rgb( IplImage* src, IplImage* dst ) { //allocate individual image planes IplImage* r = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); IplImage* g = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); IplImage* b = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); //temporary storage IplImage* s = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 ); //split the image onto the color planes, signal channel cvSplit( src, r, g, b, NULL );//将三通道数据分别加载到各自的内存片中 //add eaually weighted rgb values /* 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大小) */ cvAddWeighted( r, 1./3, g, 1./3, 0.0, s ); //add r & g cvAddWeighted( s, 2./3, b, 1./3, 0.0, s ); //truncate values above 100 cvThreshold( s, dst, 150, 100, CV_THRESH_TRUNC );//单通道的图像阈值操作 cvReleaseImage( &r ); cvReleaseImage( &g ); cvReleaseImage( &b ); cvReleaseImage( &s ); }