将灰度转换为Rgb

时间:2020-01-11 20:10:50

标签: c++ bitmap rgb grayscale

Here is my full code code-代码的摘录在问题的底部。

我对函数migrate_1 | WARNING: Flyway upgrade recommended: PostgreSQL 12.1 is newer than this version of Flyway and support has not been tested. migrate_1 | WARNING: Skipping filesystem location:/user/path/to/my/project/common/migrations (not found) error.create_seq(list(dict.values())) 有疑问。我需要将灰度的位图转换为rgb。

有一张表格,显示位图应如何从std::vector<py::object> = dict.cast<std::vector<py::object>>(); 转换为#pragma omp parallel。运行以下代码片段显示应如何转换位图:

policz

我需要转换的图片: enter image description here

koloruj

我猜这两个功能中的代码我都犯了错误,这使我感到紧张

1 个答案:

答案 0 :(得分:0)

首先,您的程序正在泄漏内存。尝试远离使用new。改用智能指针。这是您的main()的摘要,使用了std::unique_ptr

std::unique_ptr<uint8_t[]> pixmap =
    std::make_unique<uint8_t[]>(PictureInfo.biSizeImage / 3);

std::unique_ptr<kolor[]> kolormap =
    std::make_unique<kolor[]>(PictureInfo.biSizeImage / 3);

odczytaj_obraz(obraz, pixmap.get(), PictureInfo);
koloruj(pixmap.get(), kolormap.get(), PictureInfo);

第二,您对BITMAPFILEHEADERBITMAPINFOHEADER的定义不正确。复制并转换后,它们应如下所示:

using WORD = uint16_t;
using DWORD = uint32_t;
using LONG = int32_t;

struct BITMAPFILEHEADER {
    WORD bfType;
    DWORD bfSize;
    WORD bfReserved1;
    WORD bfReserved2;
    DWORD bfOffBits;
};

struct BITMAPINFOHEADER {
    DWORD biSize;
    LONG biWidth;
    LONG biHeight;
    WORD biPlanes;
    WORD biBitCount;
    DWORD biCompression;
    DWORD biSizeImage;
    LONG biXPelsPerMeter;
    LONG biYPelsPerMeter;
    DWORD biClrUsed;
    DWORD biClrImportant;
};

在进行实际转换时,如果我正确地读取了表格,则可以简化为:

<table align="center"><tr><b><th align="center">n</th><th align="center">r<sub>n</sub></th><th align="center">g<sub>n</sub></th><th align="center">b<sub>n</sub></th></b></tr> <tr><td align="center">0-85</td><td align="center">n*3</td><td align="center">0</td><td align="center">0</td></tr> <tr><td align="center">86-171</td><td align="center">255</td><td align="center">(n-86)*3</td><td align="center">0</td></tr> <tr><td align="center">172-255</td><td align="center">255</td><td align="center">255</td><td align="center">(n-171)*3</td></tr></table>

在这种情况下,转换可以这样完成:

struct rgb_t {
    uint8_t r, g, b;
};

inline uint8_t scale(uint8_t n, uint8_t cutover) {
    return (n-cutover)*3;
}

rgb_t gray2rgb(uint8_t n) {
    static constexpr uint8_t cutover_rg = 86;
    static constexpr uint8_t cutover_gb = 171;

    if(n < cutover_rg) return {scale(n, 0), 0, 0};
    if(n <= cutover_gb) return {255, scale(n, cutover_rg), 0};
    return {255, 255, scale(n, cutover_gb)};
}

Demo of gray2rgb()

有趣的值:

n       r       g       b
---------------------------
0       0       0       0
1       3       0       0

85      255     0       0
86      255     0       0
87      255     3       0

170     255     252     0
171     255     255     0
172     255     255     3

254     255     255     249
255     255     255     252

从此输出中,其中n 85 和n 86 给出相同的rgb值,而n 255 不会导致b为255 ,感觉表格应该调整了:

<table align="center"><tr><b><th align="center">n</th><th align="center">r<sub>n</sub></th><th align="center">g<sub>n</sub></th><th align="center">b<sub>n</sub></th></b></tr> <tr><td align="center">0-85</td><td align="center">n*3</td><td align="center">0</td><td align="center">0</td></tr> <tr><td align="center">86-170</td><td align="center">255</td><td align="center">(n-85)*3</td><td align="center">0</td></tr> <tr><td align="center">171-255</td><td align="center">255</td><td align="center">255</td><td align="center">(n-170)*3</td></tr></table>

rgb_t gray2rgb_improved(uint8_t n) {
    static constexpr uint8_t cutover_rg = 85;
    static constexpr uint8_t cutover_gb = 170;

    if(n <= cutover_rg) return {scale(n, 0), 0, 0};
    if(n <= cutover_gb) return {255, scale(n, cutover_rg), 0};
    return {255, 255, scale(n, cutover_gb)};
}

Demo of gray2rgb_improved()

现在,这些值将与原始表格不匹配,但会平均填充整个光谱:

n       r       g       b
---------------------------
0       0       0       0
1       3       0       0

84      252     0       0
85      255     0       0
86      255     3       0
87      255     6       0

169     255     252     0
170     255     255     0
171     255     255     3
172     255     255     6

254     255     255     252
255     255     255     255

虽然gray2rgb()可能会执行表中的内容,但是gray2rgb_improved()可能会更好。