Refer from http://blog.csdn.net/what_lei/article/details/49099223
在模式识别中常用垂直投影和水平投影对目标物进行精确投影,以便于后期的分割。
示例:
(1) (2) (3)
对上图一中“静”精确定位,字体行书刚好将它为连通。(若如不是连笔,后期分割可能将“青”和“争”分开)
从图(2)可知:从第三白色部分即可定位出“静”字的宽度,
从图(3):即可定位出“静”字的高度。
垂直投影和水平投影代码:
- <pre name="code" class="cpp">// Vertical_gray_projection.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include <opencv2/opencv.hpp>
- using namespace std;
- using namespace cv;
- int _tmain(int argc, _TCHAR* argv[])
- {
- IplImage * src=cvLoadImage("1.bmp");
- IplImage *dst = cvCreateImage(cvGetSize(src), 8, 1);
- IplImage *img = cvCreateImage(cvGetSize(src), 8, 1);
- cvSmooth(src,src,CV_BLUR,3,3,0,0);
- cvCvtColor(src,img,CV_BGR2GRAY);
- cvThreshold(img,dst,50,255,CV_THRESH_BINARY);
- IplImage* paintx=cvCreateImage( cvGetSize(dst),IPL_DEPTH_8U, 1 );
- IplImage* painty=cvCreateImage( cvGetSize(dst),IPL_DEPTH_8U, 1 );
- cvZero(paintx);
- cvZero(painty);
- int* v=new int[dst->width];
- int* h=new int[dst->height];
- memset(v,0,dst->width*4);
- memset(h,0,dst->height*4);
- int x,y;
- CvScalar s,t;//可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的
- /*typedef struct CvScalar
- {
- double val[4];
- }CvScalar;
- */
- //垂直投影
- for(x=0;x<dst->width;x++)
- {
- for(y=0;y<dst->height;y++)
- {
- s=cvGet2D(dst,y,x); //cvGet2D() 的函数原型是 : CvScalar cvGet2D (const CvArr * arr, int idx0, int idx1);
- //函数返回的是一个CvScalar 容器,其参数中也有两个方向的坐标,
- //但跟我们平常习惯的坐标不一样的是,idx0代表是的行,即高度,对应于我们平常坐标系的y,
- //idx1代表的是列,即宽度,对应于我们平常坐标系的x,cvSet2D() 也类似。
- //printf("area == %lf\n",s);
- if(s.val[0]==0)
- v[x]++;
- }
- }
- for(x=0;x<dst->width;x++)
- {
- for(y=0;y<v[x];y++)
- {
- t.val[0]=255;
- cvSet2D(paintx,y,x,t);
- }
- }
- //水平投影
- for(y=0;y<dst->height;y++)
- {
- for(x=0;x<dst->width;x++)
- {
- s=cvGet2D(dst,y,x);
- if(s.val[0]==0)
- h[y]++;
- }
- }
- for(y=0;y<dst->height;y++)
- {
- for(x=0;x<h[y];x++)
- {
- t.val[0]=255;
- cvSet2D(painty,y,x,t);
- }
- }
- cvNamedWindow("二值图像",1);
- cvNamedWindow("垂直投影",1);
- cvNamedWindow("水平投影",1);
- cvShowImage("二值图像",dst);
- cvShowImage("垂直投影",paintx);
- cvShowImage("水平投影",painty);
- cvWaitKey(0);
- cvDestroyAllWindows();
- cvReleaseImage(&dst);
- cvReleaseImage(&paintx);
- cvReleaseImage(&painty);
- return 0;
- }