我想获得世界某一地区的opencv 灰度图图,我该怎么做

声明:本站内容部分源于网络转载,出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,请咨询相关专业人士。
如果无意之中侵犯了您的版权,或有意见、反馈或投诉等情况, 请联系本站,
Copyright (C)
| 欢迎来到杭州厨师培训1617人阅读
图像处理(3)
&大致原理介绍:
&&&&&&& 图像处理过程中经常需要用到二值化图像并提取关键点的处理方式,但是如果只指定一个灰度阀值,得到的处理结果往往不能让人满意,亮度相对较高,阀值相对较低的地方会出现大片的“白斑”,。因此就需要将图像分割为多个小块,然后指定一个最小亮度阀值 lignmin 和一个最大亮度阀值 lightmax,之后通过计算为每个图像小块线性匹配出一个合适的阀值,从而得到较为理想的效果。
&&&&&&& 如下图,Y轴 lightmin 和 lightmax 分别是指定的灰度阀值下界和上界,X轴是分割后小依据平均灰度从小到大排列的图像小块
数据结构:
&&&&&&& 加载位图使用OPENGL 的GLAUX 中的 auxDIBImageLoad(fielpath) 函数,然后初始图像数据保存在一个 AUX_RGBImageRec (GLAUX提供的数据结构,注意:图像从左下角开始扫描的)类型数据结构中。需要用到的自定义结构有 struct imgMap,保存图像分割数据和一个存储 imgArea * 的指针链表,用来存储分割后的图像小块
。struct imgArea &是存储每个分割小块的数据结构,包含了小块 平均亮度,大小, 原图像中的位置和指向下一个小块的的指针 等数据。
typedef struct _imgArea
un // 平均亮度
un // 选择的亮度阀值
// 宽度和高度以像素为单位
// 如果 imgArea 所属的 imgMap-&islefetbottom=TRUE,则存储
// 的是imgArea左下角第一个像素在 imgMap-&pimg-&data 中对
// 应像素的指针;否则就是左上角第一个像素在 imgMap-&pimg
// -&data 中对应的指针
unsigned char *
// 每行像素占用的字节数(虚拟),可以方便遍历 imgArea 中的
// 像素,( begin + n*step )可以方便的指向第 N 行的首个像
// 素的地址。
// 注意:虚拟 的含义是说 step != imgArea-&width * sizeof(unsigned char) * 3
实际上 step = imgMap-&pimg-&sizeX * sizeof(unsigned char) * 3
struct _imgArea *
typedef struct _imgMap
AUX_RGBImageRec *
unsigned char *
int mapsizeX;
int mapsizeY;
imgArea **ascorder_
二值化图像:
&&&&&&& 首先是根据 AUX_DIBImageRec 创建 imgMap。
imgMap *createimgMap(
AUX_RGBImageRec *pimg,unsigned char *lights,
int mapsizeX,int mapsizeY,BOOL isleftbottom=TRUE
imgMap *newMap = new imgMap();
newMap-&pimg =
// 初始化 imgMap 头部
newMap-&isleftbottom =
//setorderLights(lightsize, lights);
newMap-&lights
newMap-&mapsizeX = mapsizeX;
newMap-&mapsizeY = mapsizeY;
newMap-&data =
// 未初始化的数据块
newMap-&ascorder_assist =
// 初始化数据块
CREATE_IMGMAP(newMap);
// 设置 ascorder_assist 各成员的 selvalue
// 遍历 newMap-&ascorder_assist[]
int areanums = newMap-&mapsizeX*newMap-&mapsizeY;
float factor = ( float(lights[1])-float(lights[0]) )/( float(newMap-&ascorder_assist[areanums-1]-&avevalue)-float(newMap-&ascorder_assist[0]-&avevalue) );
newMap-&ascorder_assist[0]-&selvalue = lights[0];
for(x=1;x &++x)
newMap-&ascorder_assist[x]-&selvalue = lights[0] + (int)( factor*(newMap-&ascorder_assist[x]-&avevalue-newMap-&ascorder_assist[0]-&avevalue));
return newM
&&&&&&& 然后对imgMap进行分割,并将分割后得到的小块根据 imgArea.avevalue 进行递增排序。
void initimgMapData_leftbottom(imgMap *pmap)
&& &int x=0,y=0;&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &&& &// 遍历 pmap-&data 之用
&& &void *ptemp =
&& &imgArea *parea = pmap-&
&& &int areawidth_basic&& &= ( pmap-&pimg-&sizeX )/( pmap-&mapsizeX );
&& &int areaheight_basic = ( pmap-&pimg-&sizeY) /( pmap-&mapsizeY );
&& &int areawidth_extra&& &= ( pmap-&pimg-&sizeX )%( pmap-&mapsizeX );
&& &int areaheight_extra = ( pmap-&pimg-&sizeY )%( pmap-&mapsizeY );
&& &unsigned char *pixelperLine =&& &&& &&& &&& &&& &// 遍历每行 imgArea 之用
&& &int imgStep&& &&& &= pmap-&pimg-&sizeX*UCHAR_SIZE*3;&& &// 图片的每行像素宽度
&& &int realStep&& &= areawidth_basic*UCHAR_SIZE*3;&&&& // 每行前 mspzieX-1 个imgArea 的像素宽度
&& &for(y=0;y & pmap-&mapsizeY;++y)
&& &&& &pixelperLine = pmap-&pimg-&data + y*( areaheight_basic*imgStep );
&& &&& &for(x=0;x & pmap-&mapsizeX;++x)
&& &&& &&& &// 新 imgArea 插入链表
&& &&& &&& &ptemp = (void *)new imgArea();
&& &&& &&& &( (imgArea *)ptemp )-&next =
&& &&& &&& &if( nullptr == pmap-&data )
&& &&& &&& &{
&& &&& &&& &&& &pmap-&data = (imgArea *)
&& &&& &&& &&& &parea = (imgArea *)
&& &&& &&& &}
&& &&& &&& &parea-&next = (imgArea *)
&& &&& &&& &parea = parea-&
&& &&& &&& &// 对行 imgArea 初始化
&& &&& &&& &if( (pmap-&mapsizeX - 1)& == x ) parea-&width =& areawidth_basic + areawidth_
&& &&& &&& &else parea-&width = areawidth_
&& &&& &&& &if( (pmap-&mapsizeY - 1) == y ) parea-&height = areaheight_basic + areaheight_
&& &&& &&& &else parea-&height = areaheight_
&& &&& &&& &parea-&step = imgS
&& &&& &&& &parea-&begin = pixelperLine + x*realS
&& &&& &&& &
&& &&& &&&// 估算平均灰度 value(采用 米字 估算)
&& &&& &&& &unsigned char *perline =
&& &&& &&& &unsigned char *pixel =
&& &&& &&& &float count = 0.0f;&& &&& &&& &&& &&& &&& &// 米字像素的总亮度
&& &&& &&& &float factor = (float)(parea-&height) / (float)(parea-&width); // 乘算因子
&& &&& &&& &int j=0, k=0;&& &&& &&& &&& &&& &&& &&& &&& &// 遍历之用
&& &&& &&& &for(k=0;k & parea-&++k)
&& &&& &&& &{
&& &&& &&& &&& &j = (int)(k * factor);
&& &&& &&& &&& &pixel = parea-&begin + k*3;
&& &&& &&& &&& &count += PIXEL_LIGHT( (pixel + parea-&height/2*(parea-&width*3)) );
&& &&& &&& &&& &count += PIXEL_LIGHT( (pixel + j*parea-&step) );
&& &&& &&& &&& &count += PIXEL_LIGHT( (pixel + (parea-&height-j-1)*parea-&step) );
&& &&& &&& &}
&& &&& &&& &perline = parea-&begin + parea-&width*3;
&& &&& &&& &for(j=0;j & parea-&++j)
&& &&& &&& &{
&& &&& &&& &&& &pixel = perline + parea-&
&& &&& &&& &&& &count += PIXEL_LIGHT(pixel);
&& &&& &&& &}
&& &&& &&& &parea-&avevalue = (int)( count / (parea-&width*3 + parea-&height) );
&& &// 现在将 data 链表的内容复制到 ascorder_assist 数组
&& &pmap-&ascorder_assist = new imgArea*[pmap-&mapsizeX * pmap-&mapsizeY];
&& &for( parea=pmap-&data,x=0;parea !=parea = parea-&next,++x )
&& &&& &pmap-&ascorder_assist[x] =
&& &// 将 ascorder_assist 的内容按升序排列
&& &int mapxy = pmap-&mapsizeX * pmap-&mapsizeY;
&& &for(x=0;x &++x)
&& &&& &for(y=0;y & (mapxy-1-x);++y)
&& &&& &&& &if( pmap-&ascorder_assist[y]-&avevalue & pmap-&ascorder_assist[y+1]-&avevalue )
&& &&& &&& &{
&& &&& &&& &&& &parea = pmap-&ascorder_assist[y+1];
&& &&& &&& &&& &pmap-&ascorder_assist[y+1] = pmap-&ascorder_assist[y];
&& &&& &&& &&& &pmap-&ascorder_assist[y] =
&& &&& &&& &}
&&&&&&& 最后调用 multiValeThreshold(...)& 对图像进行二值化。
// 改进后的二值化函数
void multiValeThreshold(
&& &AUX_RGBImageRec *psrc,AUX_RGBImageRec *pdst,
&& &unsigned char *lights,int mapsizeX,int mapsizeY
&& &// 将 prc 复制到 pdst
&& &if( pdst )
&& &&& &if( pdst-&data )
&& &&& &&& &free(pdst-&data); pdst-&data =
&& &&& &free(pdst); pdst=
&& &pdst = new AUX_RGBImageRec( );
&& &pdst-&sizeX = psrc-&sizeX;
&& &pdst-&sizeY = psrc-&sizeY;
&& &int datasize = psrc-&sizeX*psrc-&sizeY*UCHAR_SIZE*3;
&& &pdst-&data = new unsigned char[datasize];
&& &memset(pdst-&data,0,datasize);
&& &memcpy_s(pdst-&data,datasize,psrc-&data,datasize);
&& &// 创建一个局部变量对pdst进行二值化处理
&& &imgMap *pmap = createimgMap(pdst, lights,mapsizeX,mapsizeY,TRUE);
&& &imgArea *parea =&& &&& &&& &&& &&& &// 遍历 imgMap 指针
&& &unsigned char *pixelperLine = // 遍历 imgArea 指针
&& &unsigned char *pixel =
&& &int x=0,y=0;
&& &for( parea=pmap-&parea !=parea=parea-&next )
&& &&& &for(y=0;y & parea-&++y)
&& &&& &&& &// pixelperLing 始终指向每行的第一个像素的地址
&& &&& &&& &pixelperLine = parea-&begin + y*(parea-&step);
&& &&& &&& &for(x=0;x & parea-&++x)
&& &&& &&& &{
&& &&& &&& &&& &pixel = pixelperLine + x*UCHAR_SIZE*3;
&& &&& &&& &&& &( (PIXEL_LIGHT(pixel)) & (float)(parea-&selvalue) )? SETPIXEL_MAX(pixel):SETPIXEL_ZERO(pixel);
&& &&& &&& &}
本篇结束。
如有任何错误或者更好的方法或建议,欢迎指正
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:61110次
排名:千里之外
原创:30篇
(1)(1)(1)(1)(2)(2)(5)(2)(5)(3)(2)(3)(3)(6)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。}

我要回帖

更多关于 opencv 转灰度图 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信