Matlab系列记录之图像处理(结束篇)

  • 前言
  • 图像知识
    • 图像类型
      • 1、RGB图
      • 2、灰度图
      • 3、二值化图
  • 读写图像文件
  • 显示图像
    • 示例
    • 结果
  • 图像运算
    • 直方图
      • 示例
      • 结果
    • 直方图均衡
      • 示例
      • 结果
    • 灰度线性变换
      • 示例
      • 结果
  • 灰度非线性变换
    • 示例
    • 结果
  • 图像变换
    • 图像缩放
      • 示例
      • 结果
    • 图像旋转
      • 示例
      • 结果
  • 结语
    • 更多经常,等你发现~

前言

对于图像处理,我现在也是一知半解的程度,毕业后基本就没接触这些东西了,如果有理解的不对的地方,欢迎指出~

只介绍下一些基本原理和MATLAB上进行图像处理的一些基本操作了,复杂了,我也估计搞不来了,是DIP大佬就可以忽略本篇了…/手动滑稽

图像知识

图像类型

常用或者经常听到的一些图像类型:RGB图、灰度图还有二值化图像等等等。

1、RGB图

顾名思义,由R、G、B三种分量组成的图像,这三种分量分别对应红、绿、蓝,在Matlab上以三维矩阵的形式进行存储,数值在0~255的区间,如果值全是0([0,0,0]),则表示黑色;反之全255([255,255,255]),就是代表白色了。

2、灰度图

灰度图,也称亮度图,在Matlab中是以二维矩阵的形式进行存储,矩阵的每个元素都代表一个像素的灰度值,取值范围也是0~255。

3、二值化图

二值化,就更好理解了,在Matlab中是以一个二维矩阵进行存储,其值只能是0或者1,即只有黑白两色。

读写图像文件

Matlab支持多种图像文件类型的操作,有BMP、JPG、GIF、ICO、TIF等,通过imread和imwrite来实现读写的操作,imread可以将指定位置的图片以矩阵形式读入工作区内,语法如下:

Image=imread(file,FMT);

file填入图像文件的路径和文件名,只写文件名的话,就代表在当前的工作路径或者系统目录查找对应图像文件;FMT是文件的类型,如:bmp;Image就是存储图像数据的矩阵了,彩图就是三维的,灰度图和二值化图像就是二维矩阵了。

写操作的语法与读的一致,语法如下:

Image=imwrite(file,FMT);

显示图像

使用imshow函数就可以显示工作区内图像数据对应的图像,也可以直接显示指定路径下的图像文件,使用语法为:

imshow(I,[low,high],param1,value1,param2,value2,...)
imshow(flie)

I是需要显示的图像数据矩阵,二维矩阵代表的是灰度图像,三维矩阵则为彩图;[low,high]是灰度图的灰度范围,灰度值比low的值小的会转成黑色显示,大于high的转成白色,在范围内的灰度值,按比例显示灰度级;file指定图像的路径和文件名,与读写的使用一致。

示例

%读取图像,显示图像,按新格式保存图像
Pic=imread('cameraman.tif');%系统自带的一幅图
imshow(Pic);
imwrite(Pic,'cameraman.bmp','bmp');

结果

从结果中的1、2、3,可以看到图像按矩阵形式导入到工作区,然后显示再窗口中,并以新的格式写入当前的运行路径~

图像运算

直方图

图像灰度分布情况的信息对图像处理来说,而直方图就是直观的一个方法,使用 imhist 函数即可显示图片的直方图,直方图表述的是图片灰度级出现的频率,横坐标就是对应的灰度值,纵坐标就是其出现次数。

%语法
imhist(I);
imhist(I,n);
%备注:I是图像矩阵,n是指定的灰度级数目,会按将所有的灰度级均匀分布在这n个区间中,默认值是256.

示例

Pic=imread('cameraman.tif');
figure;
subplot(211);imhist(Pic);
subplot(212);imhist(Pic,50);

结果

可以明显看到,灰度级数目随着n从默认值256变为50而变少了。

直方图均衡

直方图均衡又称灰度均衡,就是指将输入的图像转换成每一灰度级上都有近似相同的像素点的图像,从而使得输出的图像的直方图是均衡的,图像也因此增加了高对比度与大动态范围的效果。

用histeq就可以实现该方法

语法:[j,t]=histeq(I)
I是图像矩阵,j是均衡后的图像数据矩阵,t是变换矩阵

示例

Pic=imread('mandi.tif');
figure;
subplot(221),imshow(Pic);title('原图');
subplot(222),imhist(Pic);title('原图直方图');
[j,t]=histeq(Pic);%均衡处理
subplot(223);imshow(j);title('均衡后的图像');
subplot(224);imhist(j);title('均衡后的图像直方图');

结果

使用了一组一维变换矩阵进行变换

图像进行灰度均衡处理后,对比度很明显进行了增强!灰度级的分布也均匀了许多~

灰度线性变换

灰度线性变换和灰度非线性变换,是灰度变换的方式,也是常用的图像处理操作,先介绍下灰度线性变换~

简而言之就是通过指定的线性函数(拉伸或压缩)进行变换来调整图像的亮度,以实现图像增强的目的。

线性函数是一个直线方程,表达式如下:
( x , y ) = a f ( x , y ) + b (x,y)=af(x,y)+b (x,y)=af(x,y)+b

注:a是斜率,b是截距;
若a=1,b=0图像像素不发生变化
若a=1,b!=0图像所有灰度值上移或下移
若a>1输出图像对比度增强
若0<a<1输出图像对比度减小
若a<0暗区域变亮,亮区域变暗,图像求补

所以要进行线性变换,则只需要线性改变图像的灰度值即可~

示例

close all;
clear
I=imread('Lenna2.jpg');%这个是找的一个模特图
Pic=rgb2gray(I);%将彩图转灰度图,灰度图才能使用直方图函数分析figure;
subplot(521); imshow(Pic);title('初始灰度图');
subplot(522); imhist(Pic);title('直方图');%对比度提高
Pic1 = 1.5.*Pic;
subplot(523); imshow(Pic1);title('对比度增强');
subplot(524); imhist(Pic1);title('直方图');%对比度降低
Pic2 = 0.5.*Pic;
subplot(525); imshow(Pic2);title('对比度降低');
subplot(526); imhist(Pic2);title('直方图');%亮度增加
Pic3 = Pic + 50;
subplot(527); imshow(Pic3);title('亮度增强');
subplot(528); imhist(Pic3);title('直方图');%反相显示,即负片
Pic4 = 255-Pic;
subplot(529); imshow(Pic4);title('反相');
subplot(5,2,10); imhist(Pic4);title('直方图');

结果

可以看到灰度值按线性进行了伸缩以及移动,也展现了不同的效果。

灰度非线性变换

灰度非线性变换则是使用非线性函数进行变换来实现增强图像俩高度的目的,如:对数变换和伽马变换。

其中,对数变换可拉深深数值较小的灰度范围,压缩数值较大的灰度范围,比较符合人的视觉特性,其数学函数表达如下:
g ( x , y ) = c ∗ l o g ( 1 + f ( x , y ) ) g(x,y)=c*log(1+f(x,y)) g(x,y)=c∗log(1+f(x,y))

其中,c是一个尺度比例常数,可以改变亮度

伽马变换又称指数变换,或幂变换,对应的函数表达式如下:
g ( x , y ) = c ∗ f ( x , y ) y g(x,y)=c*f(x,y)^y g(x,y)=c∗f(x,y)y

其中,c是尺度比例常数,y是伽马常数。

介绍一个函数:imadjust

%语法:imadjust(I,[low_in; high_in],[low_out; high_out],gamma)
%备注:gamma=1,则是线性变换,反之gamma变换
%low_x和high_x则是将0~255的灰度值范围做限定
%比如:low_in=0.2,high_in=0.8,则截取原图的灰度值,255*0.2~255*0.8,等下看实际效果。

示例

close all;
clear
I=imread('Lenna2.jpg');%这个是找的一个模特图
Pic=rgb2gray(I);%将彩图转灰度图,灰度图才能使用直方图函数分析Pic_2=im2uint8(log(im2double(Pic)+1));%对数变换;log的输入类型是single和double,所以要先转变Pic的数据类型(用的是一个归一化处理函数),然后再反归一化,方便对比数值。
Pic_3=imadjust(Pic,[0.2 0.8],[],0.5);%伽马变换
figure;
subplot(231);imshow(Pic);title('原图');
subplot(234);imhist(Pic);title('直方图');
subplot(232);imshow(Pic_2);title('对数变换');
subplot(235);imhist(Pic_2);title('直方图');
subplot(233);imshow(Pic_3);title('伽马变换');
subplot(236);imhist(Pic_3);title('直方图');

结果

对数变换中,看到灰度值小的被拉伸,灰度值大的被压缩,因而导致图像亮度降低了一些,可以改变尺度比例常数来加亮;伽马变换,则是先取了原图中灰度值为51~204的数据,然后再做的变换,对比度也相对原图强了一些。

图像变换

图像变换有种把原图像的在对应维度,一个起始坐标上的图像数据往维度中的其他坐标位置重新放置,类似在运动的感觉,这之中将用到插值的方法,对变换后的整个空间坐标中的新的图像数据值进行估计,Matlab中的函数大概就是这样实现的,接下来介绍缩放和旋转的内容。

图像缩放

使用imresize函数即可实现图像缩放功能

基础语法:B = imresize(A, SCALE, METHOD)
注:B是输出结果;A是原图的矩阵数据;SCALE是缩放因子,小于1是缩小,大于1是放大,1则不变;METHOD是插值的方法,有:
'nearest'    - 最邻近插值法
'bilinear'   - 双线性插值
'bicubic'    - 三次插值,默认的方法;%好像有的Matlab版本是另外的方法,我用Matalb R2016a进行的本篇记录

示例

[I,map]=imread('m83.tif');%map是颜色信息,放大缩小也都需要输入这些信息,灰度图则不需要
[J,map2]=imresize(I,map,0.5);
[K,map3]=imresize(I,map,2);
figure;imshow(I,map);title('原图');%只开一个figure,展示效果不佳
figure;imshow(J,map2);title('缩小');
figure;imshow(K,map3);title('放大');

结果

图像旋转

图像旋转使用imrotate实现,语法如下:

B = imrotate(A,angle,method)
注:除了angle是角度外,其他与缩放的一致。

示例

I=imread('saturn.png');%map是颜色信息J=imrotate(I,60);
K=imrotate(I,-30);figure;
subplot(131);imshow(I);title('原图');
subplot(132);imshow(J);title('逆时针°');
subplot(133);imshow(K);title('顺时针30°');

结果

随着旋转,图像大小会有所改变,一般是比原图大(使用了同一个figure,会直接限定显示的尺寸,所以看着变小了,实际不然);然后多出的部分都会填0,即黑色。

结语

从去年6月到今日,一年多,跌跌撞撞的写,关于Matlab系列的篇章终于可以说一声”结束了“,依然还有很多东西感觉未能很好的表述出来,不过对于大多数的学习和使用,已经足够了,再具体往下细化和专业化,就应该是一些具体领域的应用和实践。

敬请期待下一个系列文章的出现吧~


更多经常,等你发现~


Matlab系列记录之图像处理(结束篇)相关推荐

  1. 【CV/Matlab系列】基于图像处理的苹果质量检测和分级系统【含Matlab源码】

    DATE: 2020.10.18 文章目录 前言 1.代码获取方式 2.效果展示 2.1.示例1 2.2.示例2 前言 在之前大学毕设时,设计了一种基于图像处理的苹果质量检测和分级系统.采用matla ...

  2. Matlab系列之符号运算(上)

    Matlab系列之符号运算 前言 创建符号对象 基本操作 符号变量的基本操作 符号表达式的基本操作 四则运算 多项式的操作 符号表达式化简 符号表达式的替换 反函数求解 复合函数 更多精彩等你发现~ ...

  3. Matlab系列之数组(矩阵)的生成

    从本篇开始,会有一段时间都将用于记录数组.矩阵的操作等等,如果以前没有接触过相关的,可能会觉得要展示的是很复杂的东西,但并不是,这是一个很简单的部分,但也是一个很重要的部分,至少现在的我觉得这部分的内 ...

  4. [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  5. Matlab系列之绘图基础

    Matlab系列之绘图基础 前言 图形句柄与对象 对象属性 应用实例 运行结果 图形句柄的创建 图形窗口对象 实例程序 运行效果 坐标轴对象 实例程序 运行效果 曲线对象 实例程序 运行效果 文字对象 ...

  6. [Python从零到壹] 四十一.图像处理基础篇之图像采样处理

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  7. 明翰英语教学系列之雅思阅读篇V0.9(持续更新)

    文章目录 传送门 6. 阅读 READING 6.1 阅读评分标准 6.2 阅读题型 `6.2.1 阅读填空题` `摘要填空题(Summary)` `无选项摘要填空` 1. 找定位词 2. 确定答案词 ...

  8. Matlab系列之GUI设计基础

    Matlab系列之GUI设计基础 简介 编辑界面 菜单设计 控件设计 控件描述 个人理解 Matlab转译 控件属性 [1]外观与行为 [2]控件对象的信息 [3]回调函数 [4]状态信息 结束 更多 ...

  9. Git入门介绍-5-Tags-入门结束篇

    本篇介绍Tags, 如果学习过HTML的,应该知道,字面意思就是一个标签.在git中,前面我们介绍了branch.为什么有了分支,还要有标签呢.实际上,tags是branch中的一些小阶段的标记.例如 ...

最新文章

  1. 彻底理解HashMap及LinkedHashMap
  2. 通过游戏来学习CSS的Flex布局
  3. Ubuntu 20.04 LTS安装搜狗输入法,只需三条命令,还能自动更新
  4. linux 7 没有权限访问,技术|RHCSA 系列(十三): 在 RHEL 7 中使用 SELinux 进行强制访问控制...
  5. 英语语法---短语总结
  6. boost::intrusive::pointer_traits用法的测试程序
  7. activemq 发两条只收到一条_浅谈ActiveMQ与使用
  8. [Leedcode][JAVA][第98题][验证二叉搜索树]
  9. 入门机器学习(十六)--降维(PCA算法)
  10. opencv-api arcLength
  11. [Linux] 头文件加载顺序
  12. python自学视频推荐-python自学视频看这个就对了
  13. VBA:一个Word VBA编程的例子
  14. 离散数学(第二版) 第一章、第二章习题
  15. Word自动生成目录的方法
  16. 基于Paddle Lite在Android手机上实现图像分类
  17. 使用canvas画二维码
  18. 掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦
  19. Qt QTreeWidget 详解
  20. scanf函数的返回值以及在while循环中的应用

热门文章

  1. 河北大学计算机学院张小升,院系动态
  2. JS截取字符串方法和对象判空
  3. 教师资格考试系统报“访问超时,请点击页面右上角“退出”按钮后重新登录。”解决方法
  4. 开发一个c语言程序需要经过哪些步骤,C语言编译过程的4个步骤
  5. 节后上班第一天快速进入工作状态的建议
  6. springmvc、struts2、servlet的联系与区别
  7. [modern c++] std::unique_ptr 的 get() 易错点
  8. python 视频滤镜_Python 视频处理:滤镜之赛博朋克
  9. 什么是血氧仪检测器血氧饱和浓度异常监测
  10. FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.tez.TezTask