灰度变换

  • 一、灰度变换概念
  • 二、灰度变换的作用
  • 三、灰度变换的方法
  • 灰度化
  • 一、灰度的概念
  • 二、对彩色图进行灰度化
    • 1.加权平均值法
    • 2.取最大值
    • 3.平均值
  • 灰度的线性变换
    • 1.线性变换
    • 2.分段线性变换
  • 灰度的非线性变换
    • 1.对数变换
    • 2.幂律变换
  • 总结

一、灰度变换概念

在图像预处理中,图像的灰度变换是图像增强的重要手段,灰度变换可以使图像对比度扩展,图像清晰,特征明显,灰度变换主要利用点运算来修正像素灰度,由输入像素点的灰度值确定相应输出点的灰度值,是一种基于图像变换的操作。

二、灰度变换的作用

1.改善图像是质量,显示更多的细节,提高图像的对比度
2.有选择的突出图像感兴趣的特征或者抑制图像中不需要的特征
3.可以有效的改变图像的直方图的分布,使像素的分布更加均匀

三、灰度变换的方法

1.线性灰度变换
2.非线性灰度变换(对数变换,幂律变换(伽马变换))

灰度化

一、灰度的概念

在数字图像中,像素是基本的表示单位,各个像素的亮安程度用灰度值来标识,只含亮度信息,不含色彩信息的图像称为灰度图像,对于单色图像,它的每个像素的灰度值用【0,255】区间的整数表示,即图像分为256个灰度等级,对于彩色图像,他的每个像素由R,G,B三个单色调配而成,如果每个像素的R,G,B完全相同,也就是R=G=B=D,该图像就是灰度图像,其中D被称为各个像素的灰度值。


二、对彩色图进行灰度化

1.加权平均值法

D=0.299R+0.587G+0.114*B

代码如下:

#include<iostream>
#include<opencv.hpp>
using namespace std;
using namespace cv;int main()
{Mat img, img2;img = imread("猫1.jpg");imshow("原图", img);img2.create(img.size(), 0);for (int i = 0; i < img.rows; i++){for (int j = 0; j < img.cols; j++){img2.at<uchar>(i, j) = saturate_cast<uchar>(0.114*img.at<Vec3b>(i, j)[0] + 0.587*img.at<Vec3b>(i, j)[1] + 0.299*img.at<Vec3b>(i, j)[2]);}}imshow("经验公式", img2);waitKey(0);
}

效果如下:

2.取最大值

代码如下:

int main()
{Mat img, img2;img = imread("猫1.jpg");imshow("原图", img);img2.create(img.size(), 0);for (int i = 0; i < img.rows; i++){for (int j = 0; j < img.cols; j++){int max = img.at<Vec3b>(i, j)[0];for (int x = 0; x < 3; x++){if (max < img.at<Vec3b>(i, j)[x]){max = img.at<Vec3b>(i, j)[x];}}img2.at<uchar>(i, j) = saturate_cast<uchar>(max);}}imshow("最大值", img2);waitKey(0);
}

3.平均值

代码如下:

int main()
{Mat img, img2;img = imread("猫1.jpg");imshow("原图", img);img2.create(img.size(), 0);for (int i = 0; i < img.rows; i++){for (int j = 0; j < img.cols; j++){img2.at<uchar>(i, j) = saturate_cast<uchar>((img.at<Vec3b>(i, j)[0] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[2])/3);}}imshow("平均值", img2);waitKey(0);
}

灰度的线性变换

图像的线性变换是图像处理的基本运算,通常应用在调整图像的画面质量方面,如图像对比度,亮度及反转等操作。灰度的线性变换就是将图像中所有点的灰度按照线性灰度变换函数进行变换。

1.线性变换

y=kx+b;

代码如下:

int main()
{Mat img1, img2;img1 = imread("猫1.jpg", 1);imshow("原图", img1);img2 = Mat::zeros(img1.size(), 0);for (int i = 0; i < img1.rows; i++){for (int j = 0; j < img1.cols; j++){for (int s = 0; s < 3; s++){img2.at<uchar>(i, j) = saturate_cast<uchar>(1.1*img1.at<Vec3b>(i, j)[s] + 20);}}}imshow("线性", img2);waitKey(0);
}

效果如下:

2.分段线性变换


代码如下:

int main()
{Mat img1, img2;img1 = imread("猫1.jpg", 0);imshow("原图", img1);img2 = Mat::zeros(img1.size(), 0);for (int i = 0; i < img1.rows; i++){for (int j = 0; j < img1.cols; j++){uchar temp = img1.at<uchar>(i, j);if (temp <=70){img2.at<uchar>(i, j) = saturate_cast<uchar>(0.5*temp + 20);}else if (temp > 70 && temp <= 150){img2.at<uchar>(i, j) = saturate_cast<uchar>(1.2*temp + 100);}else if (temp > 150 && temp <= 255){img2.at<uchar>(i, j) = saturate_cast<uchar>(0.9*temp + 55);}}}imshow("分段线性", img2);waitKey(0);
}

效果如下:

灰度的非线性变换

对数变换和分对数变换都属于非线性变换

1.对数变换

对数变换能增强图像暗部的细节

代码如下:

int main()
{double c = 1.2;Mat img1, img2, img3;img1 = imread("猫1.jpg",0);img3 = Mat::ones(img1.size(), CV_32FC3);add(img1, Scalar(1.0), img1);img1.convertTo(img1, CV_32F);log(img1, img3);img3 = c*img3;normalize(img3, img3, 0, 255, NORM_MINMAX);//归一化到0-255 NORM_MINMAX 线性归一化convertScaleAbs(img3, img3);//转换成8bit通道显示imshow("对数变换", img3);waitKey(0);
}

效果如下:

2.幂律变换

幂律变换也称伽马变换或指数变换,主要用于图像的校正,对漂白的图片或过黑的图片进行修正,增强对比度

代码如下:

int main()
{Mat img1, img2;img1 = imread("猫1.jpg",0);img2.create(img1.size(), img1.type());for (int i = 0; i < img1.rows; i++){for (int j = 0; j < img1.cols; j++){int gray = img1.at<uchar>(i, j);img2.at<uchar>(i, j) = saturate_cast<uchar>(pow(gray,0.5));}}normalize(img2, img2, 0, 255, NORM_MINMAX);imshow("幂律变换", img2);waitKey(0);
}

效果如下:

总结

以上就是本文的全部内容,本文简单介绍了灰度化以及灰度变换的一些基础知识。

opencv 学习笔记(七) 灰度变换相关推荐

  1. OpenCV学习笔记(七)——图像梯度及边缘检测

    图像梯度计算的是图像变化的速度.对于图像的边缘部分,其灰度值变化较大,梯度值也较大:相反,对于图像中比较平滑的部分,其灰度值变化较小,相应的梯度值也较小.一般情况下,图像梯度计算的是图像的边缘信息. ...

  2. Opencv学习笔记七(梯度算子、锐化)

    Sobel算子 卷积的作用除了实现图像模糊或者去噪,还可以寻找一张图像上所有梯度信息,这些梯度信息是图像的最原始特征数据,进一步处理之后就可以生成一些比较高级.抽象的特征用来表示一张图像实现基于图像特 ...

  3. OpenCV学习笔记七-创建滑动条

    摘要:主要记录滑动条函数使用方法 创建滑动条函数: C++: int createTrackbar(const string& trackbarname, const string& ...

  4. opencv计算图像亮度调节_【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整...

    今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...

  5. opencv学习笔记七:绘图和注释

    艺术线条和填充多边形 画直线或者其他图形(虚线,圆,矩形等)的函数都接受宽度(thickenss)和线性(lineType)的参数,这两个都是整型的,但第二个参数的值只能是4,8或者cv::LINE_ ...

  6. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  7. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  8. OpenCV学习笔记与代码示例(三):张氏标定法标定相机原理及函数详解

    目录 1.张氏标定法基本原理 1.1相机针孔模型 1.2单应矩阵H 1.3求相机内参 1.4求相机外参 1.5优化参数 1.6总结 2.OpenCV实现 2.1特征点检测与靶标坐标初始化 2.2相机标 ...

  9. OpenCV学习笔记(六)(七)(八)(九)(十)

    OpenCV学习笔记(六)--对XML和YAML文件实现I/O操作 1. XML.YAML文件的打开和关闭 XML\YAML文件在OpenCV中的数据结构为FileStorage,打开操作例如: [c ...

  10. OpenCV学习笔记(七):形态学morpholgy(1):腐蚀/膨胀:enrode(),dilate()

    OpenCV学习笔记(七):形态学(morpholgy):腐蚀/膨胀:enrode(),dilate() 数学形态学(Mathematical morphology) 是一门建立在格论和拓扑学基础之上 ...

最新文章

  1. 快速上手ANTLR--在Windows环境下解析计算器指令语法
  2. html怎么添加图片幻灯,使用CSS3实现的超酷幻灯图片效果
  3. 技术分享 | 一条神奇的曲线——贝塞尔曲线在前端的应用
  4. Java程序员必知的10个调试技巧
  5. LeetCode LCP 33. 蓄水(暴力枚举)
  6. Linux进阶之路————进程与服务管理
  7. InceptionNet V4
  8. 第九十五题(推断一字符串是不是对称的)
  9. ELK下Logstash性能调优
  10. 远视图+五环(css练习)
  11. DSP2812入门2——结构资源性能
  12. 利用python爬虫技术模拟提交问卷星/问卷网表单
  13. linux ping 测试网速,怎么ping网速 ping命令简单测试网速方法【详解】
  14. RabbitMQ之路(二):添加用户和虚拟主机
  15. 联想笔记本电脑u盘重装win10系统教学
  16. 微信小程序【渲染层网络层错误】解决方法
  17. ABAP SY-SUBRC的含义解析
  18. Cocos Creator 3D 插件教程(一):看你骨骼惊奇,我带你上车!
  19. 搭建gitlab自定义域名
  20. [译]游戏编程入门(by David Astle)

热门文章

  1. android应用 数量,谷歌Android应用数量超40万 免费应用占总数2/3
  2. 如何通过形态选股构建量化策略?
  3. go语言安装插件报错cannot find package golang.org/x/tools/go/buildutil
  4. 安装allennlp
  5. 做个自己站内搜索引擎
  6. 科技现代闪耀上海秀场 北京现代在上海车展上演转型之姿
  7. cmos存储器中存放了_CMOS存储器里放哪些东西
  8. 【Matlab数理统计知识点合集】新手入门第十三天
  9. 初步中的初步了解DFS以及DFT
  10. 打字速度单位wpm,kpm 是怎样计算的