• 【学习opencv第七篇】图像的阈值化


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

    cvThreshold()函数如下:

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

    cvShold函数只能处理8位或者浮点灰度图像,目标图像必须与源图像一致,或者为8为图像

    实现阈值化的代码如下:

    #include "stdafx.h"
    #include <highgui.h>
    #include <math.h>
    #include <cv.h>
    using namespace std;
    int main()
    {
    	IplImage* sourceImage;
    	IplImage* dstImage;   
    	if(!(sourceImage=cvLoadImage("Hough.jpg")))
    		return -1;
    	dstImage=cvCreateImage(cvGetSize(sourceImage),sourceImage->depth,1);
    
    	IplImage* r=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	IplImage* g=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	IplImage* b=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	IplImage* tempImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	cvSplit(sourceImage,r,g,b,NULL);
    
    	cvAddWeighted(r,1./3.,g,1./3.,0.0,tempImage);
    	cvAddWeighted(tempImage,1,b,1./3.,0.0,tempImage);
    	cvThreshold(tempImage,dstImage,100,255,CV_THRESH_BINARY);
    	//对于大于100的设为255
    	cvNamedWindow("sourceImage");
    	cvNamedWindow("dstImage");
    	cvShowImage("sourceImage",sourceImage);
    	cvShowImage("dstImage",dstImage);
    
    	cvWaitKey(-1);
    	cvReleaseImage(&r);
    	cvReleaseImage(&g);
    	cvReleaseImage(&b);
    	cvDestroyWindow("sourceImage");
    	cvDestroyWindow("dstImage");
    
    	cvReleaseImage(&sourceImage);
    	cvReleaseImage(&dstImage);
    	return 0;
    }

    运行结果:


    在自适应阈值中,阈值本身就是一个变量,实现自适应阈值的代码如下:


    #include "stdafx.h"
    #include <highgui.h>
    #include <math.h>
    #include <cv.h>
    int main()
    {
    	IplImage* sourceImage;
    	
    	//直接以灰度图像载入
    	if(!(sourceImage=cvLoadImage("Hough.jpg",CV_LOAD_IMAGE_GRAYSCALE)))
    		return -1;
    	IplImage* dstImage=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	
    	//这个函数只能处理单通道图像或者8位图像,并且要求源图像	与目标图像不能为同一个图像
    	cvAdaptiveThreshold(
    		sourceImage,
    		dstImage,
    		255,     //max_val
    		CV_ADAPTIVE_THRESH_MEAN_C,
    		CV_THRESH_BINARY,
    		3,      //block_size
    		5       //offset
    		);
    	cvNamedWindow("AdaptiveThreshold",0);
    	cvShowImage("AdaptiveThreshold",dstImage);
    	
    	//单一阈值
    	IplImage* dstImage2=cvCreateImage(cvGetSize(sourceImage),IPL_DEPTH_8U,1);
    	cvThreshold(sourceImage,dstImage2,100,255,CV_THRESH_BINARY);
    	
    	cvNamedWindow("sourceImage",0);
    	cvNamedWindow("Threshold",0);
    	cvShowImage("sourceImage",sourceImage);
    	cvShowImage("Threshold",dstImage2);
    	
    	cvWaitKey(-1);
    	
    	//释放资源
    	cvDestroyWindow("sourceImage");
    	cvDestroyWindow("Threshold");
    	cvDestroyWindow("AdaptiveThreshold");
    	cvReleaseImage(&sourceImage);
    	cvReleaseImage(&dstImage);
    	cvReleaseImage(&dstImage2);
    	return 0;
    }

    运行结果:

    Reference《学习opencv》

  • 相关阅读:
    js 日期2015/12/22/16/45替换2015-12-22 16:45格式
    正则匹配多行内容
    js fs read json 文件json字符串无法解析
    未能加载文件或程序集“Enyim.Caching”或它的某一个依赖项。未能验证强名称签名
    二叉树、多叉树子路径遍历
    p点到(a,b)点两所在直线的垂点坐标及p点是否在(a,b)两点所在直线上
    System.Net.Sockets.Socket SendAsync System.ObjectDisposedException: Cannot access a disposed object.
    一个误解: 单个服务器程序可承受最大连接数“理论”上是“65535”
    如何用 PyCharm 调试 scrapy 项目
    c或c++的网络库
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3151163.html
Copyright © 2020-2023  润新知