涉及的函数:

cvSplit 

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

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

#define cvCvtPixToPlane cvSplit

src   原数组.

dst0...dst3  目标通道

 

cvAddWeighted

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

src1  第一个原数组.  
alpha  第一个数组元素的权值  
src2  第二个原数组  
beta  第二个数组元素的权值  
dst  输出数组  
gamma  添加的常数项。

alpha混合的计算公式为:你可以取值为0至1,gamma取值为0
函数 cvAddWeighted 计算两数组的加权值的和:  
dst(I)=src1(I)*alpha+src2(I)*beta+gamma  
所有的数组必须有相同的类型相同的大小(或ROI大小)

 

cvThreshold

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

作用:函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的) 或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由 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

 

代码:

// 015 图像二值化.cpp : Defines the entry point

 for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <string>

void sum_rgb( IplImage* src, IplImage* dst)  //该函数的作用就是转灰度后二值化
{
  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);
 
 //函数 cvSplit 分割多通道数组成分离的单通道数组d
 cvSplit(src,r,g,b,NULL);
 IplImage* s=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);

 

cvAddWeighted(r, 1./3, g, 1./3, 0.0, s);
 cvAddWeighted(s, 2./3, b, 1./3, 0.0, s);
 cvThreshold(s,dst,100,255,CV_THRESH_BINARY );
 
 cvReleaseImage(&r);
 cvReleaseImage(&g);
 cvReleaseImage(&b);
 cvReleaseImage(&s);

 

 

IplImage* s=cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);
    cvCvtColor(src,s,CV_BGR2GRAY); 
    cvThreshold(s,dst,100,255,CV_THRESH_BINARY );


}

int main(int argc,char** argv)
{
 using namespace std;
 cvNamedWindow("aaa",1);

IplImage* src=cvLoadImage("Lena.jpg");
 IplImage* dst=cvCreateImage(cvGetSize(src),src->depth,1);
 
 sum_rgb(src,dst);
 cvShowImage("aaa",dst);

cvWaitKey(0);
 cvDestroyAllWindows();
 cvReleaseImage(&src);
 cvReleaseImage(&dst);
 
 return 0;
 
}

源图片:

示例程序009--阙值化(二值化,cvThreshold)

 

阙值=100的时候:

示例程序009--阙值化(二值化,cvThreshold)

 

阙值=50的时候:

示例程序009--阙值化(二值化,cvThreshold)

相关文章:

  • 2022-01-23
  • 2022-01-13
  • 2021-07-19
  • 2022-12-23
  • 2022-12-23
  • 2021-04-26
  • 2021-12-24
  • 2021-12-09
猜你喜欢
  • 2022-12-23
  • 2021-05-17
  • 2021-10-10
  • 2021-04-15
  • 2021-11-13
  • 2021-08-13
  • 2021-05-27
相关资源
相似解决方案