关闭

opencv cvThreshold() cvAdaptiveThreshold()

标签: opencv图像处理
677人阅读 评论(0) 收藏 举报
分类:

基本思想:给定一个数组和一个阈值,然后根据数组中的每个元素的值是低于还是高于阈值而进行一些处理

/* Applies fixed-level threshold to grayscale image.
   This is a basic operation applied before retrieving contours */
CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,
                            double  threshold, double  max_value,
                            int threshold_type );

如下表所示,每个阈值类型对应于一个特定的比较操作,该比较操作在源图像第i个像素(srci)和阈值(表中表示为T)之间进行。根据源图像的像素和阈值之间的关系,目标图像的像素dsti可能被设置为0,srci或max_value(表中表示为M)

阈值类型

操作

CV_THRESH_BINARY

dsti=(srci > T)?M:0

CV_THRESH_BINARY_INV

dsti=(srci>T)?0:M

CV_THRESH_TRUNC

dsti=(srci>T)?M:srci

CV_THRESH_TOZERO_INV

dsti=(srci>T)?0:srci

CV_THRESH_TOZERO

dsti=(srci>T)?srci:0


1.cvThreshold()函数只能处理8位或浮点灰度图像

2.目标图像必须与源图像的类型一致,或者为8位图像

3.源图像和目标图像可以是同一图像

程序:对图像中三个通道求和,然后在值为100处对结果图像进行截断

#include "threshold.h"

//对图像中的三个通道求和,然后在值为100处对结果图像进行截断
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);

	//Split image onto the color plane
	cvSplit(src, r, g, b, NULL);

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

	//Add equally weighted rgb values
	cvAddWeighted(r, 1./3., g, 1./3., 0.0, s);
	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);
}

int main(void)
{
	cvNamedWindow("Threshold");

	//Load the image from the given file name.
	IplImage *src=cvLoadImage("lena.jpg");
	IplImage *dst=cvCreateImage(cvGetSize(src), src->depth, 1);
	if (src == NULL || dst == NULL)
		exit(0);
	sum_rgb(src, dst);

	//Show the image in the named window
	cvShowImage("Threshold", dst);

	//Idle until the user hits the "Esc" key
	while (true)
		if (cvWaitKey(10) == 27)
			break;

	//Clean up and don't be piggies
	cvDestroyWindow("Threshold");
	cvReleaseImage(&src);
	cvReleaseImage(&dst);
}


################################################


/* Applies adaptive threshold to grayscale image.
   The two parameters for methods CV_ADAPTIVE_THRESH_MEAN_C and
   CV_ADAPTIVE_THRESH_GAUSSIAN_C are:
   neighborhood size (3, 5, 7 etc.),
   and a constant subtracted from mean (...,-3,-2,-1,0,1,2,3,...) */
CVAPI(void)  cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
                                  int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C),
                                  int threshold_type CV_DEFAULT(CV_THRESH_BINARY),
                                  int block_size CV_DEFAULT(3),
                                  double param1 CV_DEFAULT(5));

这是一种改进了的阈值技术,其中阈值本身是一个变量

cvAdaptiveThreshold()有两种不同的自适应阈值方法,可以用参数adaptive_method进行设置。在两种情况下,自适应阈值T(x, y)在每个像素点都不同。通过计算像素点周围的bxb区域的加权平均,然后减去一个常熟来得到自适应阈值,b由参数block_size指定,常数由param1制定。如果使用CV_ADAPTIVE_THRESH_MEAN_C方法,那么对区域的所有像素平均加权。如果使用了CV_ADAPTIVE_THRESH_GAUSSIAN_C方法,那么区域中的(x, y)周围的像素根据高斯函数按照它们离中心点的距离进行加权计算。

参数threshold_type和cvThreshold()的参数threshold_type是一样的

note:本函数要求源图像和目标图像不能使用同一图像

void adaptiveThre(void)
{
	//比较cvThreshold()函数和cvAdaptiveThreshold函数
	IplImage *src, *dst1, *dst2, *dst3;

	src=cvLoadImage("left04.jpg", CV_LOAD_IMAGE_GRAYSCALE);
	dst1=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
	dst2=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
	dst3=cvCreateImage(cvGetSize(src), src->depth, src->nChannels);
	if (src == NULL || dst1 == NULL || dst2 == NULL || dst3 == NULL)
		exit(0);

	cvThreshold(src, dst1, 100, 255, CV_THRESH_BINARY);
	cvAdaptiveThreshold(src, dst2, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, 3, 5);
	cvAdaptiveThreshold(src, dst3, 255, CV_ADAPTIVE_THRESH_GAUSSIAN_C, CV_THRESH_BINARY, 3, 5);

	cvNamedWindow("src");
	cvNamedWindow("dst1");
	cvNamedWindow("dst2");
	cvNamedWindow("dst3");
	cvShowImage("src", src);
	cvShowImage("dst1", dst1);
	cvShowImage("dst2", dst2);
	cvShowImage("dst3", dst3);
	cvWaitKey(0);
	cvReleaseImage(&src);
	cvReleaseImage(&dst1);
	cvReleaseImage(&dst2);
	cvReleaseImage(&dst3);
	cvDestroyAllWindows();
}






0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

图像形态学 - 自适应阈值(cvAdaptiveThreshold)

自适应阈值: 是一种改进了的阈值技术,其中阈值本身是一个变量,自适应阈值T(x,y)的每个像素点都不同,通过计算像素点周围的b*b区域的加权平均,然后减去一个常数来得到自适应阈值。  cv...
  • Armily
  • Armily
  • 2013-04-18 10:28
  • 1261

OpenCV学习小记(1)

OpenCV学习小记 1.反转图像 函数:cv::flip() const char* imagename = "lena.BMP"; Mat img = imread(imagename); ...
  • lyc_daniel
  • lyc_daniel
  • 2013-12-02 17:24
  • 16858

关于二值化函数cvAdaptiveThreshold和cvThreshold的一些发现

1、函数cvAdaptiveThreshold的确可以将灰度图像二值化,但它的主要功能应该是边缘提取,并且参数param1主要是用来控制边缘的类型和粗细的,这些在软件自带的参考手册中均未提及。 cv...
  • liulina603
  • liulina603
  • 2013-10-12 10:06
  • 4434

OpenCV二值化cvThreshold和自适应二值化cvAdaptiveThreshold及Otsu

阈值化函数: double cvThreshold(constCvArr* src, CvArr* dst, double threshold, double max_value,int thresh...
  • u010418035
  • u010418035
  • 2015-04-03 11:45
  • 11940

Learning OpenCV cvAdaptiveThreshold 自适应阈值

一、函数定义: void cvAdaptiveThreshold( CvArr* src,//输入图像 CvArr* dst,//输出图像 double max_val,//最大值 int ...
  • rongfzh1990
  • rongfzh1990
  • 2014-11-20 14:01
  • 895

【opencv】图像的二值化 cvThreshold

vThreshold是opencv库中的一个函数   作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可...
  • u014077175
  • u014077175
  • 2014-11-16 21:35
  • 495

opencv学习笔记(十九)单通道固定阈值cvThreshold()以及自适应阈值化 OTSU算法

cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像
  • u014751607
  • u014751607
  • 2017-01-06 18:42
  • 220

Learing OpenCV cvThreshold

阈值处理: 一、函数定义:
  • rongfzh1990
  • rongfzh1990
  • 2014-11-20 13:14
  • 645

opencv自适应阀值cvAdaptiveThreshold的应用

Threshold:对数组元素进行固定阈值操作。通常希望对图像中的像素做出最后的决策,或直接剔除一些低于或高于一定值的像素。基本思想是:给定一个数组和一个阀值,然后根据数组中的每个元素的值是低于还是高...
  • gdut2015go
  • gdut2015go
  • 2015-06-09 10:34
  • 436

cvThreshold() 阈值化

OpenCV中阈值化的5种形式 CVAPI(double)  cvThreshold( const CvArr*  src, CvArr*  dst,                 ...
  • u011430438
  • u011430438
  • 2016-01-25 21:53
  • 499
    个人资料
    • 访问:778254次
    • 积分:9812
    • 等级:
    • 排名:第2082名
    • 原创:311篇
    • 转载:40篇
    • 译文:10篇
    • 评论:87条
    博客专栏
    文章分类
    最新评论