数字图像处理--matlab图像反转、对数变换、伽马变换、对比度拉伸详解和代码实现

news/2024/7/21 7:25:02 标签: matlab, 计算机视觉, 图像处理

灰度变换在图像的单个像素上操作,主要以对比度和阈值处理为目的
空间滤波涉及改善性能的操作(邻域操作),如通过图像中每一个像素的邻域处理来锐化图像
这两种方法均属于图像增强。

灰度变换

    • 邻域基本增强变换
      • 定义
      • 数学表达
      • 三种基本灰度变换技术
    • 例子
      • 图像反转
      • 对数变换
      • 幂律(伽马)变换
      • 对比度拉伸

邻域基本增强变换

定义

邻域为1×1: Basic intensity transformation
邻域n×n: 基于空间滤波的增强
整幅图像的统计特性: 基于直方图的增强

数学表达

g ( x , y ) = T [ f ( x , y ) ] g(x,y)=T[f(x,y)] g(x,y)=T[f(x,y)] s = T [ r ] s=T[r] s=T[r]
r : r: r:原图像 f ( x , y ) f(x,y) f(x,y) ( x , y ) (x,y) (x,y)处的灰度值
s : s: s:增强图像 g ( x , y ) g(x,y) g(x,y) ( x , y ) (x,y) (x,y)处的灰度值

三种基本灰度变换技术

  1. 线性: 正比, 反比
  2. 对数: 对数, 反对数
  3. 幂次: n次幂, n次方根

例子

图像反转

在这里插入图片描述

matlab">I = imread('lena.jpg');
subplot(1,4,1);imshow(I);xlabel('原图');
I_gray = rgb2gray(I);
subplot(1,4,2); imshow(I_gray);xlabel('灰度图');
I_reverse2 = 255 - I_gray;
% I_reverse2 = imcomplement(I);
subplot(1,4,3); imshow(I_reverse2);xlabel('灰度反转');
I_reverse3 = imcomplement(I);
subplot(1,4,4); imshow(I_reverse3);xlabel('颜色反转');

在这里插入图片描述

对数变换

表达式: s = l o g ( 1 + r ) s=log(1+r) s=log(1+r)

把窄范围的低灰度级映射到宽范围的灰度级 (增强低灰度级)
把宽范围的高灰度级映射到低范围的灰度级 (抑制高灰度级)

matlab">clear;
img = imread('lena.jpg');
f=rgb2gray(img); %对于RGB图像必须做的一步,也可以用im2double函数
g = im2uint8(mat2gray(log(1 + double(f)))); % 使用对数变换
ff2=fftshift(fft2(f));
subplot(131),imshow(ff2,[]);title('原始图像');
subplot(132),imshow(log(abs(ff2)+1),[]);title('对数变换');
subplot(133),imshow(g,[]);title('对图像对数变换');

在这里插入图片描述
代码中可能会遇到的问题:
参考博客Matlab傅里叶变换实例
1、关于imshow函数:
使用imshow函数显示图像时要注意图像矩阵类型,当图像是double类型时要使用imshow(I,[ ])来根据数据矩阵的数值范围自动设置灰度图像显示范围。
2、关于运行时可能出现的警告:
如果图像进行傅里叶转换后立即用imshow函数显示,则在命令行可能会显示:Warning: Displaying real part of complex input(警告: 显示复数输入项的实部)。这是因为经过傅里叶变换后的图像矩阵大多是复数矩阵,包含实部和虚部。此时如要显示图像则需要先用abs取复数矩阵的模,再进行显示。
取模后图像矩阵的数值一般会很大,直接用imshow函数是无法显示的,此时可以用log函数取其对数
3、关于开头im2double和rgb2gray函数的使用:
对于RGB真彩图像来说,读入后是以三维矩阵形式存储的,如果此时直接进行傅里叶变换,则频谱图会显示为一片空白或者是密密麻麻的。所以在对RGB图像进行傅里叶变换前要进行类型转换,可以使用im2double将其转换为双精度型,或者使用rgb2gray将其转换为灰度图像。
使用不同的函数其变换效果也是不一样的。如使用im2double,进行傅里叶变换后其频谱图呈白色基调,使用rgb2gray其频谱图呈灰色基调。

幂律(伽马)变换

表达式:
s = c r γ s=cr^{\gamma} s=crγ
γ \gamma γ<1: 扩展暗像素值, 压缩亮像素值
γ \gamma γ>1: 压缩暗像素值, 扩展亮像素值
应用: 用于各种图像获取、打印和显示等设备的伽马校正(Gamma correction)
在这里插入图片描述
在这里插入图片描述

matlab">%扩展亮灰度级
clear;
img = imread('Fig0308(a)(fractured_spine).tif');
f=mat2gray(img); 
a=1;
gamma=0.6;
gamma1=0.3;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('0.6');
subplot(223),imshow(s1,[0 1]);title('0.3');
subplot(224),imshow(s2,[0 1]);title('对数变换');

在这里插入图片描述
可以看到当 γ = 0.6 \gamma =0.6 γ=0.6到0.3后,出现轻微苍白外观,对比度开始下降。

matlab">%压缩图像亮度
clear;
img = imread('Fig0309(a)(washed_out_aerial_image).tif');
f=mat2gray(img); 
a=1;
gamma=3;
gamma1=4;
s=a*(f.^gamma);
s1=a*(f.^gamma1);
s2=log(1+f);
subplot(221),imshow(f,[0 1]);title('原始图像');
subplot(222),imshow(s,[0 1]);title('\gamma =3');
subplot(223),imshow(s1,[0 1]);title('\gamma =4');
subplot(224),imshow(s2,[0 1]);title('对数变换');


在这里插入图片描述

可以看到当 γ > 1 \gamma >1 γ>1时,可实现灰度级压缩。

对比度拉伸

提高图像灰度级的动态范围
在这里插入图片描述
在这里插入图片描述

matlab">clear all;clc;
%分段线性灰度变换
f=imread('Fig0310(b)(washed_out_pollen_image).tif');
% f=rgb2gray(img);  %将彩色图像数据R转换为灰度图像数据J
a=max(max(f));
b=min(min(f));
[m,n]=size(f);  %获得灰度图像J的行列数M,N
H=zeros(m,n);
for x=1:m
    for y=1:n
        if (f(x,y)<=110);  %对灰度图像J进行分段处理,处理后的结果返回给矩阵H
            H(x,y)=b;
        else
            H(x,y)=a;
        end
    end
end
figure,
subplot(121),imshow(f,[]);
subplot(122),imshow(H,[]);

在这里插入图片描述


http://www.niftyadmin.cn/n/286858.html

相关文章

数说热点 | 跟着《长月烬明》起飞,今年各地文旅主打的就是一个听劝

近日&#xff0c;随着热播剧《长月烬明》的爆火&#xff0c;蚌埠、宣城、敦煌等多个与剧情梦幻联动的宝藏城市被带飞&#xff0c;各地热心网友也纷纷催促自家文旅局赶紧“蹭飞”&#xff0c;《长月烬明》以一己之力打造了影视文旅融合的新样板。 仙偶剧特效天花板&#xff0c;…

从开发人员走向架构师三步曲

很多架构师都是从好的开发人员逐步过渡而来的&#xff0c;但并非每个好的开发人员都希望成为架构师&#xff0c;而且他们并不是都适合做架构师。无论您是打算进行职业转型的开发人员&#xff0c;还是寻找能承担体系结构设计责任的合适人选的经理&#xff0c;都务必对此转型过程…

从零开始学习Linux运维,成为IT领域翘楚(六)

文章目录 &#x1f525;Linux磁盘管理&#x1f525;Linux挂载硬盘&#x1f525;Linux系统状态检测命令&#x1f525;Linux下载软件安装的命令 &#x1f525;Linux磁盘管理 分区的方式 &#x1f41f; MBR分区表&#xff1a;每块硬盘最大支持2.1TB硬盘&#xff0c;每块硬盘最多支…

005 页面路由

页面路由指在应用程序中实现不同页面之间的跳转和数据传递。HarmonyOS提供了Router模块&#xff0c;通过不同的url地址&#xff0c;可以方便地进行页面路由&#xff0c;轻松地访问不同的页面。 页面跳转 页面跳转是开发过程中的一个重要组成部分。在使用应用程序时&#xff0…

PostgreSQL实战之增量备份

目录 PostgreSQL实战之增量备份 1 开启WAL 归档 2 创建基础备份 2.1 使用低级API创建基础备份 PostgreSQL实战之增量备份 PostgreSQL在做写入操作时&#xff0c;对数据文件做的任何修改信息&#xff0c;首先会写入WAL日志&#xff08;预写日志)&#xff0c;然后才会对数据文…

NLP模型(四)——seq2seq模型与Attention机制介绍

文章目录 1. seq2seq模型介绍2. 模型计算2.1 LSTM结构单元2.2 seq2seq计算流程 3. Attention机制3.1 引入Attention3.2 计算全局对齐权重 4. seq2seq加入Attention机制5. 模型理解6. 模型细节6.1 解码器结构6.2 加入信息方式 参考文章 1. seq2seq模型介绍 传统的RNN只能处理 1…

【Redis】持久化机制详解:从RDB到AOF,你需要知道的一切

本文目录 RDB&#xff08;默认&#xff09; 自动触发 &#x1f19a; 手动触发 优点 缺点 何时会触发RDB快照 AOF 启用 AOF 配置路径 AOF 文件&#x1f4c3; AOF 的写回策略 AOF 的重写机制 优点 缺点 RDB & AOF 优先级 终极方案&#xff1a;RDB AOF 混合方…

指针函数和函数指针

本文目录 • 前言 • 一、返回指针的函数 二、指向函数的指针回到顶部 一、返回指针的函数 指针也是C语言中的一种数据类型&#xff0c;因此一个函数的返回值肯定可以是指针类型的。 返回指针的函数的一般形式为&#xff1a;类型名 * 函数名(参数列表) 比如下面这个函数&#…