灰度图转伪彩色图

数字图像处理的作业,利用opencv实现通过灰度隐射将灰度图转化为伪彩色图。

效果大概如下,在最后附带opencv自带函数处理的方法

原图

遍历图

opencv的 applyColorMap 函数处理图像

1. 原理

根据色彩学方面的研究结果,将灰度图像对应到red , green , blue三个通道上,最后将三个通道的颜色值合成为需要显示的RGB颜色值即可。灰度值与三个通道的映射关系如下

粗略的分为四个区间,分别对rgb三种颜色对应的灰度进行映射。再简单的调一下参数使其更加接近真实彩图的样子。

RGB=1:1:1

RGB=1:0.1:-1

具体的映射参数参照和后期的RGB参数调整一定会有更优的选择,主要是掌握方法。

接下来就是具体的实现过程

2. 实现过程

2.1 使用到的方法/函数

2.1.1 imread与imshow

opencv里面读图和现实图像经常会用到的 imread()和imshow()函数

这里只有一点要注意,在读入图像的时候imread的flag参数要为0或者是CV_LOAD_IMAGE_GRAYSCALE

在这里也逼逼一下参数的区别,flag<0是以原图读入 flag=0 是灰度图 flag>0是RGB读入

虽然这是一张灰度图,而且我也只需要单通道图像的参数。opencv读入的灰度图是单通道的,这个可以使用img.channels()返回的参数来验证,当你没有设置imread()参数的时候,虽然看起来是灰度图,但实际上却是3通道的图像

2.1.2 split剥离通道方法

如果是三通道的图像,那么可以使用split()函数提取单通道图像

Mat img = imread("lenna_gray.bmp", 0);namedWindow("原图", WINDOW_AUTOSIZE);cv::imshow("原图", img);vector<Mat> dst(3);//构造容器,用于储存提取的通道split(img, dst);//使用split()函数提取Mat grayImage = dst[0];//容器的储存顺序按照BGR的顺序imshow("gray", grayImage);//查看单通道图像是否成功提取cout<<grayImage.channels()<<endl;//查看通道数

2.1.3 图片容器

创建图片容器的方法

Mat imgBlue = Mat(grayImage.rows, grayImage.cols, CV_8UC3);

2.1.4 通道读写与遍历

创建一个名字为imgBlue的Mat类型,长宽与grayImage相同的8位(0-255)三通道Mat类型变量

int rows = grayImage.rows;;
int cols = grayImage.cols;

这两个int类型是获取Mat类型变量的行数和列数,用于稍后的遍历操作

接着就是重头戏了,是对于单通道和三通道Mat类型的像素遍历,方法又很多种,我这边选择较为简单的at方法。

2.1.4.1 单通道图像反色

附上一个简单的单通道图像反色方法

for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {grayImg.at<uchar>(row, col) = 255 - grayImg.at<uchar>(row, col);}}//grayImg是CV_8UC1类型
2.1.4.2 多通道遍历
Mat imgs;
img.copyTo(imgs);//将img的内容复制到imgs
for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {//对BGR三通道遍历读写imgs.at<Vec3b>(row, col)[2] = imgBlue.at<Vec3b>(row, col)[2];imgs.at<Vec3b>(row, col)[1] = imgGreen.at<Vec3b>(row, col)[1];imgs.at<Vec3b>(row, col)[0] = imgRed.at<Vec3b>(row, col)[0];}}//imgRed/Green/Blue都是CV_8UC3类型

单通道和三通道图像的遍历操作大概就是这样。多用几次就熟悉了。

2.1.5 加运算

最后我选择的是加运算,大致原理以一个像素点来演示

point1 =[128,128,128] point2 =[1 ,1 ,1 ]

对point1和point2进行加运算 输出到point3 = [129,129,129]

在opencv里面使用add函数实现加运算

add(imgRed, imgGreen, result);

演示一下两张图像的加运算结果

2.2 通道读写与遍历简单的思路小结

首先是提取出一个单通道的Mat,然后参考三张RGB对应gray的映射图计算出RGB三色的参数

然后将其写入到三通道的Mat对象中。输出即可

3. 源码

以下是全部代码,需要opencv运行库

#include<iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
//RGB通道参数,目前效果较好的为
//0.5 0.15 -0.9
#define REDCOLOR_POINT 0.5
#define GREENCOLOR_POINT 0.15
#define BLUECOLOR_POINT -0.9
//通道
#define RED_CHANNELS 2
#define GREEN_CHANNEL 1
#define BLUE_CHANNEL 0
int main() {cout << "第八周图像处理实验" << endl;Mat img = imread("lenna_gray.bmp", 0);namedWindow("原图", WINDOW_AUTOSIZE);cv::imshow("原图", img);cout <<  "img的通道数为" << img.channels() << endl;;Mat result;//开始提取通道vector<Mat> dst(3);split(img, dst);Mat grayImage = dst[0];imshow("gray", grayImage);//单通道图像Mat imgBlue = Mat(grayImage.rows, grayImage.cols, CV_8UC3);Mat imgRed = Mat(grayImage.rows, grayImage.cols, CV_8UC3);Mat imgGreen = Mat(grayImage.rows, grayImage.cols, CV_8UC3);int rows = grayImage.rows;;int cols = grayImage.cols;for (int row = 0; row < rows; row++) {for (int col = 0; col < cols; col++) {//grayImg.at<uchar>(row, col) = 255 - grayImg.at<uchar>(row, col);int grayColor = grayImage.at<uchar>(row, col);int redColor = 0, greenColor = 0, blueColor = 0;if (grayColor >= 0 && grayColor < 64)//区间1-green{//r=0/g->up/b=255redColor = 0;blueColor = 255;//greenColor = grayColor * GRAY2RGB_POINT;greenColor = 255 / 64 * grayColor;//greenColor = 0;}else if (grayColor >= 64 && grayColor < 128)//区间2-blue{//r=0/g=255/b->downredColor = 0;greenColor = 255;//blueColor = 255 - (grayColor - 64) * GRAY2RGB_POINT;blueColor = -255 / 63 * (grayColor - 192) + 255;}else if (grayColor >= 128 && grayColor < 192)//区间3-red{//r->up/g=255/b=0greenColor = 255;blueColor = 0;//redColor = (grayColor - 128) * GRAY2RGB_POINT;redColor = 255 / 64 * (grayColor - 128);}else if (grayColor >= 192 && grayColor < 255)//区间4-green{//r=255/b=0/g->downredColor = 255;blueColor = 0;//greenColor = 255 - ((grayColor - 192) * GRAY2RGB_POINT);greenColor = -255 / 63 * (grayColor - 192) + 255;}//写入部分imgRed.at<Vec3b>(row, col)[RED_CHANNELS] = redColor*REDCOLOR_POINT;imgRed.at<Vec3b>(row, col)[GREEN_CHANNEL] = 0;imgRed.at<Vec3b>(row, col)[BLUE_CHANNEL] = 0;imgGreen.at<Vec3b>(row, col)[RED_CHANNELS] = 0;imgGreen.at<Vec3b>(row, col)[GREEN_CHANNEL] = greenColor*GREENCOLOR_POINT;imgGreen.at<Vec3b>(row, col)[BLUE_CHANNEL] = 0;imgBlue.at<Vec3b>(row, col)[RED_CHANNELS] = 0;imgBlue.at<Vec3b>(row, col)[GREEN_CHANNEL] = 0;imgBlue.at<Vec3b>(row, col)[BLUE_CHANNEL] = blueColor* BLUECOLOR_POINT;}}cv::imshow("red", imgRed);cv::imshow("green", imgGreen);cv::imshow("blue", imgBlue);//图像遍历Mat rgbImg = Mat(grayImage.rows, grayImage.cols, CV_8UC3);cout << "rgbImg的通道数为"<<rgbImg.channels();}}add(imgRed, imgGreen, result);add(result, imgBlue, result);imshow("rgbImg", result);waitKey(0);return 0;
}

4. 使用applyColorMap实现

效果

代码

#include<iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main() {Mat img = imread("lenna_gray.bmp", 0);Mat dst;applyColorMap(img, dst, COLORMAP_JET);cv::imshow("dst", dst);waitKey(0);return 0;
}

参考:灰度图像的伪彩色处理_Python_michaelhan3的博客-CSDN博客

原文地址:http://blog.twentyy.cn/index.php/CV/cv-gray2rgb.html

后续有修改可能只会在原文更新

opencv遍历实现灰度图转伪彩色图[C/C++][附applyColorMap方法]相关推荐

  1. python彩虹图_灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

    做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨. 本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!! 废话不说了,代码是码农 ...

  2. matlab灰度图转伪彩色,[转载]灰度图转伪彩色图和彩虹图,基于OpenCV 2.4.3

    做东西需要用到灰度转伪彩显示,毕竟嘛,人眼对彩色的分辨远远高于对灰度的分辨. 本来想这么成熟的东西网上肯定有代码,我勒个擦,找了一圈都是不知所云的东西,还是自己写一个吧!!!! 废话不说了,代码是码农 ...

  3. 数字图像处理--灰度图转伪彩色图

    开篇废话 观察了一下冈萨雷斯的书,发现彩色图像处理仅仅用了一章进行介绍,原因分析了一下,后来发现,好像别的介绍的也不多,得出一个结论.冈萨雷斯这本书仅仅能作为一部纲领性的介绍.它基本涵盖了图像处理的基 ...

  4. 图像处理之灰度图转伪彩色图原理与代码分析

    首先强调:在matlab中用[row,col]=size(x)获取的行和列是与图片编辑器显示的行列相反. 首先RGB图转为灰度图,通过rgb2gray()函数:灰度图中每个像素点的灰度值根据三个分段线 ...

  5. C#灰度图转伪彩色图

    /// <summary>/// 伪彩色图像构造器/// </summary>public class PseudoColorImageBuilder{/// <summ ...

  6. Labview实现图片24bit转变为8bit及灰度图的伪彩显示

    原图: 伪彩显示效果: 24bit转换为8bit程序框图: 伪彩显示程序框图: VI链接:Labview实现图片24bit转变为8bit及伪彩显示的源码-C文档类资源-CSDN下载 参考了这两位博主的 ...

  7. opencv将灰度图转为彩色图

    使用opencv将一幅灰度图转为彩色图. 使用函数:cvtColor(); Mat imgGray= imread("gray.jpg",0);     Mat imgRGB;   ...

  8. c++ opencv 灰度图转彩色图

    灰度图转彩色图______主要作用:在图上画彩色线条等等 //灰度图转彩色图 cv::Mat grayToRGB(const cv::Mat input_img) {//创建一个和灰度图一样大小的0值 ...

  9. opencv灰度图转伪彩图或彩色图

    一.背景 一般例如红外图像,呈现出来的是灰度图效果,此时每个像素有一个,在0-255内,如果想要观看伪彩图,也就是人工设置的彩色,需要在灰度图的基础上,给它增加RGB三个通道的值,让它变为看起来有红绿 ...

最新文章

  1. php保存base64数据
  2. 204. Count Primes
  3. codeforce 1311 C. Perform the Combo 前缀和
  4. 无废话ExtJs 入门教程十[单选组:RadioGroup、复选组:CheckBoxGroup]
  5. ESP32 入门教学,不入门,不教学
  6. “错题集”帮你期末考试冲向满分
  7. Java - 利用StringEscapeUtils对字符串进行各种转义与反转义
  8. VB 二进制数据读写实例
  9. 博客园博客美化相关文章目录
  10. 编程语言中的常量折叠(const folding)
  11. C++ 基类和派生类的virtual虚析构函数
  12. iOS设计模式之代理模式
  13. 在线的图片、js、css压缩优化工具介绍(配合小强视频 前端性能分析精要)
  14. oracle11g卸载出错 无法删除文件,文件正在使用中
  15. 网络----OSI模型
  16. 每天可以一看的哲理句子
  17. 从现在看未来,在未来看现在
  18. 核磁谱图分析步骤_核磁一般氢谱和碳谱的解析步骤
  19. cakephp视图用php文件,CakePHP的视图
  20. 【C语言】C语言成长之路之关于C语言的操作符以及一些表达式的讲解(՞• •՞).

热门文章

  1. h5获取安卓定位_H5 移动端获取当前位置
  2. java中super(aa bb cc)_面向对象程序设计(Java)答案
  3. 怎样设置rotacast插件_鞋类丨3D打印设计中Grasshopper的应用——用插件Pufferfish生成网格...
  4. 通过QQ查询ip地址
  5. 数学建模--30+种常用算法模型
  6. 电力系统机组组合(Matlab代码实现)
  7. unity实现镜头拉近拉远的方式
  8. 网络安全系列-四十一: arkime的docker-compose安装及可视化pcap文件示例
  9. 【OSPF路由配置命令汇总大全】面面俱到
  10. labview调用halcon匹配详解