OpenCV比特平面分层 C++
• 位平面切片 假设图像中每个像素的灰度级是256,这可以用8位来表 示,假设图像是由8个1位平面组成,范围从位平面0到位 平面7。其中,位平面0包含图像中像素的最低位,位平面 7包含像素的最高位
代替突出灰度级范围,我们可以突出特定比特来为整个图像外观作出贡献(理解这一点很重要)一副8比特灰度图可考虑分层1到8个比特平面。很容易理解的是,4个高阶比特平面,特别是最后两个比特平面,包含了在视觉上很重要的大多数数据。而低阶比特平面则在图像上贡献了更精细的灰度细节。
使用例程图片测试:
代码:
// 比特平面分层.cpp: 实现灰度图的比特平面分层
//
#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("12.tif", 0);
resize(srcImage,srcImage,cv::Size(), 0.5, 0.5);
Mat d[8];
for(int k = 0; k < 8; k++)
d[k].create( srcImage.size(), CV_8UC1 );
int rowNumber = srcImage.rows, colNumber=srcImage.cols;
for(int i=0;i<rowNumber;i++)
for (int j = 0; j < colNumber; j++){
int num = srcImage.at<uchar>(i, j);
binary(num);
for( int k = 0; k < 8; k ++)
d[k].at<uchar>(i,j) = b[k]*255;
}
imshow("src", srcImage);
for( int k = 0; k < 8; k++){
imshow("level"+std::to_string(k), d[k]);
}
waitKey(0);
return 0;
}
结果:
重建的话参考
参考:https://www.cnblogs.com/fordreamxin/p/4621119.html