毕业课题---之ostu算法二值化

二值化ostu算法:

#include "stdafx.h"

#include <stdio.h>

#include <cv.h>

#include <highgui.h>

#include <math.h>

int Otsu(IplImage* src);

int _tmain(int argc, _TCHAR* argv[])

{

IplImage* img = cvLoadImage("Lena.jpg",0);

IplImage* dst = cvCreateImage(cvGetSize(img), 8, 1);

int threshold = Otsu(img);

cvThreshold(img, dst, threshold, 255, CV_THRESH_BINARY);

cvNamedWindow( "img", 1 );

cvShowImage("img", dst);

cvWaitKey(-1);

cvReleaseImage(&img);

cvReleaseImage(&dst);

cvDestroyWindow( "dst" );

return 0;

}

int Otsu(IplImage* src)

{

int height=src->height;

int width=src->width;

long size = height * width;

//histogram

float histogram[256] = {0};

for(int m=0; m < height; m++)

{

unsigned char* p=(unsigned char*)src->imageData + src->widthStep * m;

for(int n = 0; n < width; n++)

{

histogram[int(*p++)]++;

}

}

int threshold;

long sum0 = 0, sum1 = 0; //存储前景的灰度总和和背景灰度总和

long cnt0 = 0, cnt1 = 0; //前景的总个数和背景的总个数

double w0 = 0, w1 = 0; //前景和背景所占整幅图像的比例

double u0 = 0, u1 = 0;  //前景和背景的平均灰度

double variance = 0; //最大类间方差

int i, j;

double u = 0;

double maxVariance = 0;

for(i = 1; i < 256; i++) //一次遍历每个像素

{

sum0 = 0;

sum1 = 0;

cnt0 = 0;

cnt1 = 0;

w0 = 0;

w1 = 0;

for(j = 0; j < i; j++)

{

cnt0 += histogram[j];

sum0 += j * histogram[j];

}

u0 = (double)sum0 /  cnt0;

w0 = (double)cnt0 / size;

for(j = i ; j <= 255; j++)

{

cnt1 += histogram[j];

sum1 += j * histogram[j];

}

u1 = (double)sum1 / cnt1;

w1 = 1 - w0; // (double)cnt1 / size;

u = u0 * w0 + u1 * w1; //图像的平均灰度

printf("u = %f\n", u);

//variance =  w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);

variance =  w0 * w1 *  (u0 - u1) * (u0 - u1);

if(variance > maxVariance)

{

maxVariance = variance;

threshold = i;

}

}

printf("threshold = %d\n", threshold);

return threshold;

}

时间: 2024-10-08 09:55:06

毕业课题---之ostu算法二值化的相关文章

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果(转)

十三种基于直方图的图像全局二值化算法原理.实现.代码及效果(转) http://www.cnblogs.com/carekee/articles/3643394.html 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在这些庞大的分

图像基本变换---图像二值化(包含OSTU/迭代法/统计法/双峰法/P分位法/最大熵法)

OSTU法图像二值化 [算法说明] Ostu法又叫做最大类间方差法,是一种常用的图像分割算法.基本算法思想是根据初始阈值把图像分为两类,然后计算两类之间的方差,更新阈值,重新计算类间方差,当满足类间方差最大时的阈值,即为所求最佳阈值,具体过程如下: 1,初始化一阈值Th,将图像f(x,y)分为A,B两类: 2,分别计算A,B两类像素集合的均值ua和ub,公式如下: 其中,Na和Nb分别表示集合A,B中的像素个数. 3,计算A,B两类的类间方差,公式如下: 4,将Th从0到255循环,分别计算A,

图像处理之积分图应用四(基于局部均值的图像二值化算法)

图像处理之积分图应用四(基于局部均值的图像二值化算法) 基本原理 均值法,选择的阈值是局部范围内像素的灰度均值(gray mean),该方法的一个变种是用常量C减去均值Mean,然后根据均值实现如下操作: pixel = (pixel > (mean - c)) ? object : background 其中默认情况下参数C取值为0.object表示前景像素,background表示背景像素. 实现步骤 1. 彩色图像转灰度图像 2. 获取灰度图像的像素数据,预计算积分图 3. 根据输入的参数

基于直方图的图像二值化算法实现

引言 图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析.特征提取与模式识别之前的必要的图像预处理过程.在过去年里受到国内外学者的广泛关注,产生了数以百计的阈值选取方法,但如同其他图像分割算法一样,没有一个现有方法对各种各样的图像都能得到令人满意的结果. 在分类方法中,基于直方图的全局二值算法都从不同的科学层次提出了各自的实施方案,并且这类方法都有着一些共同的特点:简单.算法容易实现和执行速度快. 算法代码 第一种方法Huang L.-K et al.参考代

图像处理——灰度化、二值化、膨胀算法、腐蚀算法以及开运算和闭运算

一.RGB RGB色彩模式使用RGB模型为图像中每个像素的RGB分量分配一个0~255范围内的强度值.RGB图像仅仅使用三种颜色,R(red).G(green).B(blue),就能够使它们依照不同的比例混合,在屏幕上呈现16777216(256 * 256 * 256)种颜色. 在电脑中,RGB的所谓"多少"就是指亮度,并使用整数来表示.通常情况下,RGB各有256级亮度,用数字表示为从0.1.2...直到255. 二.ARGB 一种色彩模式,也就是RGB色彩模式附加上Alpha(透

【华为云技术分享】灰度图二值化算法

[摘要] 目前最常用的快速二值化阈值确定方法为根据每一张目标图像来动态的计算平均灰度值.然后将灰度图像中的每个像素灰度值和此平均阈值作对比,高于平均阈值的记为“1”(白色),低于的则设置为“0”(黑色).这种方法虽然会让造成部分背景像素点丢失,但却是最简单高效的处理方法. 灰度图片中都可以用一个具体的灰度值Grav来量化每一个像素点.考虑到实际识别的二值特征,为了让被处理目标答题卡更加简单,计算量更少,速度更快,我们可以直接对灰度图片进行二值化处理. 图像二值化简单来说就是讲整个灰度图片的目标像

[iOS OpenCV的使用,灰度和二值化]

看网上方法很多,但版本都不够新,我看了网上一些知识,总结了下,来个最新版Xcode6.1的. 最近主要想做iOS端的车牌识别,所以开始了解OpenCV.有兴趣的可以跟我交流下哈. 一.Opencv的使用: 步骤: 1.从官网下载iOS版本的Opencv2.framework. 2.拖进工程,选择copy items if needed 3.进入building settings,设置Framework SearchPath: 设置成$(PROJECT_DIR)/Newtest,这个Newtest

[转载+原创]Emgu CV on C# (四) —— Emgu CV on 二值化

重点介绍了二值化原理及数学实现,并利用emgucv方法编程实现. 一.理论概述(转载,如果懂图像处理,可以略过,仅用作科普,或者写文章凑字数)  1.概述 图像二值化是图像处理中的一项基本技术,也是很多图像处理技术的预处理过程. 图像的预处理在进行图像二值化操作前要对图像进行预处理,包括彩色图像灰化和增强.由于选取阈值需要参照直方图,因此在图像进行处理后,我们再获取图像的直方图以帮助选取阈值.整个流程如下所示: 读取图像→灰度图像→图像增强→图像直方图→二值化处理 2.数学原理(转载,基本可以不

[转载+原创]Emgu CV on C# (五) —— Emgu CV on 局部自适应阈值二值化

局部自适应阈值二值化 相对全局阈值二值化,自然就有局部自适应阈值二值化,本文利用Emgu CV实现局部自适应阈值二值化算法,并通过调节block大小,实现图像的边缘检测. 一.理论概述(转载自<OpenCV_基于局部自适应阈值的图像二值化>) 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的.亮度较高的图像区域的二值化阈值通常会较高,而亮度较低的图像区域的二值化阈值则会相适