数字图像处理12--比特平面分层,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

猜你喜欢

转载自blog.csdn.net/cyf15238622067/article/details/87790223