【求助】关于24位图读取灰度值问题 讨论

clkz01 2013-11-15 11:44:53
原来一直做的是8位图,现在改成24位图了,以下是获取灰度值方法,大家来看对不对,谢谢了。
1.首先打开一张24位BMP图,将读到的数据保存在m_pDibBits中。
定义:unsigned char *m_pDibBits;
2.将图转为灰度图像
unsigned char*	lpSrc1;
unsigned char* lpSrc2;
double result=0;

for (int i = 0; i < m_height; i++)
{
lpSrc1 = (unsigned char *)m_pDibBits + m_width *3* i;
for(int j = 0; j < m_width; j++)
{
lpSrc2 = lpSrc1+j*3;
result=0.114*(*(lpSrc2+0))+0.587*(*(lpSrc2+1))+0.3*(*(lpSrc2+2));
*(lpSrc2+0)=(BYTE)result;
*(lpSrc2+1)=(BYTE)result;
*(lpSrc2+2)=(BYTE)result;
}
}

3.进行图像的二值化
	unsigned char* lpSrc;

for(int i = 0; i <m_height*m_width*lBitCount/8; i++)
{

if(m_pDibBits[i]>thresholdValue)
m_pDibBits[i]=255;
else
m_pDibBits[i]=0;
}

4.循环去找寻图像亮值
这段代码该如何写呢?
...全文
142 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
clkz01 2013-11-15
  • 打赏
  • 举报
回复
引用 9 楼 memeai 的回复:
[quote=引用 4 楼 clkz01 的回复:] [quote=引用 3 楼 memeai 的回复:] [quote=引用 2 楼 memeai 的回复:] 置灰二值化都完成了应该很好写了呀。
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
话说上面的x和y好像写反了,你看着改改应该就能用了[/quote] 没有看到有错呀。 if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?[/quote] 我是说我把x和y 的顺序写错了,应该是x对应m_width,y对应m_Hight,其余都对。 另外,上面程序遍历亮点的时候只是输出了坐标值,并没有记录,你要是需要记录,就把x和y 分别push到两个vector里面,然后分别去取vector的平均值,就得到亮点坐标的均值。。。。 [/quote] 恩好的,正在把值记录在vector里面。 应该是这样哇 是输出的时候 printf("xPos = %d,yPos = %d",x,y/lbitCount*8); 改为 printf("xPos = %d,yPos = %d",y/lbitCount*8,,x);
memeai 2013-11-15
  • 打赏
  • 举报
回复
引用 4 楼 clkz01 的回复:
[quote=引用 3 楼 memeai 的回复:] [quote=引用 2 楼 memeai 的回复:] 置灰二值化都完成了应该很好写了呀。
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
话说上面的x和y好像写反了,你看着改改应该就能用了[/quote] 没有看到有错呀。 if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?[/quote] 我是说我把x和y 的顺序写错了,应该是x对应m_width,y对应m_Hight,其余都对。 另外,上面程序遍历亮点的时候只是输出了坐标值,并没有记录,你要是需要记录,就把x和y 分别push到两个vector里面,然后分别去取vector的平均值,就得到亮点坐标的均值。。。。
clkz01 2013-11-15
  • 打赏
  • 举报
回复
引用 7 楼 zhujun007007 的回复:
[quote=引用 6 楼 clkz01 的回复:] [quote=引用 5 楼 zhujun007007 的回复:] 目测是对的,LZ有什么问题?
哦,对的就好。主要是通过找寻图像的中心,比如这个图 用这个代码就可以找出图像的中心吗?
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
[/quote] 这段代码注释写的很清楚了,就是遍历整个图像,输出图像中像素值为255的亮点的坐标。不是找图像的中心。图像的中心也不用找啊,图像的中心不就是图像的中心点吗?[/quote] 通过遍历整个图像的亮点,记住起亮点的始点和终点,然后运算后得出中心位置,是这样的吧。
如雪残阳 2013-11-15
  • 打赏
  • 举报
回复
引用 6 楼 clkz01 的回复:
[quote=引用 5 楼 zhujun007007 的回复:] 目测是对的,LZ有什么问题?
哦,对的就好。主要是通过找寻图像的中心,比如这个图 用这个代码就可以找出图像的中心吗?
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
[/quote] 这段代码注释写的很清楚了,就是遍历整个图像,输出图像中像素值为255的亮点的坐标。不是找图像的中心。图像的中心也不用找啊,图像的中心不就是图像的中心点吗?
clkz01 2013-11-15
  • 打赏
  • 举报
回复
引用 5 楼 zhujun007007 的回复:
目测是对的,LZ有什么问题?

哦,对的就好。主要是通过找寻图像的中心,比如这个图

用这个代码就可以找出图像的中心吗?
for(int x=0; x<m_height;x++)
{
for(int y=0; y<m_width*lbitCount/8;y++)
{
if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)
// 输出亮点坐标
printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
}
}
如雪残阳 2013-11-15
  • 打赏
  • 举报
回复
目测是对的,LZ有什么问题?
clkz01 2013-11-15
  • 打赏
  • 举报
回复
引用 3 楼 memeai 的回复:
[quote=引用 2 楼 memeai 的回复:] 置灰二值化都完成了应该很好写了呀。
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
话说上面的x和y好像写反了,你看着改改应该就能用了[/quote] 没有看到有错呀。 if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)?这句?
memeai 2013-11-15
  • 打赏
  • 举报
回复
引用 2 楼 memeai 的回复:
置灰二值化都完成了应该很好写了呀。
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
话说上面的x和y好像写反了,你看着改改应该就能用了
memeai 2013-11-15
  • 打赏
  • 举报
回复
置灰二值化都完成了应该很好写了呀。
for(int x=0; x<m_height;x++)
   {
     for(int y=0; y<m_width*lbitCount/8;y++)
       {
         if(m_pDbiBits[x*m_width*lbitCount/8+y]==255)  
             // 输出亮点坐标
	     printf("xPos = %d,yPos = %d",x,y/lbitCount*8);
       }
   }
肆水東澤 2013-11-15
  • 打赏
  • 举报
回复
你怎么不用opencv二值化的函数呢

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧