数字图像处理——灰度变换
灰度变换
- 灰度变换函数
- 1、反转变换
- 参考代码
- 效果图与应用场景
- 2、对数变换
- 参考代码
- 效果图与应用场景
- 3、伽马变换(幂律变换)
- 参考代码
- 效果图与应用场景
- 4、比特平面分层
- 参考代码
- 效果图与应用场景
灰度变换函数
对于以像素存储的数字图像来说,可对像素进行相应的操作,可得到处理过后的图像。而对像素邻域进行计算的的叫滤波,对单像素进行变换的叫映射,而这个映射关系就是变换函数。
本文主要介绍的一些主要的灰度变换函数。
1、反转变换
反转变换可将图像的灰度级进行反转,公式可参考下式:
s=L−r−1s = L - r -1s=L−r−1
其中,[0, L-1]为灰度级范围, r为原图像灰度级, s为变换图像灰度级。
参考代码
void inverse(Mat &img)
{// 初始化图像迭代器MatIterator_<uchar> srcIterStart = img.begin<uchar>();MatIterator_<uchar> srcIterEnd = img.end<uchar>();while (srcIterStart != srcIterEnd){*srcIterStart = 255 - *srcIterStart;srcIterStart++;}
}
效果图与应用场景
反转图像的使用场景一般用于对原始图像难以分析出不同之处,例如分析乳房组织时,用反转图像更易观察。
2、对数变换
对数变换可分为对数变换和反对数变换,而反对数变换是属于伽马变化(幂律变换)的范围。对数变换公式可参考下列公式:
s=clog(1+r)s = clog(1 + r)s=clog(1+r)
对数变换可拉伸暗像素值,压缩亮像素值。
参考代码
void log_image(Mat &img, uchar rate = 1)
{// 初始化图像迭代器MatIterator_<uchar> srcIterStart = img.begin<uchar>();MatIterator_<uchar> srcIterEnd = img.end<uchar>();while (srcIterStart != srcIterEnd){*srcIterStart = static_cast <uchar> (rate * log(1 + *srcIterStart));srcIterStart++;}
}
// 单通道图像标定
Mat standardImageSingle(Mat &src, int rank = 255)
{Mat dst = src.clone();// 查找数组内的最大值与最小值int min = 255, max = 0;for (int i = 0; i < src.rows; i++)for (int j = 0; j < src.cols; j++){if (dst.at<uchar>(i, j) < min)min = dst.at<uchar>(i, j);if (dst.at<uchar>(i, j) > max)max = dst.at<uchar>(i, j);// cout << num[i*src.rows + j] <<endl;}// 对图像像素值进行标定for (int i = 0; i < src.rows; i++)for (int j = 0; j < src.cols; j++){dst.at<uchar>(i, j) = saturate_cast<int>(rank * ((dst.at<uchar>(i, j) - min) * 1.0 / (max - min)));}return dst;
}
效果图与应用场景
对数变换一般不用于图像的明暗拉伸变换,主要用于傅里叶频谱的缩放,保证低频细节不会被线性缩放丢失,使得频谱可见细节更加明显。因此,对数变换主要用于频谱的标定。
3、伽马变换(幂律变换)
伽马变换是一种常用的变换函数,其公式主要参考下列公式:
s=crγs = cr^\gammas=crγ
参考代码
// 单通道图像标定——数组存储
void standardImageSingleArray(Mat &src, double* num, int rank = 255)
{// 查找数组内的最大值与最小值double min = 1000000000, max = -1000000000;for (int i = 0; i < src.rows; i++)for (int j = 0; j < src.cols; j++){if (num[i*src.cols + j] < min)min = num[i*src.cols + j];if (num[i*src.cols + j] > max)max = num[i*src.cols + j];// cout << num[i*src.cols + j] <<endl;}// 对图像像素值进行标定for (int i = 0; i < src.rows; i++)for (int j = 0; j < src.cols; j++){src.at<uchar>(i, j) = saturate_cast<int>(rank * ((num[i*src.cols + j] - min) / (max - min)));}
}void gama_image(Mat &img, double gama, double rate = 1)
{double* num = new double[img.rows*img.cols];int n = 0;// 初始化图像迭代器MatIterator_<uchar> srcIterStart = img.begin<uchar>();MatIterator_<uchar> srcIterEnd = img.end<uchar>();while (srcIterStart != srcIterEnd){if (*srcIterStart == 0)num[n] = 1.0;elsenum[n] = rate * pow(*srcIterStart, gama);n++;srcIterStart++;}standardImageSingleArray(img, num);
}
效果图与应用场景
伽马变换一般用于明暗变换,增强对比度, 将暗像素图像变换到亮像素图像,将亮像素图像变换到安像素图像。用于获取,显示图像的各种设备一般都是根据幂律来产生相应的,此现象称之为幂律相应现象。而幂律相应会导致获取或显示的图像过于阴暗(一般幂律响应的指数大于1),所以就需要进行伽马变换,这一操作通常称之为伽马校正。一般各类显示器件中都会内置伽马校正。
上图中,原图就好比输入,经γ=2.5\gamma=2.5γ=2.5的变换相当于器件类的幂律响应。可见比原图要阴暗的多。
在原图的基础上先进行γ=0.4\gamma=0.4γ=0.4的变换相当于先进行伽马校正,可见图像明显变明亮了许多,之后再经过幂律响应后,图像效果对比未经过校正的图像要明亮一些。
4、比特平面分层
像素值通常以8bit、16比特、32bit、64bit来存储像素值的,而每个比特都相当于以一个通道,我们可以获取每个比特平面的图像,下列实验以8bit图像为例为大家展示。我们可以通过与操作获取相应的比特平面值。
参考代码
// 获取图像细节
Mat getImageDetails(Mat src, uchar bite = 1)
{Mat dst = src.clone();for (int i = 0; i < src.rows; i++)for (int j = 0; j < src.cols; j++){dst.at<uchar>(i, j) = src.at<uchar>(i, j) & bite;}return dst;
}
效果图与应用场景
各比特平面效果图:
比特平面叠加效果图:
上图中低比特平面是图像的细节部分,高比特是轮廓部分。图像叠加高四层比特平面后的图像与原图像差别不大,因为丢失的细节部分对于人类的视觉来说基本是不可见的,因此此项实验可得出,对于图像的存储可只存储高四层比特平面,减少了50%的存储空间。
数字图像处理——灰度变换相关推荐
- 数字图像处理 -灰度变换 之 对数变换(Log Transformation)
本文参考了 以下这篇文章 [数字图像处理]灰度变换--反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割 https://blog.csdn.net/zhoufan900428/article/d ...
- 数字图像处理 - 灰度变换与空间滤波
目录 背景知识 灰度变换和空间滤波基础 一些基本的灰度变换函数 图像反转 对数变换 幂律(伽马)变换 分段线性变换函数 对比度拉伸 灰度级分层 比特平面分层 直方图处理 直方图均衡 空间滤波基础 空间 ...
- 直接灰度变换法matlab,数字图像处理-灰度变换(附MATLAB代码)
目录 图像增强 1.灰度变换 (1)线性变换 (2)分段线性变换 (3)非线性灰度变换 2.直方图修正法 (1)直方图均衡化 (2)直方图规定化 图像增强 图像增强的目的:(1)利用一系列技术改善图像 ...
- [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割
灰度变换,属于一个非常重要的概念.这里主要参考<Digital Image Processing> Rafael C. Gonzalez / Richard E. Woods 的第三章.书 ...
- python 灰度直方图_数字图像处理灰度变换之灰度直方图及python实现
图像灰度直方图 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率.直方图显示图像数据时会以左暗右亮的分布曲线形式呈现出来.横坐标是灰度级,纵坐标是该灰度级出现的频率.图 ...
- 数字图像处理第二章——空间滤波
数字图像处理第二章 数字图像处理---灰度变换与空间滤波 (四)空间滤波 4.1线性空间滤波 4.1.1 相关 4.1.2 卷积 4.1.3 imfilter函数 4.2 非线性空间滤波 (五)图像处 ...
- 数字图像处理——第三章 空间域图像增强(灰度变换和直方图处理)
文章目录 空间域图像增强 1. 背景知识 2. 基本灰度变换 2.1 图像反转 2.2 对数变换 2.3 幂次变换 2.4 分段线性变换函数 2.4.1 对比拉伸 2.4.2 灰度切割 2.4.3 位 ...
- OpenCV数字图像处理基于C++:灰度变换
OpenCV数字图像处理基于C++:灰度变换 1.1 灰度变换概念 在图像预处理中,图像的灰度变换是图像增强的重要手段,灰度变换可以使图像对比度扩展,图像清晰,特征明显,灰度变换主要利用点运算来修正像 ...
- 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)
目录 1 灰度变换简介 2 线性灰度变换-图像反转 3 非线性灰度变换 3.1 对数变换 3.2 伽马变换 参考资料 1 灰度变换简介 灰度变换是图像增强的一种重要手段,用于改善图像显示效果,属于空 ...
- 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)
数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换.对数变换.伽马变换和分段线性变换) 空间域处理是直接对像素进行操作的方法,这是相对于频率域处理而言的.空间域处理主要分为两大类:灰度变换 ...
最新文章
- 程序员持续成长,需要持久而痛苦的学习
- 用 YOLOv5模型识别出表情!
- java log4j和logback,跨过slf4j和logback,直接晋级log4j 2
- 什么是AWS Lambda?——事件驱动的函数执行环境
- ZZNU 1993: cots' friends
- matlab算法时间复杂度,关于降低算法时间复杂度问题的探讨和总结
- 多线程中ThreadLocal的使用
- HTML+CSS+JS实现 ❤️3D悬浮粒子翻转动效❤️
- C# 数据类型转换
- 关于Python 向pdf添加印章效果的思考及实现
- 【Word】插入公式显示灰色,失效解决
- matlab中if筛选条件 如何使用方法,excel中多个if函数的套用_excel怎么按条件筛选...
- 学习日志-《微习惯》笔记
- 一支手可以代表多大的数呢? 2 的 19 次方。
- [词性] 十一、介词 2 地点状语在前,时间状语在后 [ at ]
- 安全风险 microsoft 已阻止宏运行 因为此文件的来源不受信任
- problem-1654B. Prefix Removals-codeforces
- 三星android5.0基带,Galaxy S10 5G韩国首发:三星自家基带 实测速度破千兆
- c语言使用系统,使用C语言入门
- 教师计算机技能培训方案,教师信息技术培训实施方案.doc
热门文章
- java实现电子签名技术_h5实现电子签名
- arctanx麦克劳林公式推导过程_诱导公式
- 三国志战略版:北定中原剧本个性加点指引
- KNN算法说明以及sklearn 中 neighbors.KNeighborsClassifier参数说明
- 关于DSP的SCI通信学习
- 计算三角形的周长和面积
- 鸿蒙用户突破3亿,拳打谷歌安卓,脚踢苹果iOS
- 智能手机谷歌眼镜都是嵌入式计算机,如何在手机上“运行”谷歌眼镜
- Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库
- python 二进制的数为啥带0b?,怎样去掉0b?