问一个图像每像素位数问题。在线等。多谢
小弟正在在做一个图像处理的程序。现得到的一个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;
}
}
}
}