// erzhihua.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <math.h>
#include <cxcore.h>
#include <cv.h>
#include "highgui.h"
#include <iostream>
using namespace std;
int Multi_threshold(IplImage *src) ;
IplImage* ImageBinarization(IplImage* img);
//IplImage* zhijian(IplImage*I,IplImage*Iin)
//{
// IplImage *W=Iin;
// int th=Multi_threshold(I);
// IplImage *mask=ImageBinarization(I);
//
// //[th mask]=Multi_threshold(I);
// int m=I->height;
// int n=I->width;
// for (int i=0;i<m;i++)
// {
// for(int j=0;j<n;j++)
// if (cvGetReal2D(I,i,j)>th)
// cvSetReal2D(W,i,j,cvGetReal2D(I,i,j));
// }
// return W;
//}
int Multi_threshold(IplImage *src) //求阈值
{ /*对灰度图像二值化,自适应门限threshold*/
int i,j,width,height,step,chanel,threshold;
/*size是图像尺寸,svg是灰度直方图均值,va是方差*/
float size,avg,va,maxVa,p,a,s;
unsigned char *dataSrc;
float histogram[256];
double value1,min1,min2;
int n1,n2;
double max1=0;
int index1=0;
double max2=0;
int index2=0;
width = src->width;
height = src->height;
dataSrc = (unsigned char *)src->imageData;
step = src->widthStep/sizeof(char);
chanel = src->nChannels;
/*计算直方图并归一化histogram*/
for(i=0; i<256; i++)
histogram[i] = 0;
for(i=0; i<height; i++)
{
for(j=0; j<width*chanel; j++)
{
histogram[dataSrc[i*step+j]-'0'+48]++; //需看懂这一行,么意思?应该是进行统计,但“+48”是什么意思,如果是彩色图像怎么处理的呢?
}
}
size = width * height;
for(i=0; i<256; i++)
histogram[i] /=size;//这一行的作用是归一化
/***********第一个循环求第一个直方图峰值***********/
for (i=0; i<255; i++)
{
if (max1<=histogram[i])
{
if ((histogram[i+1]-histogram[i])<0)
{
if (i==0)//处理第一个峰值在索引为0时的情况
{
max1=histogram[i];
index1=i;
}
else if((histogram[i]-histogram[i-1])>0)
{
max1=histogram[i];
index1=i;
}
}
}
}
/***********第二个循环求第二个直方图峰值***********/
for (i=1; i<255; i++)
{
if (max2<=histogram[i])
{
if((histogram[i+1]-histogram[i])<0)
{
if ((histogram[i]-histogram[i-1])>0)
{
if (i!=index1)//如果第二个峰值不等于第一个峰值,就赋值给max2及index2
{
max2=histogram[i];
index2=i;
}
}
}
}
}
n1=min(index1,index2);//n1是记录两个峰值中较小的索引,n2记录两个峰值中较大的索引
n2=max(index1,index2);
min1=1000;
value1=0;
for(i=n1;i<n2+1;i++)
{
if (min1>=histogram[i])
{
if((histogram[i+1]-histogram[i])>=0)
{
if ((histogram[i]-histogram[i-1])<=0)
{
min1=histogram[i];
value1=i;
}
}
}
}
threshold=value1;
return threshold;
}
IplImage* ImageBinarization(IplImage* img)//二值化
{
IplImage* biimg = cvCreateImage(cvGetSize(img),img->depth,img->nChannels);
CvScalar s;
int i,j,sum=0;
int t=Multi_threshold(img);
for (i=0;i<img->height;i++)
{
for (j=0;j<img->width;j++)
{
s = cvGet2D(img,i,j);
sum = (s.val[0]+s.val[1]+s.val[2])/3;
if (sum >t)
{
s.val[0]=s.val[1]=s.val[2]=0;
cvSet2D(img,i,j,s);
}
else
{
s.val[0]=s.val[1]=s.val[2]=255;
cvSet2D(img,i,j,s);
}
}
}
cvCopy(img,biimg);
cvReleaseImage(&img);
return biimg;
}
int _tmain(int argc, _TCHAR* argv[])
{
IplImage* img = cvLoadImage("C:\\E\\13110862186.jpg",1);
int t=Multi_threshold(img);
cout<<t<<endl; //显示阈值
IplImage *biimg=ImageBinarization(img);
cvNamedWindow("imagebinary");
cvShowImage("imagebinary",biimg);
cvWaitKey(0);
cvDestroyWindow("imagebinary");
cvReleaseImage(&biimg);
return 0;
}
erzhihua.rar_opencv二值化
版权申诉
168 浏览量
2022-09-23
01:22:06
上传
评论
收藏 2KB RAR 举报
御道御小黑
- 粉丝: 58
- 资源: 1万+
最新资源
- ### 词向量的介绍、使用技巧和优缺点的文章
- 基于STM32F103CBT6单片机GC65+MP2625+CC1101 GPSTrack模块板硬件(原理图+PCB)工程文件
- ### 通道处理过程模拟概念、优缺点和使用技巧
- ### MyBatis动态SQL介绍说明、使用技巧和优缺点
- 上传下载仿163网盘无刷新文件上传 for Jsp-fileupload-jsp.rar
- VMware Workstation业界非常稳定且安全的桌面虚拟机软件-计算机上运行多个操作系统,支持Windows、DOS等
- 基于STM8L101F3P6单片机+LY2508A33P+CC1100遥控器硬件(原理图+PCB)工程文件.zip
- 上传下载WAP图铃下载系统-unimg.rar
- YTX-0.1.0-Win
- 上传下载ExtJS 2.2 开源网络硬盘系统-dogdisk.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈