关于阀值 && OSTU算法

photoshop中的解释:阈值”命令将灰度或彩色图像转换为高对比度的黑白图像。可以指定某个色阶作为阈值。所有比阈值亮的像素转换为白色;而所有比阈值暗的像素转换为黑色。“阈值”命令对确定图像的最亮和最暗区域很有用。

如果图像的像素等于阀值时怎么处理呢?

   如果是普通图片,怎么处理都不怎么影响,可当图片是二值化之后的,会怎么样呢?传一张全白的怎么样呢?

   这可能存在的隐形问题如果没考虑到,会有出乎意料的结果。

int otsuThreshold(int *data, int size)//buf里保存的是
{
	int pixelCount[GrayScale];
	float pixelPro[GrayScale];
	int *pdata = data;
	int i, j, pixelSum = size, threshold = 0;

	for(i = 0; i < GrayScale; i++)
	{
		pixelCount[i] = 0;
		pixelPro[i] = 0;
	}

	//统计灰度级中每个像素在整幅图像中的个数

	for(j = 0;j < pixelSum;j++)
	{
		i = *pdata++;
		pixelCount[i]++;
	}

	//计算每个像素在整幅图像中的比例
	for(i = 0; i < GrayScale; i++)
	{
		pixelPro[i] = (float)pixelCount[i] / pixelSum;
	}

	//遍历灰度级[0,255]
	float w0, w1, u0tmp, u1tmp, u0, u1, u,
		deltaTmp, deltaMax = 0;
	for(i = 0; i < GrayScale; i++)
	{
		w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
		for(j = 0; j < GrayScale; j++)
		{
			if(j <= i)   //背景部分
			{
				w0 += pixelPro[j];
				u0tmp += j * pixelPro[j];
			}
			else   //前景部分
			{
				w1 += pixelPro[j];
				u1tmp += j * pixelPro[j];
			}
		}
		u0 = u0tmp / w0;
		u1 = u1tmp / w1;
		u = u0tmp + u1tmp;
		deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);
		if(deltaTmp > deltaMax)
		{
			deltaMax = deltaTmp;
			threshold = i;
		}
	}
	return threshold;
}

  当一个图片背景大部分为白色时,而其图片特征轮廓可能是灰色和黑色分界,对着局部区域取阀值比较可取,如下:

/*-----------------------------------------/
一个图片宽度固定,但仅对x, y区域的求阀值x是从行头开始的宽,y是固定大小的height,这个程序是对图像左半部x求阀值
-----------------------------------------*/
int otsuThreshold(int *data, int x, int y, int width)
{
	int pixelCount[GrayScale];
	float pixelPro[GrayScale];
	int *pdata = data;
	int i, j, pixelSum = x*y, threshold = 0;

	for(i = 0; i < GrayScale; i++)
	{
		pixelCount[i] = 0;
		pixelPro[i] = 0;
	}

	//统计灰度级中每个像素在整幅图像中的个数
	int n;
	for(i = 0; i < y; i++)
	{
		for(j = 0; j < x; j++)
		{
			n = *(pdata + i*width + j);
			pixelCount[n]++;
		}
	}

	//计算每个像素在整幅图像中的比例
	for(i = 0; i < GrayScale; i++)
	{
		pixelPro[i] = (float)pixelCount[i] / pixelSum;
	}

	//遍历灰度级[0,255]
	float w0, w1, u0tmp, u1tmp, u0, u1, u,
		deltaTmp, deltaMax = 0;
	for(i = 0; i < GrayScale; i++)
	{
		w0 = w1 = u0tmp = u1tmp = u0 = u1 = u = deltaTmp = 0;
		for(j = 0; j < GrayScale; j++)
		{
			if(j <= i)   //背景部分
			{
				w0 += pixelPro[j];
				u0tmp += j * pixelPro[j];
			}
			else   //前景部分
			{
				w1 += pixelPro[j];
				u1tmp += j * pixelPro[j];
			}
		}
		u0 = u0tmp / w0;
		u1 = u1tmp / w1;
		u = u0tmp + u1tmp;
		deltaTmp = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);
		if(deltaTmp > deltaMax)
		{
			deltaMax = deltaTmp;
			threshold = i;
		}
	}
	return threshold;
}

  

关于阀值 && OSTU算法

时间: 2024-08-01 12:45:52

关于阀值 && OSTU算法的相关文章

毕业课题---之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);

Ostu算法原理

%使用OTSU算法进行二值化后的图像 close all;clear all;clc %% I = imread('C.jpg'); I=rgb2gray(I); %% I1=im2uint8(I(:)); depth=256; imhist(I1,depth); counts=imhist(I1,depth);%灰度直方图中,横坐标表示像素的灰度级别,纵坐标为像素点的个数 %  imhist(I,n)  计算和显示图像I的直方图,n为指定的灰度级数目,默认为256.如果I是二值图像,那么n仅有

阈值分割算子之OSTU算法

1.原理参考:https://www.cnblogs.com/guopengfei/p/4759569.html 2.公式推导: 3.同halcon的binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold3)算子. 具体推导如下: gray_histo (Region, Image, AbsoluteHisto, RelativeHisto) nAveragray:=0 for Index := 0

用OpenCV实现Otsu算法

一.Otsu算法原理 Otsu算法(大津法或最大类间方差法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找一个合适的灰度级别来划分. 所以可以在二值化的时候采用otsu算法来自动选取阈值进行二值化.otsu算法被认为是图像分割中阈值选取的最佳算法,计算简单,不受图像亮度和对比度的影响.因此,使类间方差最大的分割意味着错分概率最小. 设t为设定的阈值. w0 分开后前景像素点数占图像的比例 u0 分开后前景

OpenCV由汉字生成图片(透明)----可以对抗论文查重!!!

今天听说很多同志们写毕业论文重复率过高的问题,大牛说用图片代替字就行了,我就想用OpenCV实现一下看看能不能搞,果不其然还是可以的!!!主要的难点在于普通格式的图片背景不透明,需要使用背景透明的png格式图片就行. 主要思想和步骤: 1.首先配置好FreeType与OpenCV,添加编译好的lib,与include目录和CvxText.h和CvxText.cpp就行了,参考[1] 2.说一下思路,主要就是OpenCV版本的问题造成有的函数用的IplImage,而函数 //设置原图像文字 tex

大津法阈值法代码

int otsu(IplImage *image) { assert(NULL != image); int width = image->width; int height = image->height; int x=0,y=0; int pixelCount[256]; float pixelPro[256]; int i, j, pixelSum = width * height, threshold = 0; uchar* data = (uchar*)image->image

汉信码在iOS客户端中的应用和遇到的坑

先简单介绍一下的 汉信码,基本上和 QRCode 即二维码 大差不差,可但是,二维码 一般扫描出来是 非中文的字符串(一般为链接),这就是汉信码区别于二维码的地方,汉信码是涵盖中文的,而且是国家自主研发非骗经费项目,虽然没有推广起来但是还是很好用的.其官网为:http://cscode.gs1cn.org/ 简约而不简单的网站,大家可以看一下,在此提供一个样例: 其优点:汉字编码能力超强.极强抗污损.抗畸变识读能力.识读速度快.信息密度高.纠错能力强.图形美观等官方这么说的. 然后,针对不同的平

车牌识别(一)-车牌定位

在对车牌识别过程中,常用的方法有:基于形状.基于色调.基于纹理.基于文字特征等方法.首先基于形状,在车牌中因为车牌为形状规格的矩形,所以目的转化为寻找矩形特征,常常是利用车牌长宽比例特征.占据图像的比例等.基于色调,国内的车牌往往是蓝底白字,可以采用图像的色调或者饱和度特征,进入生成二值图,定位车牌位置.基于纹理特征自己还没有基础到.基于文字特征往往是根据文字轮廓特征进行识别,原理是基于相邻文字轮廓特征.比例进行定位车牌位置. 一.图像二值化 正如前面文章所言,首先进行获取图像二值化特征,本文采

Mahout 模糊kmeans

Mahout  模糊KMeans 一.算法流程 模糊 C 均值聚类(FCM),即众所周知的模糊 ISODATA,是用隶属度确定每一个数据点属于某个聚类的程度的一种聚类算法.1973 年,Bezdek 提出了该算法,作为早期硬 C 均值聚类(HCM)方法的一种改进. FCM 把 n 个向量 xi(i=1,2,...,n)分为 c 个模糊组,并求每组的聚类中心,使得非相似性指标的价值函数达到最小. FCM 使得每一个给定数据点用值在 0,1 间的隶属度来确定其属于各个组的程度.与引入模糊划分相适应,