图像分割简单处理
来源:互联网 发布:mac怎么安装程序 编辑:程序博客网 时间:2024/05/16 03:26
//学习OPENCV第5章,简单图像处理#include<stdio.h>#include<cv.h>#include<highgui.h>#include<stdio.h>#include <opencv2/legacy/legacy.hpp>void f(IplImage* src, IplImage* dst,int layer);void sum_rgb(IplImage* src,IplImage* dst);void sum_rgb1(IplImage* src,IplImage* dst); int main(int argc, char** argv){//-------------------------------------------------------------------//图像金字塔分割IplImage* src = cvLoadImage("D:\\AI_Proj\\OPENCV\\cameraman.tif");if(!src) { printf("Couldn't seem to Open image, sorry\n"); return -1;}//分别按照金字塔2/4/6层分割IplImage* dst2l = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);IplImage* dst4 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);IplImage* dst6 = cvCreateImage(cvGetSize(src),src->depth,src->nChannels);f(src,dst2l,2);f(src,dst4,4);f(src,dst6,6);cvNamedWindow("PyrSegmentation2",1);cvNamedWindow("PyrSegmentation4",1);cvNamedWindow("PyrSegmentation6",1);cvShowImage("PyrSegmentation2",dst2l);cvShowImage("PyrSegmentation4",dst4);cvShowImage("PyrSegmentation6",dst6);while(1) { if(cvWaitKey(100) == 27) break; }cvDestroyWindow("PyrSegmentation2");cvDestroyWindow("PyrSegmentation4");cvDestroyWindow("PyrSegmentation6");cvReleaseImage(&src);cvReleaseImage(&dst2l);cvReleaseImage(&dst4);cvReleaseImage(&dst6);cvWaitKey();//-------------------------------------------------------------------//rgb分离:加权加法得到目的图像IplImage* src1 = cvLoadImage("D:\\AI_Proj\\OPENCV\\dog.jpg");IplImage* dst1 = cvCreateImage(cvGetSize(src1),src1->depth,1);sum_rgb(src1,dst1);cvNamedWindow("split_rgb",1);cvShowImage("split_rgb",dst1);while(1) { if((cvWaitKey(10)&0x7f) == 27) break; }cvDestroyWindow("split_rgb");cvReleaseImage(&src1);cvReleaseImage(&dst1);cvWaitKey();//-------------------------------------------------------------------//rgb分离:通过累加cvAcc得到目的图像IplImage* src2 = cvLoadImage("D:\\AI_Proj\\OPENCV\\dog.jpg");IplImage* dst2 = cvCreateImage(cvGetSize(src2),src2->depth,1);sum_rgb1(src2,dst2);cvNamedWindow("cvAcc_rgb",1);cvShowImage("cvAcc_rgb",dst2);while(1) { if((cvWaitKey(10)&0x7f) == 27) break; }cvDestroyWindow("cvAcc_rgb");cvReleaseImage(&src2);cvReleaseImage(&dst2);cvWaitKey();//-------------------------------------------------------------------//自适应分割:增加可配性IplImage* Igray;IplImage* It;IplImage* Iat;if(!(Igray = cvLoadImage("D:\\AI_Proj\\OPENCV\\dog.jpg",CV_LOAD_IMAGE_GRAYSCALE)))return -1; double threshold = 100;//(double)atof(argv[1]); int threshold_type = CV_THRESH_BINARY;//atoi(argv[2]) ? CV_THRESH_BINARY : CV_THRESH_BINARY_INV; int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C;//atoi(argv[3]) ? CV_ADAPTIVE_THRESH_MEAN_C : CV_ADAPTIVE_THRESH_GAUSSIAN_C; int block_size = 3;//atoi(argv[4]); double offset = 0;//(double)atof(argv[5]); //Create the grayscale output images It = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1); Iat = cvCreateImage(cvSize(Igray->width,Igray->height),IPL_DEPTH_8U,1); //Threshold cvThreshold(Igray,It,threshold,255,threshold_type);//根据block_size内像素,二值化//P159:只能处理8位图像,或浮点图像,源图像与目的图像不能一致。 cvAdaptiveThreshold(Igray,Iat,255,adaptive_method,threshold_type,block_size,offset); //PUT UP 2 WINDOWS cvNamedWindow("Raw",1); cvNamedWindow("Threshold",1); cvNamedWindow("Adaptive_Threshold",1); //Show the results cvShowImage("Raw",Igray); cvShowImage("Threshold",It); cvShowImage("Adaptive_Threshold",Iat); cvWaitKey(0); //Clean up cvReleaseImage(&Igray); cvReleaseImage(&It); cvReleaseImage(&Iat);cvDestroyWindow("Raw");cvDestroyWindow("Threshold");cvDestroyWindow("Adaptive_Threshold");return(0);}//图像金字塔实现分割void f(IplImage* src,IplImage* dst,int layer) {//为结构体CvMemStorage分配空间,返回指向该空间的指针CvMemStorage* storage = cvCreateMemStorage(0);//动态结构序列CvSeq是所有OpenCv动态数据结构的基础;有两种类型的序列:稠密序列,稀疏序列CvSeq* comp = NULL;//用金字塔实现图像分割P153//http://blog.csdn.net/cartoonface/article/details/5998543//参数:源/目的图像;存储连通部件的序列结果;分割部件的输出序列指针;//最大层数layer;阈值200,50cvPyrSegmentation(src,dst,storage,&comp,layer,200,50);int n_comp = comp->total;//对序列进行索引,或进行其他操作for(int i=0;i<n_comp;i++) {//cvGetSeqElem返回索引指定元素的指针//comp是要检测的序列,而i是元素在序列中的索引CvConnectedComp* cc = (CvConnectedComp*) cvGetSeqElem(comp,i);// do_something_with( cc );}cvReleaseMemStorage(&storage);}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);//Temporary storage.IplImage* s = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);//Split image onto the color planes.图像通道分离cvSplit(src,r,g,b,NULL);//Add equally weighted rgb values.//s=r*1/3+g*1/3//s=s*2/3+b*1/3//通常不对8位数组进行加法运算,可能溢出。//通过加权加法对3通道进行运算,高于100进行截断cvAddWeighted(r,1./3.,g,1./3.,0.0,s);cvAddWeighted(s,2./3.,b,1./3.,0.0,s);//对value大于100的像素进行截断为255,不足100的保留原值cvThreshold(s,dst,100,255,CV_THRESH_TRUNC);cvNamedWindow("split_r",CV_WINDOW_AUTOSIZE);cvNamedWindow("split_g",CV_WINDOW_AUTOSIZE);cvNamedWindow("split_b",CV_WINDOW_AUTOSIZE);cvNamedWindow("s",CV_WINDOW_AUTOSIZE);cvShowImage("split_r",r);cvShowImage("split_g",g);cvShowImage("split_b",b);cvShowImage("s",s);cvWaitKey();cvReleaseImage(&r);cvReleaseImage(&g); cvReleaseImage(&b); cvReleaseImage(&s);cvDestroyWindow("split_r");cvDestroyWindow("split_g");cvDestroyWindow("split_b");cvDestroyWindow("s");}void sum_rgb1(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);IplImage* s = cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);cvSplit(src,r,g,b,NULL);//图像累加cvZero(s);cvAcc(b,s);cvAcc(g,s);cvAcc(r,s);cvThreshold(s,s,100,255,CV_THRESH_TRUNC );//使用线性变换转换数组//源/目的图像;缩放因子;添加的值cvConvertScale(s,dst,1,0); cvReleaseImage(&r);cvReleaseImage(&g); cvReleaseImage(&b); cvReleaseImage(&s);}
示例效果:
金字塔层数越多分割越模糊
0 0
- 图像分割简单处理
- 图像处理之图像分割之Snake算法简单梳理
- 图像分割总结,图像处理
- 图像处理之分割图像
- 【OpenCV3图像处理】图像分割
- 【图像处理】MATLAB:图像分割
- 图像分割 处理 matlab源码
- 数字图像处理:9.图像分割
- [matlab图像处理] 阈值分割
- Matlab 图像分割 (阈值处理)
- 数字图像处理06(图像分割)
- opencv10-图像分割-阈值处理
- 简单的彩色图像分割
- 灰度图像--图像分割 阈值处理综述
- 图像处理之--图像分割10.1基础知识
- 图像处理--图像分割算法介绍
- matlab 图像形态学处理与图像分割
- 图像处理(三)图像分割(1)Random Walks分割
- 嵌入式开发的基本环境配置大全
- #HDU 1372 Knight Moves 【BFS】
- UVALive 5878 - Shortest Leash 【计算几何】
- !!!!!!!!!!!!!!!!!!!!!!!!!
- cocos2dx学习之路----第五篇(切换场景的另一种方式:使用popScene与pushScene)
- 图像分割简单处理
- android studio导入SlidingMenu的方法
- 016-Storm借助tick消息定时器统计统计周期性业务
- jquery动态改变form属性提交表单
- UVALive 5873 - Tree Inspections 【模拟】
- #HDU 1016 Prime Ring Problem 【DFS+溯回求组数】
- 多点移动电子地图定位
- nodejs爬取页面内容(utf8编码)
- form提交前验证的几种方法