美文网首页
8张Gray码图的编解码

8张Gray码图的编解码

作者: 寽虎非虫003 | 来源:发表于2023-08-23 14:39 被阅读0次

参考

参考图

编码

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"

#include <sys/stat.h>
#include <sys/types.h>

using namespace cv;
using namespace std;

/** ***************************************************************************
 * @brief 生成8张图,且每个最小的编码占据8个像素
 *
 * @param[in] savePath
 * @return int
 * ************************************************************************** */
int genGrayImg(std::string &savePath)
{

    int imgNums = 8;   ///< 8张图
    int BaseWidth = 8; ///< 最小的编码宽度

    cv::Mat whiteimg = cv::Mat(1080, 1920, CV_8UC1, Scalar(255));
    imwrite(savePath + "/white.bmp", whiteimg);
    for (int num = 0; num < imgNums; num++)
    {

        cv::Mat Phase_h = cv::Mat(1080, 1920, CV_8UC1);
        cv::Mat Phase_v = cv::Mat(1080, 1920, CV_8UC1);
        for (int i = 0; i < Phase_h.rows; i++)
        {
            for (int j = 0; j < Phase_h.cols; j++)
            {
                uchar v{}, h{};
                uchar vPow{8 - num - 1}, hPow{8 - num - 1};

                int xc = (int)ceil(i / (pow(2, (int)vPow)*BaseWidth)) / 2;
                int yc = (int)ceil(j / (pow(2, (int)vPow)*BaseWidth)) / 2;
                int xmod = xc%2;
                int ymod = yc%2;
                if (ymod==0)
                {
                    v = 0;
                }
                else
                {
                    v = 255;
                }

                if (xmod==0)
                {
                    h = 0;
                }
                else
                {
                    h = 255;
                }

                Phase_h.at<uchar>(i, j) = h;
                Phase_v.at<uchar>(i, j) = v;
            }
        }
        string pa = savePath + "/h_" + to_string(num) + ".bmp";
        imwrite(savePath + "/h_" + to_string(num) + ".bmp", Phase_h);
        imwrite(savePath + "/v_" + to_string(num) + ".bmp", Phase_v);
    }
    return true;
}

int main(int argc, char const *argv[])
{
    std::string path = "gray8";
    mkdir(path.c_str(), S_IRUSR | S_IWUSR | S_IXUSR | S_IRWXG | S_IRWXO);
    genGrayImg(path);
    return 0;
}

解码matlab程序

pics = zeros(1080,1920,8);
path='gray8/h_';
for NC=0:7
    pics(:,:,NC+1) = imread([path,num2str(NC),'.bmp'],'bmp');
end

%% 开始解码
thresh = 127;
bin = (pics>127); %二值化
for NC=2:8
    bin(:,:,NC)=xor(bin(:,:,NC-1),bin(:,:,NC));
end

%% 合成结果图
result =zeros(1080,1920);
for NC=1:8
    result = result+bin(:,:,NC).*(2^(8-NC));
end

mesh(result)
解码效果

解码c++版本,方便移植到cuda

移植的时候把宏注释都打开就行


#include<iostream>
using namespace std;

// #ifdef __CUDACC__
// #define __3D_CUDA_HOST_DEVICE__ __host__ __device__ __forceinline__
// #else
#define __3D_CUDA_HOST_DEVICE__
// #endif

struct uint8bit
{
    unsigned int gray1 : 1; ///< 第一张图的解析出来的gray码,下面一次是2~8
    unsigned int gray2 : 1;
    unsigned int gray3 : 1;
    unsigned int gray4 : 1;
    unsigned int gray5 : 1;
    unsigned int gray6 : 1;
    unsigned int gray7 : 1;
    unsigned int gray8 : 1;

    // 给方法全部加上限定宏,在cuda上运行
    __3D_CUDA_HOST_DEVICE__  uint8bit()
        : gray1(0), gray2(0), gray3(0), gray4(0),
          gray5(0), gray6(0), gray7(0), gray8(0)
    {
    }

    __3D_CUDA_HOST_DEVICE__  uint8bit(const uint8bit &u)
        : gray1(u.gray1), gray2(u.gray2), gray3(u.gray3), gray4(u.gray4),
          gray5(u.gray5), gray6(u.gray6), gray7(u.gray7), gray8(u.gray8)
    {
    }

    __3D_CUDA_HOST_DEVICE__ uint8bit(const unsigned char &data)
    {
        gray1 = ((uint8bit*)&data)->gray1;
        gray2 = ((uint8bit*)&data)->gray2;
        gray3 = ((uint8bit*)&data)->gray3;
        gray4 = ((uint8bit*)&data)->gray4;
        gray5 = ((uint8bit*)&data)->gray5;
        gray6 = ((uint8bit*)&data)->gray6;
        gray7 = ((uint8bit*)&data)->gray7;
        gray8 = ((uint8bit*)&data)->gray8;
    }

    /** ***************************************************************************
     * @brief 
     * 
     * @return uint8bit 
     * ************************************************************************** */
    __3D_CUDA_HOST_DEVICE__ uint8bit list_xor()
    {
        gray7 = gray8^gray7;   
        gray6 = gray7^gray6;   
        gray5 = gray6^gray5;   
        gray4 = gray5^gray4;   
        gray3 = gray4^gray3;   
        gray2 = gray3^gray2;   
        gray1 = gray2^gray1;   
        return *this;
    }

    __3D_CUDA_HOST_DEVICE__ unsigned char uint8()
    {
        return *(unsigned char *)this;
    }

};



int main(int argc, char const *argv[])
{
    unsigned char zero{0},seven{7};
    uint8bit u0(zero),u7(seven);
    cout<<(int)u0.uint8()<<endl;
    cout<<(int)u7.uint8()<<endl;

    uint8bit u_0 = u0.list_xor();
    uint8bit u_7 = u7.list_xor();

    cout<<(int)u_0.uint8()<<endl;
    cout<<(int)u_7.uint8()<<endl;


    return 0;
}

测试结果

0
7
0
5

相关文章

网友评论

      本文标题:8张Gray码图的编解码

      本文链接:https://www.haomeiwen.com/subject/auppmdtx.html