参考文献:数字图像处理(第三版)(第四版) 美Rafael,C.,Gonzalez(拉斐尔,C.,冈萨雷斯) 著
图像分层,简而言之就是将图像的每一个像素的8位都拆了。拆成8张图像来处理。
原书说的是二值图像。但实际上,windows哪有二值图像的格式啊,反正才疏学浅的我采用的是BMP格式。那怎么拆呢?网上众说纷纭。我提供的一个解决方案是,你不是八位图像么比如两个像素1100-0000,0111-1111,那么比如你最高阶的图像那他肯定也是存储两个像素。第一个像素1100-0000,它的最高位为1,所以存储为1000-0000,第二个像素0111-1111最高位不为0,所以存储为0。 这样的好处是你分层后的八张图像合起来后确实为原始图像。
补充说明:位运算后的结果为1个byte的值,在C++中,好像不支持1个字节的=和!=运算,所以你位运算后,要符号扩展下。
对应代码如下:
void bmp::produce_bit_plane_slicing_bmp_file(int signficant)
{
string s_temp=to_string(signficant);
byte b_temp=1;
b_temp=b_temp<<signficant;
string bit_plane_slicing_file_name;//通过位运算判断对应位是否为1
int flag;//用于将位运算的结果符号扩展,方便if判断
for(int i=0;i<file_name.length()-4;++i)
{
bit_plane_slicing_file_name+=file_name[i];
}
bit_plane_slicing_file_name+="_bit_";
bit_plane_slicing_file_name+=s_temp;
bit_plane_slicing_file_name+=".bmp";
for(int i=0;i<image_heigth;++i)
for (int j = 0; j < image_width; ++j)
for(int k=0;k<byte_count;++k)
{
flag = pixel[i][j][k] & b_temp;//将位运算的结果符号扩展,方便if判断
if (flag)
{
pixel_temp[i][j][k] = b_temp;
}
else
{
pixel_temp[i][j][k] = 0;
}
}
produce_bmp_file(pixel_temp,image_width,image_heigth,byte_count,bit_plane_slicing_file_name);
}
示例:
原图像
最高位
第二高位
第三高位
在往后就没法看了,全是黑色,因为像素0就是纯黑,低位的像素就是0,这也是为什么原作者说高位能保存更多的信息。