/* 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 );
}