Измените 16-битное изображение в градациях серого на Color Image, используя OpenCV и C ++ - PullRequest
0 голосов
/ 04 июня 2018

Я новичок в openCV и пытаюсь преобразовать изображение 16 bit grayscale в цветное изображение с использованием цветовой гаммы.Я сделал эту операцию, когда у меня есть 8 bit изображение, но теперь я выбираю кадр изображения с тепловой камеры, который дает мне 16-битный кадр, и я не могу преобразовать это в 8 bit, потому что это снижает качество изображения, котороебесполезно.В 8 bit изображении я использую функцию LUT для выполнения этой задачи.

Моя таблица поиска Код для 8-битного изображения

    Mat palette, im;
    palette = imread("1.bmp", IMREAD_COLOR);
    im = imread("C:\\Users\\Chandrapal Singh\\Desktop\\New folder\\IMG_0_10_34_45_2018_1.bmp", IMREAD_GRAYSCALE);
    im.convertTo(im, CV_16U);
    cvtColor(im.clone(), im, COLOR_GRAY2BGR);
    double scale = (double)palette.rows / 256;
    uchar b[256], g[256], r[256];
    int i = 0;
    for (double x = 1; x <= palette.rows;) {

        b[i] = palette.at<Vec3b>((int)x, palette.cols / 2)[0];
        g[i] = palette.at<Vec3b>((int)x, palette.cols / 2)[1];
        r[i] = palette.at<Vec3b>((int)x, palette.cols / 2)[2];
        i++;
        x += scale;
    }

    Mat channels[] = { Mat(256,1, CV_8U, b), Mat(256,1, CV_8U, g), Mat(256,1, CV_8U, r) };
    Mat lut;
    cv::merge(channels, 3, lut);

    Mat color;
    cv::LUT(im, lut, color);

В приведенном выше коде palette - это цветовая гамма, а im - это изображение в градациях серого.Я читаю цвет палитры и помещаю его в lut, а затем с помощью функции LUT просто создаю цветное изображение.

Итак, кто-нибудь может мне помочь, как я могу сделать выше с 16-битным изображением.Заранее спасибо.

Когда я запускаю этот код, я получаю исполнение, которое говорит: -

Я получаю исключение, которое говорит Assertion failed ((lutcn == cn || lutcn == 1) && _lut.total() == 256 && _lut.isContinuous() && (depth == 0 || depth == 1)) in cv:: LUT

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

LUT быстро и грязно:

Mat gray = imread("gray.tif", IMREAD_ANYDEPTH);
Mat palette = imread("palette.png", IMREAD_COLOR);

Mat color(gray.size(), CV_8UC3);
Vec3b lut[65536];

double scale = (double)palette.rows / 65536;
int i = 0;
for (double x = 1; x <= palette.rows;)
{
    lut[i] = palette.at<Vec3b>((int)x, 0);
    i++;
    x += scale;
}

for (int j = 0; j < gray.rows; j++)//rows
    for (int i = 0; i < gray.cols; i++)//cols
        color.at<Vec3b>(j, i) = lut[gray.at<ushort>(j, i)];

imwrite("color_lut.tif", color);
0 голосов
/ 07 июня 2018

Код для создания 8-битного цветного изображения из 16-битной шкалы серого.Отображает белый на красный и черный на синий.

#include "opencv2/imgcodecs.hpp"

using namespace cv;
using namespace std;

float a;

Vec3b getBGR(float _val) //unique values only if a >= ~ 0.3 ~= 300 / float(1024);
{   //from /2626600/algoritm-preobrazovaniya-rgb-v-hsv-i-hsv-v-rgb-v-diapazone-0-255-dlya-oboih
    float H = a*_val;
    float S = 1;
    float V = 1;

    double      hh, p, q, t, ff;
    long        i;
    Vec3b BGR;

    if (S <= 0.0)
    {       
        BGR[2] = V * 255;//R
        BGR[1] = V * 255;//G
        BGR[0] = V * 255;//B
        return BGR;
    }
    hh = H;
    if (hh >= 360.0) hh = 0.0;// not sure about that
    hh /= 60.0;
    i = (long)hh;
    ff = hh - i;
    p = V * (1.0 - S);
    q = V * (1.0 - (S * ff));
    t = V * (1.0 - (S * (1.0 - ff)));

    switch (i)
    {
    case 0:
        BGR[2] = V * 255;
        BGR[1] = t * 255;
        BGR[0] = p * 255;
        break;
    case 1:
        BGR[2] = q * 255;
        BGR[1] = V * 255;
        BGR[0] = p * 255;
        break;
    case 2:
        BGR[2] = p * 255;
        BGR[1] = V * 255;
        BGR[0] = t * 255;
        break;

    case 3:
        BGR[2] = p * 255;
        BGR[1] = q * 255;
        BGR[0] = V * 255;
        break;
    case 4:
        BGR[2] = t * 255;
        BGR[1] = p * 255;
        BGR[0] = V * 255;
        break;
    case 5:
    default:
        BGR[2] = V * 255;
        BGR[1] = p * 255;
        BGR[0] = q * 255;
        break;
    }

    return BGR;
}

void color_from_gray(Mat& gray, Mat& color)
{   
    double minVal, maxVal;
    minMaxLoc(gray, &minVal, &maxVal);

    //HSV range from 0 (red) to 240 (blue)
    a = 240 / (maxVal - minVal);//global variable!

    MatIterator_<ushort> it, end;
    MatIterator_<Vec3b> iit = color.begin<Vec3b>();//not the most efficient way to iterate
    for (it = gray.begin<ushort>(), end = gray.end<ushort>(); it != end; ++it, ++iit) 
        *iit = getBGR(maxVal - *it);
}

int main(int argc, char** argv)
{
    Mat gray = imread("gray.tif", IMREAD_ANYDEPTH);

    Mat color(gray.size(), CV_8UC3);

    color_from_gray(gray, color);

    imwrite("color.tif", color);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...