数字图像处理学习笔记(五)图像分层(c++语言)

参考文献:数字图像处理(第三版)(第四版)   美RafaelC.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,这也是为什么原作者说高位能保存更多的信息。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值