【肤色检测 (I)】实测Ycrcb之cr分量+otsu阈值化

简介:

效果还不错,不过问题就是代码都是用的较老的opencv语法,里面有一些处理不好容易报错。。


#include "cv.h"
#include "highgui.h"

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/core/core.hpp>

#include <iostream>
#include <string>
#include <cstdio>

using namespace std;
using namespace cv;

// implementation of otsu algorithm
// author: onezeros#yahoo.cn
// reference: Rafael C. Gonzalez. Digital Image Processing Using MATLAB
void cvThresholdOtsu(IplImage* src, IplImage* dst)
{
	int height=src->height;
	int width=src->width;

	//histogram
	float histogram[256]={0};
	for(int i=0;i<height;i++) {
		unsigned char* p=(unsigned char*)src->imageData+src->widthStep*i;
		for(int j=0;j<width;j++) {
			histogram[*p++]++;
		}
	}
	//normalize histogram
	int size=height*width;
	for(int i=0;i<256;i++) {
		histogram[i]=histogram[i]/size;
	}

	//average pixel value
	float avgValue=0;
	for(int i=0;i<256;i++) {
		avgValue+=i*histogram[i];
	}

	int threshold;	
	float maxVariance=0;
	float w=0,u=0;
	for(int i=0;i<256;i++) {
		w+=histogram[i];
		u+=i*histogram[i];

		float t=avgValue*w-u;
		float variance=t*t/(w*(1-w));
		if(variance>maxVariance) {
			maxVariance=variance;
			threshold=i;
		}
	}

	cvThreshold(src,dst,threshold,255,CV_THRESH_BINARY);
}

void cvSkinOtsu(IplImage* src, IplImage* dst)
{
	assert(dst->nChannels==1&& src->nChannels==3);

	IplImage* ycrcb=cvCreateImage(cvGetSize(src),8,3);
	IplImage* cr=cvCreateImage(cvGetSize(src),8,1);
	cvCvtColor(src,ycrcb,CV_BGR2YCrCb);
	//show ycrcb
	cvShowImage("ycrcb",ycrcb);

	cvSplit(ycrcb,0,cr,0,0);

	cvThresholdOtsu(cr,cr);
	cvShowImage("out2",cr);

	//cvWaitKey(0);
	//cvCopyImage(cr,dst);

	//cvReleaseImage(&cr);
	cvReleaseImage(&ycrcb);
}


int main()
{
	IplImage* img = cvLoadImage( "earth.jpg" );
	//out用以保存输出图像
	IplImage * out = cvCreateImage(
		cvGetSize(img),
		IPL_DEPTH_8U,
		3
	);

	cvShowImage("in",img);
	cvSkinOtsu(img,out);
	//cvShowImage("out",out);

	cvWaitKey(0);

	cvReleaseImage(&img);//用完清理
	cvReleaseImage(&out);//用完清理
	cvDestroyWindow("in");
	cvDestroyWindow("out");

	return 0;
}




相关文章
|
17天前
减小PAPR——DFT扩频
减小PAPR——DFT扩频
19 1
|
6月前
|
计算机视觉
OpenCV-DFT最优尺寸cv::getOptimalDFTSize
OpenCV-DFT最优尺寸cv::getOptimalDFTSize
|
存储 算法 数据可视化
PCL 随机采样一致性--识别球面和平面
PCL 随机采样一致性--识别球面和平面
PCL 随机采样一致性--识别球面和平面
|
4月前
|
计算机视觉
[OpenCv] 自适应阀值的二值化处理
[OpenCv] 自适应阀值的二值化处理
20 1
|
6月前
|
计算机视觉 C++
OpenCV-单峰三角阈值法Thresh_Unimodal
OpenCV-单峰三角阈值法Thresh_Unimodal
|
6月前
|
计算机视觉
OpenCV-向上采样cv::pyrUp&&向下采样cv::pyrDown
OpenCV-向上采样cv::pyrUp&&向下采样cv::pyrDown
|
6月前
|
存储 计算机视觉
OpenCV-累计概率霍夫变换cv::HoughLinesP
OpenCV-累计概率霍夫变换cv::HoughLinesP
|
8月前
|
算法 数据库 计算机视觉
舌象图片自适应调节——gamma校正算法(五)
舌象图片自适应调节——gamma校正算法(五)
124 0
|
10月前
CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)(二)
CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)(二)
112 0
|
10月前
|
数据采集 运维 数据可视化
CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)(一)
CSI指纹预处理(中值、均值、Hampel、维纳滤波、状态统计滤波器)(一)
264 0