对图像中的三个同澳求和,然后在值为100处度结果进行截断
-
#include <stdio.h>
-
#include "opencv/cv.h"
-
#include "opencv/highgui.h"
-
-
-
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 planes
-
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(int argc,char** argv)
-
{
-
cvNamedWindow(argv[1],1);
-
-
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)&0x7f) == 27) break; }
-
-
cvDestroyWindow(argv[1]);
-
-
cvReleaseImage(&src);
-
cvReleaseImage(&dst);
-
-
return 0;
-
}
CreateImage
创建头并分配数据IplImage* cvCreateImage( CvSize size, int depth, int channels );
size
图像宽、高.
depth
图像元素的位深度,可以是下面的其中之一:
IPL_DEPTH_8U - 无符号 8 位整型
IPL_DEPTH_8S - 有符号 8 位整型
IPL_DEPTH_16U - 无符号 16 位整型
IPL_DEPTH_16S - 有符号 16 位整型
IPL_DEPTH_32S - 有符号 32 位整型
IPL_DEPTH_32F - 单精度浮点数
IPL_DEPTH_64F - 双精度浮点数
channels
每个元素(像素)通道号.可以是 1, 2, 3 或 4.通道是交叉存取的,例如通常的彩色图像数据
排列是:
b0 g0 r0 b1 g1 r1 ...
虽然通常 IPL 图象格式可以存贮非交叉存取的图像,并且一些 OpenCV 也能处理他, 但是
这个函数只能创建交叉存取图像.函数 cvCreateImage 创建头并分配数据,这个函数是下列的缩写型式header
= cvCreateImageHeader(size,depth,channels);cvCreateData(header);
AddWeighted
计算两数组的加磅值的和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 大小)
Split
分割多通道数组成几个单通道数组或者从数组中提取一个通道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 也可以从图像中提取单通道。
Threshold
对数组元素进行固定阈值操作void cvThreshold( const CvArr* src, CvArr* dst, double threshold,double max_value, int threshold_type );
src
原始数组 (单通道, 8-比特 of
32-比特 浮点数).
dst
输出数组,必须与 src 的类型一致,或者为 8-比特.
threshold
阈值
max_value
使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
threshold_type
阈值类型 (见讨论)函数 cvThreshold 对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像。(cvCmpS 也可以达到此目的)
或者是去掉噪声,例如过滤很小或很大象素值的图像点。本函数支持的对图像取阈值的方法由
threshold_type 确定:
threshold_type=CV_THRESH_BINARY:dst(x,y) = max_value, if src(x,y)>threshold0, otherwisethreshold_type=CV_THRESH_BINARY_INV:dst(x,y)
= 0, if src(x,y)>thresholdmax_value, otherwisethreshold_type=CV_THRESH_TRUNC:dst(x,y) = threshold, if src(x,y)>thresholdsrc(x,y), otherwisethreshold_type=CV_THRESH_TOZERO:dst(x,y)
= src(x,y), if (x,y)>threshold0, otherwisethreshold_type=CV_THRESH_TOZERO_INV:dst(x,y) = 0, if src(x,y)>thresholdsrc(x,y), otherwise
下面是图形化的阈值描述:

效果图如下:
-
/*
-
比较自适应阀值和单一阀值
-
*/
-
#include <stdio.h>
-
#include "opencv/cv.h"
-
#include "opencv/highgui.h"
-
#include "math.h"
-
-
IplImage* Igray = 0,*It = 0, *Iat;
-
-
int main(int argc,char** argv)
-
{
-
if(argc != 7){return -1;}
-
-
double threshold = (double)atof(argv[1]);
-
int threshold_type = atoi(argv[1]) ?
-
CV_THRESH_BINARY : CV_THRESH_BINARY_INV;
-
int adaptive_method = atoi(argv[3]) ?
-
CV_ADAPTIVE_THRESH_MEAN_C : CV_ADAPTIVE_THRESH_GAUSSIAN_C;
-
-
int block_size = atoi(argv[4]);
-
double offset = (double)atof(argv[5]);
-
-
//Read in gray image
-
if((Igray = cvLoadImage(argv[6],CV_LOAD_IMAGE_GRAYSCALE)) == 0){
-
return -1;}
-
-
It = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1);
-
Iat = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1);
-
-
cvThreshold(Igray,It,threshold,255,threshold_type);
-
cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,threshold_type,block_size,offset);
-
-
cvNamedWindow("Raw",0);
-
cvNamedWindow("Threshold",0);
-
cvNamedWindow("Adaptive Threshold",0);
-
-
cvShowImage("Raw",Igray);
-
cvShowImage("Threshold",It);
-
cvShowImage("Adaptive Threshold",Iat);
-
-
cvWaitKey(0);
-
-
cvReleaseImage(&Igray);
-
cvReleaseImage(&It);
-
cvReleaseImage(&Iat);
-
cvDestroyAllWindows();
-
-
return 0;
-
}