首页/新闻资讯/正文详情

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

发布时间:2026/11/4 1:00:43 来源:云帆数科 栏目:资讯中心
[数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割
【修订版】本文已整理到我的个人博客订正了原文的几处错误mat2gray 代码缺括号m/1eps 实际被算成 meps公式里输入、输出的符号混用另有几处拼写错误。CSDN 这一版保留原样之后的勘误与更新只在博客进行Intensity Transformations : 灰度变换 | Finns blog灰度变换属于一个非常重要的概念。这里主要参考《Digital Image Processing》 Rafael C. Gonzalez / Richard E. Woods 的第三章。书中所有的实验与数学式都采用了8-bit 图像的灰度范围也就是0到255这样一个范围这是本书不合理的一个地方。首先这样做并不泛用图片不一定是8-bit的。其次在做某些变换的时候可能会导致溢出。比如伽马变化假设伽马值为2那么灰度为255的像素点其变换之后值为65025这里就溢出了。当然要是使用Matlab计算肯定会处理的非常好直接使用mat2gray函数就能将其压缩回0到255。但是要是其他嵌入式平台处理的时候直接套用不方便不说直接按照8-bit的图来理解很不直观。因此我将数学式做了改变让其输入为0到1的浮点数其输出也是0到1的浮点数这样方便理解。本文所使用的图片均来源于《Digital Image Processing》的主页 ImageProcessingPlace图像反转图像反转这个翻译还是很不恰当的。这里应该理解为负片变换负片变换如下所示。负片变换主要用于观察过黑的图片负片变换之后方便观察。很简单的变换。对数变换对数变换主要用于将图像的低灰度值部分扩展将其高灰度值部分压缩以达到强调图像低灰度部分的目的。变换方法由下式给出。这里的对数变换底数为实际计算的时候需要用换底公式。其输入为其输出也为。对于不同的底数其对应的变换曲线如下图所示。底数越大对低灰度部分的强调就越强对高灰度部分的压缩也就越强。相反的如果想强调高灰度部分则用反对数函数就可以了。看下面的实验就可以很直观的理解下图是某图像的二维傅里叶变换图像其为了使其灰度部分较为明显一般都会使用灰度变换处理一下。实现对数变换的Matlab代码如下close all; clear all; %% -------------Log Transformations----------------- f imread(DFT_no_log.tif); f mat2gray(f,[0 255]); v 10; g_1 log2(1 v*f)/log2(v1); v 30; g_2 log2(1 v*f)/log2(v1); v 200; g_3 log2(1 v*f)/log2(v1); figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(g_1,[0 1]); xlabel(b).Log Transformations v10); figure(); subplot(1,2,1); imshow(g_2,[0 1]); xlabel(c).Log Transformations v100); subplot(1,2,2); imshow(g_3,[0 1]); xlabel(d).Log Transformations v200);伽马变换伽马变换主要用于图像的校正将漂白的图片或者是过黑的图片进行修正。伽马变换也常常用于显示屏的校正这是一个非常常用的变换。其变化所用数学式如下所示其输入为其输出也为。对于不同的伽马值其对应的变换曲线如下图所示。和对数变换一样伽马变换可以强调图像的某个部分。根据下面两个实验可以看出伽马变换的作用。实验1其实现Matlab代码为close all; clear all; %% -------------Gamma Transformations----------------- f imread(fractured_spine.tif); f mat2gray(f,[0 255]); C 1; Gamma 0.4; g2 C*(f.^Gamma); figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(1,2,2); imshow(g2,[0 1]); xlabel(b).Gamma Transformations \gamma 0.4);实验2灰度拉伸灰度拉伸也用于强调图像的某个部分与伽马变换与对数变换不同的是灰度拉升可以改善图像的动态范围。可以将原来低对比度的图像拉伸为高对比度图像。实现灰度拉升的方法很多其中最简单的一种就是线性拉伸。而这里介绍的方法稍微复杂一些。灰度拉伸所用数学式如下所示。同样的其输入为其输出也为。这个式子再熟悉不过了跟巴特沃斯高通滤波器像极了其输入输出关系也大致能猜到是个什么形状的。但是这里就出现一个问题了输入为0时候式子无意义了。所以在用Matlab计算的时候将其变为如下形式。这里的eps就是Matlab里面一个很小数。如此做的话式子变得有意义了。但是其输入范围为的时候其输出范围变为了。输出范围大致为为了精确起见使用mat2gray函数将其扩展到精确的。调用格式如下。g mat2gray(g,[1/(1(m/eps)^E) 1/(1(m/1eps)^E)]);输入输出问题解决了还有一个问题参数的决定。这里有两个参数一个是m相对于巴特沃斯高通滤波器而言这个是截止频率一个是E相对于巴特沃斯高通滤波器而言这个是滤波器次数。m可以控制变换曲线的重心E则可以控制曲线的斜率如下图所示。m值的可取图像灰度分布的中央值如下式所示决定m之后接下来就只剩E了。灰度拉升的目的就是扩展图片的动态范围我们想将原本灰度范围是的图像变换到内。那么就直接取最大值与最小值带入式子解出E就可以了。但是如之前所说的我们所用的式子的的输出范围达不到而且直接取的范围会造成E非常大从而变换曲线的斜率非常大灰度扩展的结果并不是很好。所以这里退一步取的输出范围是。E的取值如下所示。实验从直方图看原图的灰度范围确实被拉伸了。用上面所说的方法确定的灰度拉伸的输入输出曲线如下图所示。其Matlab代码如下close all; clear all; %% -------------Contrast Stretching----------------- f imread(washed_out_pollen_image.tif); %f imread(einstein_orig.tif); f mat2gray(f,[0 255]); [M,N] size(f); g zeros(M,N); Min_f min(min(f)); Max_f max(max(f)); m (Min_f Max_f)/2; Out_put_min 0.05; Out_put_max 0.95; E_1 log(1/Out_put_min - 1)/log(m/(Min_feps)); E_2 log(1/Out_put_max - 1)/log(m/(Max_feps)); E ceil(min(E_1,E_2)-1); g 1 ./(1 (m ./ (f eps)).^E); g mat2gray(g,[1/(1(m/eps)^E) 1/(1(m/1eps)^E)]); figure(); subplot(2,2,1); imshow(f,[0 1]); xlabel(a).Original Image); subplot(2,2,2); r imhist(f)/(M*N); bar(0:1/255:1,r); axis([0 1 0 max(r)]); xlabel(b).The Histogram of a); ylabel(Number of pixels); subplot(2,2,3); imshow(g,[0 1]); xlabel(c).Results of Contrast stretching); subplot(2,2,4); s imhist(g)/(M*N); bar(0:1/255:1,s); axis([0 1 0 max(s)]); xlabel(b).The Histogram of a); ylabel(Number of pixels); in_put 0:1/255:1; Out_put1 1 ./(1 (m ./ (double(in_put) eps)).^E); Out_put1 mat2gray(Out_put1,[1/(1(m/eps)^E) 1/(1(m/1eps)^E)]); figure(); plot(in_put,Out_put1); axis([0,1,0,1]),grid; axis square; xlabel(Input intensity level); ylabel(Onput intensity level);灰度切割灰度切割也是一个很简单但也很实用的变换。灰度切割主要用于强调图像的某一部份将这个部分赋为一个较高的灰度值其变换对应关系如下所示。灰度切割有以上两种方法一种是特定灰度值的部分赋值为一个较高的灰度值其余部分为一个较低的灰度值。这样的方法得到的结果是一个二值化图像。另外一种方法则是仅仅强调部分赋值为一个较高的灰度值其余的部分不变。实验位图切割位图切割就是按照图像的位将图像分层处理。若图像的某个像素其bit7为1则在位面7这个像素值为1反之则为0。实验由位图切割的结果图像的主要信息包含在了高4位。仅仅靠高4位还原的图像更原图基本差不多。由此可见位图切割主要用于图像压缩。博客地址 zhoufan900428-CSDN博客

相关推荐

[数字信号处理]IIR滤波器的直接设计(C代码)
[数字信号处理]IIR滤波器的直接设计(C代码)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:00:43

[数字图像处理]数字图像的整数倍扩大(数字图像插值)
[数字图像处理]数字图像的整数倍扩大(数字图像插值)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:00:43

[数字信号处理]使用窗函数设计FIR滤波器
[数字信号处理]使用窗函数设计FIR滤波器

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:00:43

计算1!+ 2!+ 3! + 4! +···+10!(1到10的阶乘)
计算1!+ 2!+ 3! + 4! +···+10!(1到10的阶乘)

//初始化 int i 0; int j 1; int ret 1; int sum 0; //嵌套for循环 for (i 0; i < 10; i) //累计1到10 {for (j 1; j < i; j) //每次数的阶乘{ret ret * j;}sum sum ret; //计算每个数的阶乘相加 } printf("%d", sum);int i 1; int ret 1; int sum … · 2026/11/4 1:45:00

WinRAR
WinRAR

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:45:00

Windows快捷键的定义
Windows快捷键的定义

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 1:45:00

Hermes Agent 容器镜像瘦身实践:轻松加速部署
Hermes Agent 容器镜像瘦身实践:轻松加速部署

Hermes Agent 容器镜像瘦身实践&#xff1a;轻松加速部署 第一次把 Hermes Agent 跑进容器的人&#xff0c;多半卡在同一个地方&#xff1a;容器镜像太大&#xff0c;docker pull 要等好几分钟&#xff0c;CI 冷构建动辄十几分钟&#xff0c;容器冷启动慢得让人怀疑人生。这篇… · 2026/11/4 1:45:00

Geckium 是如何在 Firefox 上复刻老 Chrome 的?CSS+JS 换肤核心实现原理详解
Geckium 是如何在 Firefox 上复刻老 Chrome 的?CSS+JS 换肤核心实现原理详解

【免费下载链接】Geckium Chrome 1 - 58 theme for Firefox 115 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ge/Geckium 点击查看 免费下载 Geckium 是一款专为 Firefox 115 打造的换肤改造方案&#xff0c;它通过 CSS 样式注入与 JS 动态修改 DOM 的组合方式&… · 2026/11/4 1:45:00

在 VS Code 里跑起 OpenChamber:AI 编程助手从安装、实战到排错的完整指南
在 VS Code 里跑起 OpenChamber:AI 编程助手从安装、实战到排错的完整指南

在 VS Code 里跑起 OpenChamber:AI 编程助手从安装、实战到排错的完整指南 【免费下载链接】openchamber Agentic Development Environment based on OpenCode AI agent 项目地址: https://gitcode.com/gh_mirrors/op/openchamber OpenChamber 的 VS Code 扩展把 OpenCo… · 2026/11/4 1:44:00

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进&#xff0c;技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里&#xff0c;先后经历了三次重大技术栈迁移&#xff0c;每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策"&#xff1a;Jev 到底在解决什么问题大多数人第一次接触大模型&#xff0c;脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样&#xff0c;它给你一段描述&#xff1b;你让它写个周报&#xff0c;它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用"&#xff0c;这件事我前后折腾了小半年。标题里说的这台 Mac mini M6&#xff0c;是我们这次讨论的目标平台&#xff0c;具体到手规格以实物为准&#xff1b;但下面这套推算方法和实测思路&#xff0c;对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码