灰度图转伪彩色图

前言

人类能够观察到的光的波长范围是有限的,并且人类视觉有一个特点,只能分辨出二十几种灰度,也就是说即使采集到的灰度图像分辨率超级高,有上百个灰度级,但是很遗憾,人们只能看出二十几个,也就是说信息损失了五十倍。但人类视觉对彩色的分辨能力相当强,能够分辨出几千种色度。 


代码

#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;

Mat scaleGray(const Mat& inputGray)
{
    Mat outputGray(inputGray.size(), CV_8U);
    unsigned char grayValue, maxValue = 1;
    for (int y = 0; y < inputGray.rows; y++)
        for (int x = 0; x < inputGray.cols; x ++)
        {
            grayValue = inputGray.at<uchar>(y, x);
            maxValue = max(maxValue, grayValue);
        }
         
    float scale = 255.0 / maxValue;   
    for (int y = 0; y < inputGray.rows; y++)
        for (int x = 0; x < inputGray.cols; x ++)
        {
            outputGray.at<uchar>(y, x) = static_cast<unsigned char>(inputGray.at<uchar>(y, x) * scale + 0.5);
        }

    return outputGray;
}

Mat gray2pseudocolor(const Mat& scaledGray)
{
    Mat outputPseudocolor(scaledGray.size(), CV_8UC3);
    unsigned char grayValue;
    for (int y = 0; y < scaledGray.rows; y++)
        for (int x = 0; x < scaledGray.cols; x++)
        {
            grayValue = scaledGray.at<uchar>(y, x);
            Vec3b& pixel = outputPseudocolor.at<Vec3b>(y, x);
            pixel[0] = abs(255 - grayValue);
            pixel[1] = abs(127 - grayValue);
            pixel[2] = abs(0 - grayValue);
        }

    return outputPseudocolor;
}

/*
 * color    R   G   B   gray
 * red      255 0   0   255
 * orange   255 127 0   204
 * yellow   255 255 0   153
 * green    0   255 0   102
 * cyan     0   255 255 51
 * blue     0   0   255 0
 *
*/
Mat gray2rainbow(const Mat& scaledGray)
{
    Mat outputRainbow(scaledGray.size(), CV_8UC3);
    unsigned char grayValue;
    for (int y = 0; y < scaledGray.rows; y++)
        for (int x = 0; x < scaledGray.cols; x++)
        {
            grayValue = scaledGray.at<uchar>(y, x);
            Vec3b& pixel = outputRainbow.at<Vec3b>(y, x);
            if (grayValue <= 51)
            {
                pixel[0] = 255;
                pixel[1] = grayValue * 5;
                pixel[2] = 0;
            }
            else if (grayValue <= 102)
            {
                grayValue -= 51;
                pixel[0] = 255 - grayValue * 5;
                pixel[1] = 255;
                pixel[2] = 0;
            }
            else if (grayValue <= 153)
            {
                grayValue -= 102;
                pixel[0] = 0;
                pixel[1] = 255;
                pixel[2] = grayValue * 5;
            }
            else if (grayValue <= 204)
            {
                grayValue -= 153;
                pixel[0] = 0;
                pixel[1] = 255 - static_cast<unsigned char>(grayValue * 128.0 / 51 + 0.5);
                pixel[2] = 255;
            }
            else if (grayValue <= 255)
            {
                grayValue -= 204;
                pixel[0] = 0;
                pixel[1] = 127 - static_cast<unsigned char>(grayValue * 127.0 / 51 + 0.5);
                pixel[2] = 255;
            }
        }

    return outputRainbow;
}

int main(int argc, char* argv[])
{
    if (argc < 5)
    {
        cout << "Usage: ./gray2rgb inputGray scaledGray pseudocolor rainbow" << endl;
        return 0;
    }

    Mat inputGray = imread(argv[1], 0);
    
    Mat scaledGray = scaleGray(inputGray);
    Mat pseudocolor = gray2pseudocolor(scaledGray);
    Mat rainbow = gray2rainbow(scaledGray);

    imwrite(argv[2], scaledGray);
    imwrite(argv[3], pseudocolor);
    imwrite(argv[4], rainbow);

    return 0;
}


结果





  • 7
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnjoyCodingAndGame

愿我的知识,成为您的财富!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值