灰度变换

  • 灰度变换函数
    • 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%的存储空间。

数字图像处理——灰度变换相关推荐

  1. 数字图像处理 -灰度变换 之 对数变换(Log Transformation)

    本文参考了 以下这篇文章 [数字图像处理]灰度变换--反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割 https://blog.csdn.net/zhoufan900428/article/d ...

  2. 数字图像处理 - 灰度变换与空间滤波

    目录 背景知识 灰度变换和空间滤波基础 一些基本的灰度变换函数 图像反转 对数变换 幂律(伽马)变换 分段线性变换函数 对比度拉伸 灰度级分层 比特平面分层 直方图处理 直方图均衡 空间滤波基础 空间 ...

  3. 直接灰度变换法matlab,数字图像处理-灰度变换(附MATLAB代码)

    目录 图像增强 1.灰度变换 (1)线性变换 (2)分段线性变换 (3)非线性灰度变换 2.直方图修正法 (1)直方图均衡化 (2)直方图规定化 图像增强 图像增强的目的:(1)利用一系列技术改善图像 ...

  4. [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割

    灰度变换,属于一个非常重要的概念.这里主要参考<Digital Image Processing> Rafael C. Gonzalez / Richard E. Woods 的第三章.书 ...

  5. python 灰度直方图_数字图像处理灰度变换之灰度直方图及python实现

    图像灰度直方图 灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率.直方图显示图像数据时会以左暗右亮的分布曲线形式呈现出来.横坐标是灰度级,纵坐标是该灰度级出现的频率.图 ...

  6. 数字图像处理第二章——空间滤波

    数字图像处理第二章 数字图像处理---灰度变换与空间滤波 (四)空间滤波 4.1线性空间滤波 4.1.1 相关 4.1.2 卷积 4.1.3 imfilter函数 4.2 非线性空间滤波 (五)图像处 ...

  7. 数字图像处理——第三章 空间域图像增强(灰度变换和直方图处理)

    文章目录 空间域图像增强 1. 背景知识 2. 基本灰度变换 2.1 图像反转 2.2 对数变换 2.3 幂次变换 2.4 分段线性变换函数 2.4.1 对比拉伸 2.4.2 灰度切割 2.4.3 位 ...

  8. OpenCV数字图像处理基于C++:灰度变换

    OpenCV数字图像处理基于C++:灰度变换 1.1 灰度变换概念 在图像预处理中,图像的灰度变换是图像增强的重要手段,灰度变换可以使图像对比度扩展,图像清晰,特征明显,灰度变换主要利用点运算来修正像 ...

  9. 数字图像处理(18): 图像灰度变换——线性灰度变换 和 非线性灰度变换(对数变换 与 伽马变换)

    目录 1 灰度变换简介 2 线性灰度变换­-图像反转 3 非线性灰度变换 3.1 对数变换 3.2 伽马变换 参考资料 1 灰度变换简介 灰度变换是图像增强的一种重要手段,用于改善图像显示效果,属于空 ...

  10. 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)

    数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换.对数变换.伽马变换和分段线性变换) 空间域处理是直接对像素进行操作的方法,这是相对于频率域处理而言的.空间域处理主要分为两大类:灰度变换 ...

最新文章

  1. 程序员持续成长,需要持久而痛苦的学习
  2. 用 YOLOv5模型识别出表情!
  3. java log4j和logback,跨过slf4j和logback,直接晋级log4j 2
  4. 什么是AWS Lambda?——事件驱动的函数执行环境
  5. ZZNU 1993: cots' friends
  6. matlab算法时间复杂度,关于降低算法时间复杂度问题的探讨和总结
  7. 多线程中ThreadLocal的使用
  8. HTML+CSS+JS实现 ❤️3D悬浮粒子翻转动效❤️
  9. C# 数据类型转换
  10. 关于Python 向pdf添加印章效果的思考及实现
  11. 【Word】插入公式显示灰色,失效解决
  12. matlab中if筛选条件 如何使用方法,excel中多个if函数的套用_excel怎么按条件筛选...
  13. 学习日志-《微习惯》笔记
  14. 一支手可以代表多大的数呢? 2 的 19 次方。
  15. [词性] 十一、介词 2 地点状语在前,时间状语在后 [ at ]
  16. 安全风险 microsoft 已阻止宏运行 因为此文件的来源不受信任
  17. problem-1654B. Prefix Removals-codeforces
  18. 三星android5.0基带,Galaxy S10 5G韩国首发:三星自家基带 实测速度破千兆
  19. c语言使用系统,使用C语言入门
  20. 教师计算机技能培训方案,教师信息技术培训实施方案.doc

热门文章

  1. java实现电子签名技术_h5实现电子签名
  2. arctanx麦克劳林公式推导过程_诱导公式
  3. 三国志战略版:北定中原剧本个性加点指引
  4. KNN算法说明以及sklearn 中 neighbors.KNeighborsClassifier参数说明
  5. 关于DSP的SCI通信学习
  6. 计算三角形的周长和面积
  7. 鸿蒙用户突破3亿,拳打谷歌安卓,脚踢苹果iOS
  8. 智能手机谷歌眼镜都是嵌入式计算机,如何在手机上“运行”谷歌眼镜
  9. Mysql根据经纬度查询半径多少以内的数据,画个圈圈查数据库
  10. python 二进制的数为啥带0b?,怎样去掉0b?