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

news2024/11/15 22:37:24

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

灰度变换

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

邻域基本增强变换

定义

邻域为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次方根

例子

图像反转

在这里插入图片描述

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)

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

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)
在这里插入图片描述
在这里插入图片描述

%扩展亮灰度级
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后,出现轻微苍白外观,对比度开始下降。

%压缩图像亮度
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时,可实现灰度级压缩。

对比度拉伸

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

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.coloradmin.cn/o/487452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法&#xff08;非常详细&#xff09; QTableWidget表格控件的用法&#xff08;非常详细&#xff09;QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5.清空6.运…

LED灯内常见驱动电路

如今LED灯已成为照明的主流&#xff0c;使用白炽灯的家庭少之又少。其主要优势是LED灯更节能&#xff0c;相同光效的情况下&#xff0c;LED灯消耗的电能要比白炽灯减少70%以上。 LED灯的寿命比白炽灯要长&#xff0c;使用过白炽灯的人都知道&#xff0c;使用不了多长时间&…

简析Linux内核中的各种锁:信号量/互斥锁/读写锁/原子锁/自旋锁/内存屏障等

首先得搞清楚&#xff0c;不同锁的作用对象不同。 下面分别是作用于临界区、CPU、内存、cache 的各种锁的归纳&#xff1a; 一、atomic原子变量/spinlock自旋锁 — —CPU 既然是锁CPU&#xff0c;那就都是针对多核处理器或多CPU处理器。单核的话&#xff0c;只有发生中断会使…

生成C++工程的UML类图和类继承关系图

简介 在进行软件开发时&#xff0c;了解代码结构和关系、类之间的继承关系以及类内部的成员函数和变量定义是非常重要的。为此&#xff0c;我们可以使用Doxygen和Graphviz工具来生成UML类图和类集成关系图。 Doxygen是一个用于从注释的C源代码中生成文档的工具&#xff0c;支…

day01刷题记录

刷题 题目一分析题解 题目二分析题解 题目一 牛牛举办了一次编程比赛,参加比赛的有3*n个选手,每个选手都有一个水平值a_i.现在要将这些选手进行组队,一共组成n个队伍,即每个队伍3人.牛牛发现队伍的水平值等于该队伍队员中第二高水平值。 例如: 一个队伍三个队员的水平值分别是…

access数据库连接sqlserver实现远程连接

由于项目需要对接生产系统&#xff0c;但是生产系统使用的是access数据库&#xff08;这么老还在用&#xff0c;不知道咋想的&#xff09;&#xff0c;客户又想把项目部署到阿里云上&#xff0c;需要阿里云远程连接本地的access数据库&#xff08;心里一句MMP送上&#xff09;&…

Java——线程池详细讲解

文章目录 一、线程池一、线程池基础1.1 什么是线程池1.2 为什么使用线程池1.3 线程池有哪些优势1.4 应用场景 二、线程池使用2.1 Java内置线程池 ThreadPoolExecutor2.1.1 线程池的七个参数2.1.1.1 **int corePoolSize 核心线程数量**2.1.1.2 int maximumPoolSize 最大线程数2.…

假期后,野兔百科系统网站源码新版更新发布

这个是野兔百科系统中文版更新&#xff0c;这次更新了增加几个功能模块&#xff0c;几个已知的问题&#xff0c;修复系统部分功能。 系统名称&#xff1a;野兔百科系统 系统语言&#xff1a;中文版 系统源码&#xff1a;不加密&#xff0c;开源 系统开发&#xff1a;PHPMySQL …

尚融宝29-提现和还款

目录 一、提现 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;前端 &#xff08;三&#xff09;后端 1、提现接口 2、回调接口 二、还款 &#xff08;一&#xff09;需求 &#xff08;二&#xff09;前端 &#xff08;三&#xff09;后端 1、还款接口 …

第一章:概述

1&#xff0c;因特网概述 1.网络、互联网和英特网 网络(Network)由若干结点(Node)和连接这些结点的链路(Link)组成。 多个网络还可以通过路由器互连起来&#xff0c;这样就构成了一个覆盖范围更大的网络&#xff0c;即互联网(或互连网)。因此&#xff0c;互联网是“网络的网络…

UE蓝图基础学习笔记(未完待续2023/05/03)

文章目录 一、项目创建1&#xff09;准备流程&#xff08;选择模板、开发语言、平台、质量等&#xff09;2&#xff09;界面介绍 二、Actor三、操作关卡对象&#xff08;旋转、移动、缩放和坐标轴&#xff09;四、常用快捷键五、运行游戏六、蓝图介绍七、蓝图节点八、操作事件图…

Azure DevOps Server 2022.0.1升级手册

Contents 1. 概述2. 操作方法 2.1 安装操作系统2.2 安装数据库2.4 还原数据2.3 安装和配置Azure DevOps Server 1. 概述 Azure DevOps Server 是微软公司经过20多年的持续开发&#xff0c;逐渐将需求管理、敏捷实践、源代码管理、持续集成等功能集成一体&#xff0c;实现应用软…

AutoHotKey简单入门

简单入门 快捷键 ^j::Send, Hello world! Return^j::代表CtrlJ&#xff0c;其中^代表Ctrl键 Send命令&#xff1a;在光标处输入Hello world! 也就是说&#xff0c;你按下CtrlJ后&#xff0c;将会输入字符串Hello world! Return即返回 热字串 ::ftw::Free the whales Ret…

抖音营销策略:新手如何利用抖音提高品牌曝光度

随着短规频平台的兴起&#xff0c;抖音作为其中的校佼者&#xff0c;已经成为了众多用户和企业的营销利器。但是&#xff0c;对于抖音新手而言&#xff0c;如何在这个平台上快速提升影响力呢?下面不若与众就为大家分享几个实用的方法。 一、关注抖音热门话题和潮流 抖音平台上…

力扣题库刷题笔记581-最短无序连续子数组

1、题目如下&#xff1a; 2、题解代码实现&#xff1a; 浅看题解&#xff0c;解题思路和本人接替思路一毛一样&#xff0c;奈何没有想到用双指针&#xff0c;在代码实现上也存在问题。当知道用双指针的时候&#xff0c;本题也变得相对简单。思路如下&#xff1a; a、输入仅存在…

Vue条件渲染v-if和v-show

条件渲染v-if和v-show <div id"root"><!-- <div v-if"true">v-if</div>--> <!-- <div v-show"true">v-show</div>--> n:{{n}}<button click"n">点击n</button><div v…

法规标准-UN R152标准解读

UN R152是做什么的&#xff1f; UN R152 全名为关于M1和N1型机动车高级紧急制动系统&#xff08;AEBS&#xff09;型式认证的统一规定&#xff0c;是联合国对于M1和N1型车辆AEBS系统认证的要求说明&#xff0c;当满足其要求内容时&#xff0c;才可通过联合国的认证&#xff0c…

数字化转型导师坚鹏:面向数字化转型的大数据顶层设计实践

面向数字化转型的大数据顶层设计实践 课程背景&#xff1a; 数字化背景下&#xff0c;很多企业存在以下问题&#xff1a; 不清楚大数据思维如何建立&#xff1f; 不清楚企业大数据分析方法&#xff1f; 不了解大数据应用成功案例&#xff1f; 课程特色&#xff1a; …

(转载)01.Matplotlib 图像结构-figure()axes设置

​概要&#xff1a;介绍matplotlib 绘制图像起手&#xff0c; figure() 的设置&#xff0c; axes() 的设置。主要的内容可移步最后部分的总结。 04 Matplotlib 总结 Matplotlib 提供了matplotlib.figure图形类模块&#xff0c;它包含了创建图形对象的方法。通过调用 pyplot 模…

Hive3面试基础

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、基本知识Hive31.表的类型和表的存储格式a)b)c)创建表i&#xff09;ii&#xff09; 2.表 二、使用步骤1.引入库2.读入数据 总结 前言 面试准备之Hive 回顾…