图像的深度
图像由像素构成,每个像素位数据占用位数即图像的深度,单通道(1字节)图像深度为8位对应opencv 8UC1,三通道(3字节)图像对应深度24,8UC3。1位图即二值图只有黑白两种颜色,不为0就为1。8位图有256种颜色从0(纯黑)到255(纯白)过渡。
比特平面分层
比特图像分层便是将灰度图像的像素位数进行分别读取,一幅8比特图像可考虑为由8个1比特平面组成。
一副8比特灰度图由八个1比特平面组成,如一个十进制灰度194,它的二进制表示为: 11000010,,则从最高阶比特平面开始,这个像素点对应的灰度值分别为1、1、0、0、0、0、1、0。
8th 比特平面
比特值为0 —— 对应灰度值0 ~ 127
比特值为1 —— 对应灰度值128 ~ 255
7th 比特平面
比特值为0 —— 对应灰度值0 ~ 63、128 ~ 191
比特值为1 —— 对应灰度值64 ~ 127、192 ~ 255
6th比特平面
比特值为0 —— 对应灰度值0 ~ 31 64 ~ 95、128 ~ 159 、192 ~ 223
比特值为1 —— 对应灰度值32 ~ 63、96 ~ 127 、160 ~ 191 、224 ~ 255
5th比特平面
比特值为0 —— 【0,15】【32,47】【64,79】【96,111】【128,143】【160,175】【192,207】【224,239】
比特值为1 —— 【16,31】【48,63】【80,95】【110,127】【144,159】【176,191】【208,221】【240,255】
4th比特平面
比特值为0 —— 【0,7】【16,23】【32,39】【48,55】。。。【239,247】
比特值为1 —— 【8,15】【24,31】【40,47】【56,63】。。。【248,255】
3rd比特平面
比特值为0 —— 【0,3】【8,11】【16,19】【24,27】.。。。【248,251】
比特值为1 —— 【4,7】【12,15】【20,23】【28,31】。。。【252,255】
2nd比特平面
比特值为0 —— 【0,1】【4,5】【8,9】【12,13】。。。【252,253】
比特值为1 —— 【2,3】【6,7】【10,11】【14,15】。。。【254,255】
1st比特平面
比特值为0——0、2、4、6、8、10、…、254
比特值为1——1、3、5、7、9、11、…、255
应用
①突出特定比特层(灰度级范围)来突出整个图像的外观。
②图像压缩:如将图像中5/6/7/8阶比特平面的信息保留后将图像重建,可通过50%的储存量体现图像绝大部分的外观信息;图像重建的过程是将第n个比特平面的像素值乘以2的n-1次幂后叠加。
代码
/*bit平面分层*/
/*十进制数转二进制数*/
void num2Binary(int num, int b[8]){
int i;
for ( i = 0; i < 8; i++){
b[i] = 0;
}
i = 0;
while (num!=0){
b[i] = num % 2;
num = num / 2;
i++;
}
}
/***************************
num_bit - 指定bit平面
num_bit = 1~8
num_bit=1,即输出第1个Bit平面
****************************/
void Bitplane_stratification(cv::Mat& src,cv::Mat& B , int num_Bit){
int b[8];//8个二进制bit位
if (src.channels()>1)
cv::cvtColor(src, src, CV_RGB2GRAY);
B.create(src.size(), src.type());
for (int i = 0; i < src.rows; i++){
const uchar* ptr_src = src.ptr<uchar>(i);
uchar* ptr_B = B.ptr<uchar>(i);
for (int j = 0; j < src.cols; j++){
num2Binary(ptr_src[j], b);
ptr_B[j] = b[num_Bit - 1]*255; //0和1灰度差别太小,乘255便于视觉观察
}
}
}