use cvThreshold in three channel and truncate values above 100

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);

	//split image onto the color planes.
	cvSplit(src, r, g, b, NULL);

	//Temporary storage.
	IplImage *s = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);

	//Add equally weighted rgb values.
	//dst = src1*alpha + src2*beta + gamma;
	cvAddWeighted(r, 1./3., g, 1./3., 0.0, s);
	cvAddWeighted(s, 2./3., b, 1./3., 0.0, s);

	//Truncate values above 100.
	cvThreshold(s, dst, 100, 100, CV_THRESH_TRUNC);

	cvReleaseImage(&r);
	cvReleaseImage(&g);
	cvReleaseImage(&b);
	cvReleaseImage(&s);
}
int _tmain(int argc, _TCHAR* argv[]) {
	//Create a named window with the name of the file.
	cvNamedWindow("Test", CV_WINDOW_AUTOSIZE);

	//Load the image from the given file name.
	IplImage *src = cvLoadImage("Lena.jpg");
	IplImage *dst = cvCreateImage(cvGetSize(src), src ->depth, 1);
	sum_rgb(src, dst);

	//Show the image in the named window
	cvShowImage("Test", dst);

	//Idle until the user hits the "Esc" key.
	while(1) {
		if (cvWaitKey(10) == 27)
			break;
	}

	//Clean up
	cvDestroyWindow("Test");
	cvReleaseImage(&src);
	cvReleaseImage(&dst);

	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章