问一个图像每像素位数问题。在线等。多谢

newcodinger 2009-03-16 04:48:55
小弟正在在做一个图像处理的程序。现得到的一个bmp图像。图像是RGB格式。请问这时候的每像素不是占3个字节共24位吗?结果我读取bmp文件的头中的biBitCount是16.也就是说16位表示RGB色彩?那我如果得到其RGB的分量的值呢。我需要对图像做SUSAN边缘检测。已得到其代码是只对8位的灰度图进行操作。我怎么将这个图像转换为8位的位图呢。
第二点是,我的图像既然是16位,但是我通过下面程序测试。(我是完全以24位的方式处理的,结果却很理想)。不知原因是什么?
由于刚接触图像,对位图不是很了解。一个像素到底是用多少位来表示,听同学说,还有可能每像素中空余了一些位不用。位图的调色板是不是在低于24位的时候都需要有,还是也可以不用调色板?
void CBinaryDlg::BestThreshold(IplImage *image, int *flagArray)
{
int w = image->width;
int h = image->height;

unsigned char *np; // 图像指针
unsigned char pixel;

int iteration;
int Threshold,NewThreshold; // 阈值
int MaxGrayValue ,MinGrayValue,MeanGrayValue1,MeanGrayValue2;

long IP1,IP2,IS1,IS2;

IP1=0;
IP2=0;
IS1=0;
IS2=0;

int ihist[256]; // 图像直方图,256个点

//标记数组初始化
flagArray=new int[image->width*image->height*3];
memset(flagArray,0,image->width*image->height*sizeof(int)*3);

// 对直方图置零...
memset(ihist, 0, sizeof(ihist));

MaxGrayValue=0;MinGrayValue=255;
Threshold=1;
iteration=0;

//得到直方图
for (int i=0;i<h;i++)
{
np = (unsigned char*)(image->imageData + image->widthStep*i);//widthstep为每行的宽度
for (int j=0;j<w*3;j=j+3)
{
pixel = np[j];
ihist[ pixel]++;
if (MaxGrayValue<pixel)
{
MaxGrayValue=pixel;
}
if (MinGrayValue>pixel)
{
MinGrayValue=pixel;
}
}
}

NewThreshold=(MinGrayValue+MaxGrayValue)/2;
while (Threshold != NewThreshold && iteration<100)
{
Threshold=NewThreshold;
//根据阈值分割背景和目标两部分,求出两部分的平均灰度
for (int i=MinGrayValue;i<=Threshold;i++)
{
IP1+=ihist[i]*i;
IS1+=ihist[i];
}
MeanGrayValue1=(IP1/IS1);
for (int j=Threshold+1;j<=MaxGrayValue;j++)
{
IP2+=ihist[j]*j;
IS2+=ihist[j];
}
MeanGrayValue2=(IP2/IS2);
NewThreshold=(MeanGrayValue1+MeanGrayValue2)/2;
iteration++;
}

//二值化图像
for (int k = 0; k < h; k++)
{
np = (unsigned char*)(image->imageData + image->widthStep*k);
for (int j = 0; j < w*3; )
{
if(np[j] >= Threshold)
{
//黑色->环境
np[j++] = 0;
np[j++] = 0;
np[j++] = 0;
}
else
{
//白色->代识别物体
flagArray[k*h+j]=1;
np[j++] = 255;
np[j++] = 255;
np[j++] = 255;
}
}
}
}
...全文
1434 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
liang3405 2011-09-23
  • 打赏
  • 举报
回复
16色的比较简单
chen2009zhou 2011-09-23
  • 打赏
  • 举报
回复
路过来看看
cnzdgs 2009-03-17
  • 打赏
  • 举报
回复
16位色是用2字节(二进制16位)表示一个像素的颜色,其中中间6位是G,高、低5位是R和B,用位运算可以将其分离。简单的转换方式是分离后R和B左移3位,G左移2位;复杂点的转换可以把分离后的值分别乘以255,再分别除以31、63、31。
sunnyplain 2009-03-17
  • 打赏
  • 举报
回复
代码太长,没看
楼上已经说了16位转24位的方法,具体代码可以参看http://topic.csdn.net/u/20081122/10/2c695d68-03b8-4d51-8d4e-3a588a9123b2.html

一般来说做图像处理,直接每个像素值除以256再取整就可以了,至于你按24做为什么还正常,那你自己解释吧
其实matlab里可以读任意格式的图片,也可以进行任意格式间的转换,还有源代码
newcodinger 2009-03-16
  • 打赏
  • 举报
回复
有没有更详细点的。楼上的说法可靠不?但是为什么用acdsee把24位转成8位后,图像大小还是不变呢。难道一个像素占的空间大小还是没有变?
再次顶起...
youwill 2009-03-16
  • 打赏
  • 举报
回复
你可以用别人的程序比如acdsee看看到底是几位的位图,位图的调色板设么时候都有,24位也可以用,只不过没必要用,调色板不过是个索引。
newcodinger 2009-03-16
  • 打赏
  • 举报
回复
高手们。救命啊。

4,506

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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