opencv 学习之 阈值化<1> 单一阈值

前端之家收集整理的这篇文章主要介绍了opencv 学习之 阈值化<1> 单一阈值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

先介绍几个函数

1、图像融合

void cvAddWeighted( const CvArr* src1,double alpha,const CvArr* src2,double beta,double gamma,CvArr* dst );

src1 :第一个原数组.

alpha :第一个数组元素的权值

src2 :第二个原数组

beta :第二个数组元素的权值

dst :输出数组

gamma :添加的常数项

函数 cvAddWeighted 计算两数组的加权值的和:

dst(I)=src1(I)*alpha+src2(I)*beta+gamma

所有的数组必须的相同的类型相同的大小(或ROI大小)


2、阈值操作

void cvThreshold( const CvArr* src,CvArr* dst,double threshold,double max_value,int threshold_type );

threshold_type:阈值类型

threshold_type=CV_THRESH_BINARY:
如果 src(x,y)>threshold,dst(x,y) = max_value; 否则,dst(x,y)=0;

threshold_type=CV_THRESH_BINARY_INV:
如果 src(x,y) = 0; 否则,y) = max_value.

threshold_type=CV_THRESH_TRUNC:
如果 src(x,y)>threshold,dst(x,y) = threshold; 否则dst(x,y) = src(x,y).

threshold_type=CV_THRESH_TOZERO:
如果src(x,y) ; 否则 dst(x,y) = 0。

threshold_type=CV_THRESH_TOZERO_INV:
如果 src(x,y) = 0 ; 否则dst(x,y).


测试代码如下:

//阈值化

#include "highgui.h"
#include "cv.h"

void Threshold(IplImage * src,IplImage * dst)
{
	IplImage * r = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
	IplImage * g = cvCreateImage(cvGetSize(src),1);
	IplImage * b = cvCreateImage(cvGetSize(src),1);

	//分别复制多通道图像的每个通道到多个单通道图像
	cvSplit(src,r,g,b,NULL);

	IplImage * s = cvCreateImage(cvGetSize(src),1);
	//图像融合,src1,权值,src2,权值,常数项,dst
	cvAddWeighted(r,1./3.,0.0,s);
	cvAddWeighted(s,2./3.,s);
	//s>100, dst=100, s<100,dst=s
	cvThreshold(s,dst,100,CV_THRESH_TRUNC);

	cvReleaseImage(&r);
	cvReleaseImage(&g);
	cvReleaseImage(&b);
	cvReleaseImage(&s);
}

int main()
{
	IplImage * src = cvLoadImage("d:\\picture\\01.bmp");
	IplImage * dst = cvCreateImage(cvGetSize(src),src->depth,1);

	cvNamedWindow("src",0);
	cvNamedWindow("dst",0);

	Threshold(src,dst);

	cvShowImage("src",src);
	cvShowImage("dst",dst);

	if(cvWaitKey(0)==27)
	{
		cvDestroyWindow("src");
		cvDestroyWindow("dst");
		cvReleaseImage(&src);
		cvReleaseImage(&dst);
	}
}


效果如图:




另一种阈值化方法

        // Threshold.cpp
<pre name="code" class="html">
	<span style="font-family: Arial,Helvetica,sans-serif;">IplImage * s = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);</span>
cvZero(s);cvAcc(b,s);cvAcc(g,s);cvAcc(b,s);cvAcc(r,s);cvThreshold(s,CV_THRESH_TRUNC);
 

效果如下:



void cvAcc( const CvArr* image,CvArr* sum,const CvArr* mask=NULL );
image
输入图像,1- 或 3-通道,8-比特或32-比特浮点数. (多通道的每一个通道都单独处理).
sum
同一个输入图像通道的累积,32-比特或64-比特浮点数组
mask
可选的运算 mask.
函数 cvAcc 将整个图像 image 或某个选择区域叠加到 sum 中:

猜你在找的设计模式相关文章