700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 灰度图转伪彩色图

灰度图转伪彩色图

时间:2021-03-04 20:01:32

相关推荐

灰度图转伪彩色图

原文:/ywcpig/article/details/46547123

前言

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

代码

[cpp]view plain copy print? #include<opencv2/opencv.hpp>usingnamespacecv;usingnamespacestd;MatscaleGray(constMat&inputGray){MatoutputGray(inputGray.size(),CV_8U);unsignedchargrayValue,maxValue=1;for(inty=0;y<inputGray.rows;y++)for(intx=0;x<inputGray.cols;x++){grayValue=inputGray.at<uchar>(y,x);maxValue=max(maxValue,grayValue);}floatscale=255.0/maxValue;for(inty=0;y<inputGray.rows;y++)for(intx=0;x<inputGray.cols;x++){outputGray.at<uchar>(y,x)=static_cast<unsignedchar>(inputGray.at<uchar>(y,x)*scale+0.5);}returnoutputGray;}Matgray2pseudocolor(constMat&scaledGray){MatoutputPseudocolor(scaledGray.size(),CV_8UC3);unsignedchargrayValue;for(inty=0;y<scaledGray.rows;y++)for(intx=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);}returnoutputPseudocolor;}/**colorRGBgray*red25500255*orange2551270204*yellow2552550153*green02550102*cyan025525551*blue002550**/Matgray2rainbow(constMat&scaledGray){MatoutputRainbow(scaledGray.size(),CV_8UC3);unsignedchargrayValue;for(inty=0;y<scaledGray.rows;y++)for(intx=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;}elseif(grayValue<=102){grayValue-=51;pixel[0]=255-grayValue*5;pixel[1]=255;pixel[2]=0;}elseif(grayValue<=153){grayValue-=102;pixel[0]=0;pixel[1]=255;pixel[2]=grayValue*5;}elseif(grayValue<=204){grayValue-=153;pixel[0]=0;pixel[1]=255-static_cast<unsignedchar>(grayValue*128.0/51+0.5);pixel[2]=255;}elseif(grayValue<=255){grayValue-=204;pixel[0]=0;pixel[1]=127-static_cast<unsignedchar>(grayValue*127.0/51+0.5);pixel[2]=255;}}returnoutputRainbow;}intmain(intargc,char*argv[]){if(argc<5){cout<<"Usage:./gray2rgbinputGrayscaledGraypseudocolorrainbow"<<endl;return0;}MatinputGray=imread(argv[1],0);MatscaledGray=scaleGray(inputGray);Matpseudocolor=gray2pseudocolor(scaledGray);Matrainbow=gray2rainbow(scaledGray);imwrite(argv[2],scaledGray);imwrite(argv[3],pseudocolor);imwrite(argv[4],rainbow);return0;}

#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* red255 0 0 255* orange 255 127 0 204* yellow 255 255 0 153* green 0 255 0 102* cyan0 255 255 51* blue0 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;}

结果

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。