第五章 - 图像形态学 - 阈值化(cvThreshold),通道求和

阈值化:

        希望对图像中的像素做出最后决策,或直接剔除一些低于或高于一定值的像素,在OpenCV中,cvThreshold()可以完成这个任务,基本思想是给定一个数组和一个阈值,然后根据数组中每个元素的值是低于还是高于阈值来进行处理。


本例程chapter_ch5_example_2涉及的数据结构及方法:

cvSplit

分割多通道数组成几个单通道数组或者从数组中提取一个通道  

void cvSplit( const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3 );  

#define cvCvtPixToPlane cvSplit  

src   原数组.  

dst0...dst3  目标通道   

函数 cvSplit 分割多通道数组成分离的单通道数组d。可获得两种操作模式 . 如果原数组有N通道且前N输出数组非NULL, 所有的通道都会被从原数组中提取,如果前N个通道只有一个通道非NULL函数只提取该指定通道,否则会产生一个错误,馀下的通道(超过前N个通道的以上的)必须被设置成NULL,对于设置了COI的IplImage 结使用cvCopy 也可以从图像中提取单通道。

cvAddWeighted

void cvAddWeighted(
    constCvArr* src1, double alpha,
    const CvArr* src2,
    double beta,
    double gamma,
    CvArr* dst
);
在cvAddWeighted()中,有两个源图象src1 和 src2。 这两个图象可以是任何象素类型,只要它们的类型相同。它们可以是单通道或是三通道,只要它们相符。运算结果的目标图象,dst,必须和src1和src2有相同的象素类型。这些图象可以是不同的尺寸,但它们的ROI必须有相同的大小,否则OpenCV会报告一个错误。参数alpha是src1的混合强度,beta是src2的混合强度。alpha混合的计算公式为:你可以取值为0至1,gama取值为0,上述公式就转换为标准的alpha混合公式:

cvThreshold

cvThreshold是opencv库中的一个函数
        作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 threshold_type 确定。
        形式:void cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type );
  src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。dst:输出数组,必须与 src 的类型一致,或者为 8-bit。
  threshold:阈值
  max_value:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。
  threshold_type:阈值类型 threshold_type=CV_THRESH_BINARY:
  如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,des(x,y)=0;
  threshold_type=CV_THRESH_BINARY_INV:
  如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.
  threshold_typ

/*程序*/

#include <stdio.h>
#include <highgui.h>
#include <cv.h>

void sum_rgb( IplImage* src, IplImage* dst );

int main(int argc, char** argv)
{
	cvNamedWindow( argv[1], 1 ); //create a window

	IplImage* src = cvLoadImage( argv[1] );
	IplImage* dst = cvCreateImage( cvGetSize(src), src->depth, 1 );  //
	sum_rgb( src, dst );

	cvShowImage( argv[1], dst );

	while (1)
	{
		if( (cvWaitKey( 10 )) == 27 )
			break;
	}

	cvDestroyWindow( argv[1] );
	cvReleaseImage( &src );
	cvReleaseImage( &src );

	return 0;
}

void sum_rgb( IplImage* src, IplImage* dst )
{
	//allocate individual image planes
	IplImage* r = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );
	IplImage* g = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );
	IplImage* b = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );

	//temporary storage
	IplImage* s = cvCreateImage( cvGetSize( src ), IPL_DEPTH_8U, 1 );

	//split the image onto the color planes, signal channel
	cvSplit( src, r, g, b, NULL );

	//add eaually weighted rgb values
	cvAddWeighted( r, 1./3, g, 1./3, 0.0, s );  //add r & g
	cvAddWeighted( s, 2./3, b, 1./3, 0.0, s );

	//truncate values above 100
	cvThreshold( s, dst, 100, 100, CV_THRESH_TRUNC );

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

/*结果*/

原图


阈值为50


阈值为100


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值