灰度图转伪彩色图

数字图像处理的作业,利用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. codeforces #310 div1 C
  2. HDU-4738-Caocao's Bridges(tarjan)
  3. 剑指offer 二进制1中的个数
  4. 运营商视角的物联网商业模式-物联网操作系统篇
  5. 机器学习实战:TypeError: unhashable type: 'matrix'
  6. WinCE电源管理的简单介绍
  7. CallBack函数 回调函数
  8. 返回json格式的编写(Msg)
  9. 第12章 决策树 学习笔记下 决策树的学习曲线 模型复杂度曲线
  10. 【2019西安邀请赛热身赛C:】python算数表达式求值+模拟int溢出
  11. 优控触摸屏使用手册_中达优控PLC触摸屏一体机说明书.pdf
  12. 电商峰值系统架构设计--转载
  13. Unity游戏开始界面制作教学
  14. Agile实践之Kanban工具: Wekan
  15. 机器学习性能改善备忘单:32个帮你做出更好预测模型的技巧和窍门
  16. 哈工大计算机考研复试考纲,哈尔滨工业大学考研复试大纲
  17. 【hud3966】树剖模板05
  18. 新浪微博正在审核的开发者平台应用添加测试账号
  19. JAVA看云判断天气_如何看云识天气?
  20. 采购要管好供应商,这几个坑勿踩

热门文章

  1. MySQL数据库与表(可视化界面MySQL Workbench 创建表并输入数据库)
  2. QT 网络编程(UDP版本)
  3. unity3d问题集 对Vector3.Lerp 插值的理解 - 转自蛮牛
  4. uniapp显示富文本效果demo(整理)
  5. sdcms_php_web,ewsdCMS: 基于BJUI + ThinkPHP + BootStrap搭建的内容管理系统
  6. Appscan安装(Windows版本)
  7. 2022李宏毅机器学习深度学习学习笔记--第一周
  8. 节能减排可以从哪几个方面着手
  9. 前端实现序列帧_炫酷H5中序列图片视频化播放的高性能实现
  10. 【VPP】 VPP 架构