图像处理——大律法

转载请注明出处和作者,谢谢合作!!!


这个是自己很久之前写的一个大律法的过程,使用了opencv作为图像的输入和输出框架,话不多说了,直接上代码:

参数含义:

int otsu(unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv);
image图像数据区,rows行,cols列,x0和y0表示像素起始点位置,dx和dy表示要处理的像素的结束点位置,vvv表示是否输出中间计算结果

//工程添加的库文件cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib

#include "cv.h"
#include "highgui.h"
#include 
#include 
using namespace std;

int otsu(unsigned char *image, int rows, int cols, int x0, int y0, int dx, int dy, int vvv);

int main(int argc,char**argv)
{
	IplImage *srcImg = cvLoadImage(argv[1],CV_LOAD_IMAGE_GRAYSCALE);
	int width_img = srcImg->width;
	int height_img = srcImg->height;
	int channels_img = srcImg->nChannels;
	int step = srcImg->widthStep/sizeof(uchar);//得到图像的数据
	uchar * srcImgData = (uchar*)srcImg->imageData;//强制类型转换
	int num;//作为处理以后的输出参数

	num=otsu(srcImgData,height_img,width_img, 0, 0, height_img, width_img, 0);//调用函数
	
 	IplImage *srcImg_org = cvLoadImage(argv[1],CV_LOAD_IMAGE_COLOR);
 	cout<<"the orginal image"<=num)
			{
				srcImgData[i*step + j]=255;
			} 
			else
			{
				srcImgData[i*step + j]=0;
			}
		}
		cout<<"transform done,limit choose:"< gmax) gmax=*np;
			if(*np < gmin) gmin=*np;
			np++; 
		}
	}
	
	// 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) 
	{
		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;
		}
	}

	if ( vvv & 1 )
		fprintf(stderr,"# OTSU: thresholdValue = %d gmin=%d gmax=%d\n",
		thresholdValue, gmin, gmax);
	
	return(thresholdValue);
}

然后附上测试图像:

原始灰度图像


转换为二值化图像


有任何的问题欢迎留言,谢谢您的支持!

你可能感兴趣的:(opencv与图像算法)