#include <iostream.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <windows.h>
//#define Struct_size 11
//int flag_color;
int hei;
int wid;
void otsu(IplImage* A, IplImage* B)
{
long N = hei * wid;
int h[256];
double p[256],u[256],w[256];
for(int i = 0; i < 256; i++)
{
h[i] = 0;
p[i] = 0;
u[i] = 0;
w[i] = 0;
}
for(i = 0; i < hei; i++)
{
for(int j = 0; j < wid; j++)
{
for(int k = 0; k < 256; k++)
{
if(((uchar*)(A->imageData + A->widthStep*i))[j] == k)
{
h[k]++;
}
}
}
}
for(i = 0; i < 256; i++)
p[i] = h[i] / double(N);
int T = 0;
double uT,thegma2fang;
double thegma2fang_max = -10000;
for(int k = 0; k < 256; k++)
{
uT = 0;
for(i = 0; i <= k; i++)
{
u[k] += i*p[i];
w[k] += p[i];
}
for(i = 0; i < 256; i++)
uT += i*p[i];
thegma2fang = (uT*w[k] - u[k])*(uT*w[k] - u[k]) / (w[k]*(1-w[k]));
if(thegma2fang > thegma2fang_max)
{
thegma2fang_max = thegma2fang;
T = k;
}
}
for(i = 0; i < hei; i++)
{
for(int j = 0; j < wid; j++)
{
if(((uchar*)(A->imageData + A->widthStep*i))[j] > T)
((uchar*)(B->imageData + B->widthStep*i))[j] = 255;
else
((uchar*)(B->imageData + B->widthStep*i))[j] = 0;
}
}
}
int main(int argc, char** argv)
{
const char* filename = argc >= 2 ? argv[1] : "D:\\lean.bmp";
IplImage* InPut = cvLoadImage( filename, 0 );
IplImage *OutPut = cvCreateImage(cvSize(InPut->width,InPut->height),IPL_DEPTH_8U,1);
hei = InPut->height;
wid = InPut->width;
otsu(InPut,OutPut);
cvNamedWindow( "Resource", 1 );
cvShowImage( "Resource", InPut );
cvNamedWindow( "Result", 1 );
cvShowImage( "Result", OutPut );
cvWaitKey(0);
return 0;
}
离散傅里叶变换(DFT)opencv和vc代码实现
4星 · 超过85%的资源 需积分: 50 189 浏览量
2011-12-06
19:16:31
上传
评论 1
收藏 2.13MB RAR 举报
dididadabit
- 粉丝: 4
- 资源: 11
- 1
- 2
- 3
前往页