OSTU定点化

原创 2015年07月10日 11:37:01
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;
typedef long long ll;
typedef long long tp;
int postu(IplImage *src); //定点化,没考虑图像大小,没有对变量范围考虑,统一使用long long格式
int ddostuBigImage(IplImage *src);//图像大小为1000*1000以上时使用
int ddostuSmallImage(IplImage *src);//图像大小为100*100以下时使用

#include "stdafx.h"
#include "dingdian.h"
int ddostuSmallImage(IplImage *src)
{
	int height=src->height;    
	int width=src->width;   
	uchar histogram[256]={0};
	uchar * p;
	for ( int i=0; i<height; ++i )
	{
		p=(unsigned char*)src->imageData + src->widthStep * i; 
		for ( int j=0; j<width; ++j )
		{
			histogram[*p++]++;  
		}
	}

	short size = height * width;
	int avgValue = 0;    
	for(int i=0; i < 256; i++)  
	{    
		avgValue += i * histogram[i];  //整幅图像的平均灰度  
	}  
	int threshold=0;      
	int maxVariance = 0;    
	int w = 0;
	int u = 0;  

	for(int i = 0; i < 256; i++)   
	{    
		w += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例  
		u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值  
		unsigned short t = avgValue * w/size - u; 
		unsigned short variance = (t * t)/((long long)w*(size-w)+1);
		if(variance > maxVariance)   
		{    
			maxVariance = variance;    
			threshold = i;    
		} 
	}    
	return threshold; 
}
int ddostuBigImage(IplImage *src)
{
	int height=src->height;    
	int width=src->width;   
	short histogram[256]={0};
	uchar * p;
	for ( int i=0; i<height; ++i )
	{
		p=(unsigned char*)src->imageData + src->widthStep * i; 
		for ( int j=0; j<width; ++j )
		{
			histogram[*p++]++;  
		}
	}

	int size = height * width;
	int avgValue = 0;    
	for(int i=0; i < 256; i++)  
	{    
		avgValue += i * histogram[i];  //整幅图像的平均灰度  
	}  
	
	int threshold=0;      
	int maxVariance = 0;    
	int w = 0;
	int u = 0;  
	for(int i = 0; i < 256; i++)   
	{    
		w += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例  
		u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值  
		long long t = (long long)avgValue * w/size - u; 
		int variance = (t * t)/((long long)w*(size-w)+1);
		//cout<<variance<<" ";
		if(variance > maxVariance)   
		{    
			maxVariance = variance;    
			threshold = i;    
		} 
				//cout<<threshold<<" ";
	}    
	return threshold; 
}
int postu(IplImage *src)
{
	int height=src->height;    
	int width=src->width;        

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

	//normalize histogram    
	tp size = height * width;    

	/*	for(int i = 0; i < 256; i++)  
	{    
	histogram[i] = histogram[i] / size;    
	} */   

	//average pixel value    
	tp avgValue = 0;    
	for(int i=0; i < 256; i++)  
	{    
		avgValue += i * histogram[i];  //整幅图像的平均灰度  
	}     
	int threshold=0;      
	tp maxVariance = 0;    
	tp w = 0, u = 0;    
	for(int i = 0; i < 256; i++)   
	{    
		w += histogram[i];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例  
		u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值  
		tp t = avgValue * w/size - u;  
		//float  variance = (t * t) / (float)(w * (size - w)); 
		tp variance = (t * t)/(w*(size-w)+1);
		//cout<<variance<<endl;
		//system("pause");
		//float variance = (t*t*size*size)/(w*(size-w)*size)+0.5;
		if(variance > maxVariance)   
		{    
			maxVariance = variance;    
			threshold = i;    
		}  
		//cout<<threshold<<" ";
	}    
	return threshold;    
}
 
<pre class="cpp" name="code">// opencv300.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "opencv2/core/utility.hpp"
#include "opencv2/core/ocl.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/videoio/videoio.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>
#include <cctype>
using namespace cv;
using namespace std;
#include "dingdian.h"

int Otsu(IplImage* src)    
{    
	int height=src->height;    
	int width=src->width;        

	//histogram    
	float histogram[256] = {0}; 
	unsigned char* p;
	for(int i=0; i < height; i++)  
	{    
		 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];  //假设当前灰度i为阈值, 0~i 灰度的像素(假设像素值在此范围的像素叫做前景像素) 所占整幅图像的比例  
		u += i * histogram[i];  // 灰度i 之前的像素(0~i)的平均灰度值: 前景像素的平均灰度值  

		float t = avgValue * w - u;  
		/*cout<<t*size<<endl;
		cout<<w*size<<endl;
		system("pause");*/
		float variance = t * t / (w * (1 - w)+0.00001); 
		//float variance = (t*t*size*size)/(w*(size-w)*size)+0.5;
		if(variance > maxVariance)   
		{    
			maxVariance = variance;    
			threshold = i;    
		}  
		//cout<<variance<<" ";
		//system("pause");
	}    
	return threshold;    
}   


int main(int argc, const char ** argv)
{
	Mat img = imread("C:\\test3\\1\\5.jpg");
	double t = (double)getTickCount();
	int thres = Otsu(&IplImage(img));
	t = ((double)getTickCount() - t)*1000/getTickFrequency();
	cout<<thres<<endl;
	cout<<"浮点 "<<t<<endl;

	t = (double)getTickCount();
	int thres2 = postu(&IplImage(img));
	t = ((double)getTickCount() - t)*1000/getTickFrequency();
	cout<<thres2<<endl;
	cout<<"修改 "<<t<<endl;

	t = (double)getTickCount();
	int thres3 = ddostuBigImage(&IplImage(img));
	t = ((double)getTickCount() - t)*1000/getTickFrequency();
	cout<<thres3<<endl;
	cout<<"大图 "<<t<<endl;

	t = (double)getTickCount();
	int thres4 = ddostuSmallImage(&IplImage(img));
	t = ((double)getTickCount() - t)*1000/getTickFrequency();
	cout<<thres4<<endl;
	cout<<"小图 "<<t<<endl;

	/*UMat uimg = img.getUMat(ACCESS_READ);
	int thres1 = Uotsu(uimg);
	cout<<thres1<<endl;*/
	cin>>thres;
	//int thres=Otsu(&IplImage(binaryImage))+10;
	//threshold(binaryImage,binaryImage,thres,255,1);

}



算法定点化

1.提出问题:精度和动态范围之间的矛盾 2.解决方法:范围 1).除法转换为乘法或者移位运算 2).查表计算 3).级数展开,2和3一般针对复杂的数学公式 4).分子分母同时变化 3....
  • hbzxhjb
  • hbzxhjb
  • 2013年09月13日 22:09
  • 2852

浮点数的定点化

FPGA(一般只能处理定点数):浮点数的定点化浮点数例子 : 2.918 12.918 3.1415926转成定点数要定义小数需求多少位,整数需求多少位例:16位的定点数(MAX:16’d3...
  • Augus_Per
  • Augus_Per
  • 2016年10月02日 20:07
  • 4085

定点化的基本原理

CPU有三种可能的浮点数处理方式 Use float instructions if your CPU has a FPU. (fast) Have your compiler translate f...
  • ffmpeg4976
  • ffmpeg4976
  • 2017年01月12日 09:51
  • 2405

嵌入式编程中,你应该知道的定点化知识

据AccelChip 公司所做的一次调查显示,53% 的回答者认为浮点定点转换是在FPGA上实现算法时最困难的地方。...
  • longxuekun1992
  • longxuekun1992
  • 2016年10月22日 22:05
  • 2735

定点化

原文地址:http://www.cnblogs.com/huaping-audio/archive/2010/07/30/1788753.html 十六 提高专业技能之 “Codec定点化” ...
  • yazhouren
  • yazhouren
  • 2014年02月08日 16:38
  • 1624

编写高效代码(4) 在精度允许的条件下,将浮点数定点化

浮点指令要比定点指令慢很多,功耗也大很多,在精度要求不那么高的情况下,就可以将浮点数定点化,用定点指令来代替浮点指令,一个典型的例子就是alpha混合。         《反恐精英》是很多人非常喜欢...
  • chenchong_219
  • chenchong_219
  • 2015年03月27日 21:10
  • 844

DSP程序开发与优化经验之四:浮点仿真转化为定点化DSP程序

算法 MATLAB浮点仿真 MATLAB定点仿真 DSP定点化实现
  • leegang12
  • leegang12
  • 2014年02月16日 18:20
  • 1158

FPGA基础知识17(Matlab中滤波器的定点化 浮点运算转换为定点运算)

需求说明:IC设计基础 内容       :浮点运算定点化处理 来自       :时间的诗 原文:http://blog.csdn.net/mccrocodile/article/de...
  • Times_poem
  • Times_poem
  • 2016年07月09日 15:23
  • 2714

连载:编写高效代码(10) 在精度允许的条件下,将浮点数定点化

浮点指令要比定点指令慢很多,功耗也大很多,在精度要求不那么高的情况下,就可以将浮点数定点化,用定点指令来代替浮点指令,一个典型的例子就是alpha混合。         《反恐精英》是很多人非常喜欢...
  • muxiqingyang
  • muxiqingyang
  • 2011年12月08日 19:58
  • 4514

关于深度学习移动化的思考

一、   深度学习现状的瓶颈: 1、 计算量巨大,消耗大量的计算资源 2、 模型内存占用大,消耗大量内存资源 3、 模型存储空间大,消耗大量存储空间 4、 只能在云端利用其大量的资源进行模型训练 5...
  • ChenVast
  • ChenVast
  • 2017年12月07日 09:40
  • 581
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:OSTU定点化
举报原因:
原因补充:

(最多只允许输入30个字)