小弟我是刚刚开始学习图形学的入门者,现在有一张统计图,要求输出它的每一条状的占的比例
我是刚刚开始学习图形学的入门者,现在有一张统计图,要求输出它的每一条状的占的比例。
比如我的一张JPG的条形图是这样的:
-------------------------------------------|
| |
| |
| |
| |
| |
| -- |
| -- |
| -- -- |
| -- -- -- |
| -- -- -- |
| -- -- -- |
—————————————————————————
这张统计图是这样的,当然在JPG里更形象,三条表示实物的条形状,想请教就是三条在各自的垂直位置占多少比例,用图形识别的方法来做。这个曲线比较简单,假如是一个条形状更多的图形,每条所占的比例都要求计算出来。假如整个图形的高度是200象素,如果第一条所占的象素是100象素,那么这个比例的数据是0.5。依次类推,给我点提示,需要用到哪些知识,怎么样去解决去,问问各位图象处理的高手了,包括知道的,反正是有这方面知识的人,都可以给我点提示。
------解决方案--------------------
比如我的一张JPG的条形图是这样的:
-------------------------------------------|
| |
| |
| |
| |
| |
| -- |
| -- |
| -- -- |
| -- -- -- |
| -- -- -- |
| -- -- -- |
—————————————————————————
这张统计图是这样的,当然在JPG里更形象,三条表示实物的条形状,想请教就是三条在各自的垂直位置占多少比例,用图形识别的方法来做。这个曲线比较简单,假如是一个条形状更多的图形,每条所占的比例都要求计算出来。假如整个图形的高度是200象素,如果第一条所占的象素是100象素,那么这个比例的数据是0.5。依次类推,给我点提示,需要用到哪些知识,怎么样去解决去,问问各位图象处理的高手了,包括知道的,反正是有这方面知识的人,都可以给我点提示。
------解决方案--------------------
- C/C++ code
//1. 加载jpg,这个网上源很多,嫌麻烦就把JPG转成BMP,然后LoadImage() //2. // 假设 宽width 高height 32位 每个直方柱宽 cx, 直方柱数 #define NUM 8 // 假定已经取得图像数据 lpBits(不是头,是真正的图像数据) Begin() { float result[NUM]; for(int i=0; i< NUM; i++) { result[i] = GetPart(i); } } float GetPart(int i) { int xx = i*cx + cx/2; int red, green, blue; // *1 for(int j=0; j< height; j++) { if(j == 0) { blue = *(lpBits+j*width*4+xx*4); // *2 green = *(lpBits+j*width*4+xx*4+1); red = *(lpBits+j*width*4+xx*4+2); continue; } if(blue != *(lpBits+j*width*4+xx*4) || // *3 green != *(lpBits+j*width*4+xx*4+1) || red != *(lpBits+j*width*4+xx*4+2)) return ((float)(height-j))/(float)height; } if(j == height) return 0.0f; // *4 } // *1 怎样取得r,g,b值,如果你的图上画100%刚好与图像一样高就无法得到底色这样就不能分别100%与 // 0%,所以图像最好上部有空余部分或已经知道了底色(除非你确定没有100%与0%)。 // *2 这里是取底色(如果已经知道了可以去掉),如果是24位 要乘3 // *3 这里是比较,如果图像有噪声且没有做去噪处理,这里要加误差 如abs(blue - *(lpBits+j*width*4+xx*4)) > 10 // (差值在10以内认为是同一种色) // *4 如*1所述,100%与0%的区别问题