高级图像处理初步

转载 2012年03月29日 18:08:25
/**本代码主要是对一幅灰度图像rice.jpg进行一些处理,消除rice.jpg图像中的亮度不一致的背景,
 * 并使用阀值分割将修改后的图像转换为二值图像,使用轮廓检测返回图像中目标对象的个数以及统计属性。
 */
#include <cv.h>
#include <highgui.h>
#include <math.h>
//#include <stdlib.h>
//#include <stdio.h>

int main(int argc, char* argv[])
{
    IplImage *src = 0; //定义源图像指针
    IplImage *tmp = 0; //定义临时图像指针
    IplImage *src_back = 0; //定义源图像背景指针
    IplImage *dst_gray = 0; //定义源文件去掉背景后的目标灰度图像指针
    IplImage *dst_bw = 0; //定义源文件去掉背景后的目标二值图像指针
    IplImage *dst_contours = 0; //定义轮廓图像指针
    IplConvKernel *element = 0; //定义形态学结构指针

    int Number_Object =0; //定义目标对象数量
    int contour_area_tmp = 0; //定义目标对象面积临时寄存器
    int contour_area_sum = 0; //定义目标所有对象面积的和
    int contour_area_ave = 0; //定义目标对象面积平均值
    int contour_area_max = 0; //定义目标对象面积最大值

    CvMemStorage *stor = 0;
    CvSeq * cont = 0;
    CvContourScanner contour_scanner; 
    CvSeq * a_contour= 0;

    //1.读取和显示图像
    /* the first command line parameter must be image file name */
    if ( argc == 2 && (src = cvLoadImage(argv[1], -1))!=0 )
    {
        ;
    }
    else
    {
    src = cvLoadImage("rice.jpg", 0);
    }
    cvNamedWindow( "src", CV_WINDOW_AUTOSIZE );
    cvShowImage( "src", src );
    //cvSmooth(src, src, CV_MEDIAN, 3, 0, 0, 0); //中值滤波,消除小的噪声;

    //2.估计图像背景
    tmp = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    src_back = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    //创建结构元素

    element = cvCreateStructuringElementEx( 4, 4, 1, 1, CV_SHAPE_ELLIPSE, 0);
    //用该结构对源图象进行数学形态学的开操作后,估计背景亮度

    cvErode( src, tmp, element, 10);
    cvDilate( tmp, src_back, element, 10);
    cvNamedWindow( "src_back", CV_WINDOW_AUTOSIZE );
    cvShowImage( "src_back", src_back );

    //3.从源图象中减区背景图像
    dst_gray = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
    cvSub( src, src_back, dst_gray, 0);
    cvNamedWindow( "dst_gray", CV_WINDOW_AUTOSIZE );
    cvShowImage( "dst_gray", dst_gray );

    //4.使用阀值操作将图像转换为二值图像
    dst_bw = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
	//取阀值为50把图像转为二值图像
    cvThreshold( dst_gray, dst_bw ,50, 255, CV_THRESH_BINARY ); 

    //cvAdaptiveThreshold( dst_gray, dst_bw, 255, CV_ADAPTIVE_THRESH_MEAN_C, 
	//						CV_THRESH_BINARY, 3, 5 );

    cvNamedWindow( "dst_bw", CV_WINDOW_AUTOSIZE );
    cvShowImage( "dst_bw", dst_bw );

    //5.检查图像中的目标对象数量
    stor = cvCreateMemStorage(0);
    cont = cvCreateSeq(CV_SEQ_ELTYPE_POINT, sizeof(CvSeq), sizeof(CvPoint), stor);
    Number_Object = cvFindContours( dst_bw, stor, &cont, sizeof(CvContour), 
    CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) ); //找到所有轮廓

    printf("Number_Object: %d\n", Number_Object);

    //6.计算图像中对象的统计属性
    dst_contours = cvCreateImage( cvGetSize(src), src->depth, src->nChannels);
	//在画轮廓前先把图像变成白色
    cvThreshold( dst_contours, dst_contours ,0, 255, CV_THRESH_BINARY ); 

    for(;cont;cont = cont->h_next)
    {
        cvDrawContours( dst_contours, cont, CV_RGB(255, 0, 0), CV_RGB(255, 0, 0), 
			0, 1, 8, cvPoint(0, 0) ); //绘制当前轮廓

        contour_area_tmp = fabs(cvContourArea( cont, CV_WHOLE_SEQ )); //获取当前轮廓面积

        if( contour_area_tmp > contour_area_max )
        {
            contour_area_max = contour_area_tmp; //找到面积最大的轮廓

        }
        contour_area_sum += contour_area_tmp; //求所有轮廓的面积和

    }
    contour_area_ave = contour_area_sum/ Number_Object; //求出所有轮廓的平均值

    printf("contour_area_ave: %d\n", contour_area_ave );
    printf("contour_area_max: %d\n", contour_area_max );
    cvNamedWindow( "dst_contours", CV_WINDOW_AUTOSIZE );
    cvShowImage( "dst_contours", dst_contours );

    cvWaitKey(-1); //等待退出

    cvReleaseImage(&src);
    cvReleaseImage(&tmp);
    cvReleaseImage(&src_back);
    cvReleaseImage(&dst_gray);
    cvReleaseImage(&dst_bw);
    cvReleaseImage(&dst_contours);
    cvReleaseMemStorage(&stor);
    cvDestroyWindow( "src" );
    cvDestroyWindow( "src_back" );
    cvDestroyWindow( "dst_gray" );
    cvDestroyWindow( "dst_bw" );
    cvDestroyWindow( "dst_contours" );
    //void cvDestroyAllWindows(void);

    return 0;
}

数字图像处理的三个层次

数字图像处理分为三个层次:低级图像处理、中级图像处理和高级图像处理。 (1)低级图像处理内容 内容:主要对图象进行各种加工以改善图象的视觉效果、或突出有用信息,并为自动识别打基础,或通过编码以减少对...
  • Real_Myth
  • Real_Myth
  • 2016年09月08日 13:45
  • 2131

java 高级图像处理

Advanced Image ProcessingThis chapters project, one that views the Mandelbrot set, gives youexamples...
  • Daemon_neu
  • Daemon_neu
  • 2007年06月13日 15:38
  • 1040

高级图像处理初步(大米粒的处理)

#include #include #include //#include //#include     int main(int argc, char* argv[]) {     Ipl...
  • liyuqian199695
  • liyuqian199695
  • 2015年11月05日 19:43
  • 528

数字图像处理笔记01

图像及其数字处理01图像的表示 二维图像的成像过程​ 反射光或发射光线→\to成像系统 →\to 成像平面 →\to 输出图像 数字图像的基本要素像素(pixel):数字图像的基本单位 像素坐标系:对...
  • wjoker
  • wjoker
  • 2017年01月18日 18:55
  • 256

python 图像处理初步

1.安装python 开发环境,一般ubuntu自带 2.安装图像处理库imaging sudo apt-get install imaging 3.读取图片 import image im = ...
  • qq_24815615
  • qq_24815615
  • 2016年12月02日 21:49
  • 171

图像处理中常用的词汇

词汇表旨在使读者避免对常用词和专业化词汇产生混淆。下述定义同数字图像处理的一般用法一致,但绝不是本领域的标准化定义。它们和已出版的图像处理和计算机技术书籍中对有关词汇的定义是大体一致的。   Alge...
  • wyb19890515
  • wyb19890515
  • 2012年02月13日 14:33
  • 2319

开始着手进行CUDA实现图像处理算法的计划

2015年10月30日09:39:36 从今天开始进行图像去雾、增强、去噪等图像处理算法的GPU实现。 实验室买了一个GPU,GTX970,算比较高端的GPU了,目前CUDA只支持N卡。 加油!...
  • zhangyi19930704
  • zhangyi19930704
  • 2015年10月30日 09:43
  • 762

Python 高级图像处理

摘要: 构建图像搜索引擎并不是一件容易的任务。这里有几个概念、工具、想法和技术需要实现。主要的图像处理概念之一是逆图像查询reverse image querying(RIQ)。Google、Clou...
  • yunqishequ1
  • yunqishequ1
  • 2017年07月04日 14:33
  • 122

蓝牙的初步认识

一、.Bluetooth是目前使用最广泛的无线通讯协议,主要针对短距离的设备,基本上十米以内,而且是中间无阻碍的才能达到十米,如果中间有阻碍可能不到十米。 二、Bluetooth相关 API   ...
  • fang0521
  • fang0521
  • 2016年09月18日 10:38
  • 110

高级图像处理初步——背景获取、轮廓检测、数量统计

实验目的:本代码主要是对一幅灰度图像rice.jpg进行一些处理,消除rice.jpg图像中的亮度不一致的背景,并使用阈值分割将修改后的图像转换为二值图像,使用轮廓检测返回图像中目标对象的个数以及统计...
  • willproud
  • willproud
  • 2012年10月23日 21:16
  • 2163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高级图像处理初步
举报原因:
原因补充:

(最多只允许输入30个字)