灰度图是一个由像素组成的矩阵,目前大部分的灰度图中的像素用1B存储即8bit,比特平面分层的意思是将所有像素的相同比特拿出来单独组成一个矩阵,这样就会有八个矩阵。根据冈萨雷斯的《数字图像处理》,高比特部分的图像所含信息量大,而低比特部分所含信息量少。这样的理论对于以后做计算机视觉或者图像压缩很有帮助。代码如下:
// 比特平面分层.cpp: 实现灰度图的比特平面分层
//
#include "stdafx.h"
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int b[8];
void binary(int num)
{
for (int i = 0; i < 8; i++)
b[i] = 0;
int i = 0;
while (num != 0)
{
b[i] = num % 2;
num = num / 2;
i++;
}
}
int main()
{
Mat srcImage = imread("meiyuan.jpg", 0);
Mat d1, d2, d3, d4, d5, d6, d7, d8;
d1.create(srcImage.size(), CV_8UC1); d2.create(srcImage.size(), CV_8UC1); d3.create(srcImage.size(), CV_8UC1); d4.create(srcImage.size(), CV_8UC1);
d5.create(srcImage.size(), CV_8UC1); d6.create(srcImage.size(), CV_8UC1); d7.create(srcImage.size(), CV_8UC1); d8.create(srcImage.size(), CV_8UC1);
int rowNumber = srcImage.rows,colNumber=srcImage.cols;
/*for (int i = 300; i < 350; i++)
{
for (int j = 150; j < 200; j++)
{
int num = srcImage.at<uchar>(i, j);
cout << num << " ";
}
cout << endl;
} */ //用来测试访问像素元素
for(int i=0;i<rowNumber;i++)
for (int j = 0; j < colNumber; j++)
{
int num = srcImage.at<uchar>(i, j);
binary(num);
d1.at<uchar>(i, j) = b[0]*128; d2.at<uchar>(i, j) = b[1]*128; d3.at<uchar>(i, j) = b[2]*128; d4.at<uchar>(i, j) = b[3]*128;
d5.at<uchar>(i, j) = b[4]*128; d6.at<uchar>(i, j) = b[5]*128; d7.at<uchar>(i, j) = b[6]*128; d8.at<uchar>(i, j) = b[7]*128;
} //乘以128的目的是增加对比度,刚开始没有*128的时候一片黑,因为0和1的亮度区别太小了,不利于观察。
imshow("原图", srcImage);
imshow("第一层比特图", d1); imshow("第二层比特图", d2); imshow("第三层比特图", d3); imshow("第四层比特图", d4);
imshow("第五层比特图", d5); imshow("第六层比特图", d6); imshow("第七层比特图", d7); imshow("第八层比特图", d8);
imwrite("1.jpg", d1); imwrite("2.jpg", d2); imwrite("3.jpg", d3); imwrite("4.jpg", d4);
imwrite("5.jpg", d5); imwrite("6.jpg", d6); imwrite("7.jpg", d7); imwrite("8.jpg", d8);
waitKey(0);
system("pause");
return 0;
}
原图像:
我是以灰度图读入,第八个比特平面图如下:
第七个:
第六个:
第五个:
第四个:
第三个:
第二个:
第一个:
很明显,从上面的这些能看出越低的比特平面所含的信息量越少。