otsu 百科内容来自于: 百度百科

大津市(Otsu)

幕府时代的经济港市。1880年大津至京都铁道通车。
1998年设市。近江神宫、古寺院以及琵琶湖风景区为游览胜地。 工业比较发达,2008年共有工业企业565个,工业总产值合人民币26亿3400百万元。在全市20多种工业企业中,电器、机械加工、食品加工最为发达;其次是纤维制品、木器家具和化工产品;另外,服装加工业也占相当比例。古近江国政治中心。水陆交通要地,扼京都的咽喉,有“小大阪”之称。二十世纪二十年代人造丝生产曾居全国前列。现电机工业占主要地位,其他为机械、化学、纺织(棉、化纤)工业等。[1]大津市的农业则与工业发展相反,正在逐步缩小。农户、农业劳动者和耕地面积较前都有很大减少。1980年农户仅有4702户,耕地面积238,222公亩,农业劳动者18138人,主要农作物是水稻、小麦。大津市的商业服务业正在逐年增加,1982年有商业网点4797个,从业人数为20,016名。

旅游

大津市位于日本名胜“琵琶湖”的南端,以游览胜地闻名日本。风景秀丽的“琵琶湖”是大津市的象征和骄傲。旅行游览,观光事业比较发达,有近江八景,城市公园和 大津
绿地寺庙等自然景观遍及全市各个角落,旅游饭店、餐馆环绕琵琶湖形成一个览胜、观光、荡湖的整体,为日本各地及外国游人所想往,每年接待客人近几万人。

气候

平均气温14.7度,最高温度25.4度,最低温度3.6度,年降雨量14.935mm。

教学

大津市的文教卫生:有国立、私立大学3所,高中12所,中学15所,小学29所,幼儿园40所。此外,还有教学研究所、科学馆、市民会馆和中心图书馆。设有医院15所,诊疗所249个,是日本第一个对全体乳幼儿保健诊疗市。

环境

大津市的公用事业比较完善,截至2008年,有公园76个,其中包括绿地和儿童游览地,面积118.28公顷。对垃圾处理实行与市民合作减量化、分类化、再资源化的措施,建有环卫中心、净化中心、燃化工厂和不燃物处理场。

交通

乘坐JR东海道新干线从东京站到京都站乐2小时15分。乘坐JR东海道本线从京都站到大津站约9分钟。乘坐JR东海道本线快速从新大阪站到大津站约40分钟。

外交

素有“水都”之称的牡丹江市境内因有一个与大津市“琵琶湖”外形相似的“镜泊湖”而与大津市结缘,双方为建立友好关系进行了互访,于1984年12月3日正式签订了缔结友好城市协议。

算法

OTSU算法(大律法或最大类间方差法)
一、Otsu最大类间方差法原理
利用阈值将原图像分成前景,背景两个图象。
前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度
后景:用n2, sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度
当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准,而在otsu算法中这个衡量差别的标准就是最大类间方差(英文简称otsu,这也就是这个算法名字的来源),在本程序中类间方差用sb表示,最大类间方差用fmax
关于最大类间方差法(otsu)的性能:
类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。
当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。
最大类间方差法(otsu)的公式推导:
记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。
则图像的总平均灰度为:u=w0*u0+w1*u1。
前景和背景图象的方差:g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1)*(u0-u1),此公式为方差公式。
可参照概率论课本上面的g的公式也就是下面程序中的sb的表达式。当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度t是最佳阈值sb = w0*w1*(u1-u0)*(u0-u1)
算法实现1:
unsafe public int GetThreshValue(Bitmap image)
{
BitmapData bd = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.WriteOnly, image.PixelFormat);
byte* pt = (byte*)bd.Scan0;
int[] pixelNum = new int[256]; //图象直方图,共256个点
byte color;
byte* pline;
int n, n1, n2;
int total; //total为总和,累计值
double m1, m2, sum, csum, fmax, sb; //sb为类间方差,fmax存储最大方差值
int k, t, q;
int threshValue = 1; // 阈值
int step = 1;
switch (image.PixelFormat)
{
case PixelFormat.Format24bppRgb:
step = 3;
break;
case PixelFormat.Format32bppArgb:
step = 4;
break;
case PixelFormat.Format8bppIndexed:
step = 1;
break;
}
//生成直方图
for (int i = 0; i < image.Height; i++)
{
pline = pt + i * bd.Stride;
for (int j = 0; j < image.Width; j++)
{
color = *(pline + j * step); //返回各个点的颜色,以RGB表示
pixelNum[color]++; //相应的直方图加1
}
}
//直方图平滑化
for (k = 0; k <= 255; k++)
{
total = 0;
for (t = -2; t <= 2; t++) //与附近2个灰度做平滑化,t值应取较小的值
{
q = k + t;
if (q < 0) //越界处理
q = 0;
if (q > 255)
q = 255;
total = total + pixelNum[q]; //total为总和,累计值
}
//平滑化,左边2个+中间1个+右边2个灰度,共5个,所以总和除以5,后面加0.5是用修正值
pixelNum[k] = (int)((float)total / 5.0 + 0.5);
}
//求阈值
sum = csum = 0.0;
n = 0;
//计算总的图象的点数和质量矩,为后面的计算做准备
for (k = 0; k <= 255; k++)
{
//x*f(x)质量矩,也就是每个灰度的值乘以其点数(归一化后为概率),sum为其总和
sum += (double)k * (double)pixelNum[k];
n += pixelNum[k]; //n为图象总的点数,归一化后就是累积概率
}
fmax = -1.0; //类间方差sb不可能为负,所以fmax初始值为-1不影响计算的进行
n1 = 0;
for (k = 0; k < 255; k++) //对每个灰度(从0到255)计算一次分割后的类间方差sb
{
n1 += pixelNum[k]; //n1为在当前阈值遍前景图象的点数
if (n1 == 0) { continue; } //没有分出前景后景
n2 = n - n1; //n2为背景图象的点数
//n2为0表示全部都是后景图象,与n1=0情况类似,之后的遍历不可能使前景点数增加,所以此时可以退出循环
if (n2 == 0) { break; }
csum += (double)k * pixelNum[k]; //前景的“灰度的值*其点数”的总和
m1 = csum / n1; //m1为前景的平均灰度
m2 = (sum - csum) / n2; //m2为背景的平均灰度
sb = (double)n1 * (double)n2 * (m1 - m2) * (m1 - m2); //sb为类间方差
if (sb > fmax) //如果算出的类间方差大于前一次算出的类间方差
{
fmax = sb; //fmax始终为最大类间方差(otsu)
threshValue = k; //取最大类间方差时对应的灰度的k就是最佳阈值
}
}
image.UnlockBits(bd);
image.Dispose();
return threshValue;
}
算法实现2:
Otsu算法步骤如下:
设图象包含L个灰度级(0,1…,L-1),灰度值为i的的象素点数为Ni ,图象总的象素点数为N=N0+N1+...+N(L-1)。灰度值为i的点的概率为:P(i) = N(i)/N.
门限t将整幅图象分为暗区c1和亮区c2两类,则类间方差σ是t的函数:σ=a1*a2(u1-u2)^2 (2)
式中,aj 为类cj的面积与图象总面积之比,a1=sum(P(i)) i->t, a2 = 1-a1;
uj为类cj的均值,u1 = sum(i*P(i))/a1 0->t, u2 = sum(i*P(i))/a2, t+1->L-1,该法选择最佳门限t^使类间方差最大,即:令Δu=u1-u2,σb = max{a1(t)*a2(t)Δu^2}
代码实现:
int otsu (IplImage *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv)
{
unsigned char *np; // 图像指针
int thresholdValue=1; // 阈值
int ihist[256]; // 图像直方图,256个点
int i, j, k; // various counters
int n, n1, n2, gmin, gmax;
double m1, m2, sum, csum, fmax, sb;
// 对直方图置零
memset(ihist, 0, sizeof(ihist));
gmin=255; gmax=0;
// 生成直方图
/*
for (i = y0 + 1; i < y0 + dy - 1; i++)
{
np = &image[i*cols+x0+1];
for (j = x0 + 1; j < x0 + dx - 1; j++)
{
ihist[*np]++;
if(*np > gmax) gmax=*np;
if(*np < gmin) gmin=*np;
np++; /* next pixel
}
}*/
for(j=y0;j<dy;j++)
{
for(i=0;i<dx;i++)
{
unsigned char temp=CV_IMAGE_ELEM(image,uchar,j,i);
ihist[temp]++;
}
}
// set up everything
sum = csum = 0.0;
n = 0;
for (k = 0; k <= 255; k++)
{
sum += (double) k * (double) ihist[k]; // x*f(x) 质量矩
n += ihist[k]; //f(x) 质量
}
if (!n)
{
// if n has no value, there is problems
fprintf (stderr, "NOT NORMAL thresholdValue = 160\n");
return (160);
}
// do the otsu global thresholding method
fmax = -1.0;
n1 = 0;
for (k = 0; k < 255; k++)
{
n1 += ihist[k];
if (!n1) { continue; }
n2 = n - n1;
if (n2 == 0) { break; }
csum += (double) k *ihist[k];
m1 = csum / n1;
m2 = (sum - csum) / n2;
sb = (double) n1 *(double) n2 *(m1 - m2) * (m1 - m2);
/**//* bbg: note: can be optimized. */
if (sb > fmax) {
fmax = sb;
thresholdValue = k;
}
}
// at this point we have our thresholding value,debug code to display thresholding values
if ( vvv & 1 )
fprintf(stderr,"# OTSU: thresholdValue = %d gmin=%d gmax=%d\n",thresholdValue, gmin, gmax);
return(thresholdValue);
}
$firstVoiceSent
- 来自原声例句
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定
小调查
请问您想要如何调整此模块?

感谢您的反馈,我们会尽快进行适当修改!
进来说说原因吧 确定