前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Matlab系列记录之图像处理(结束篇)

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

作者头像
狂人V
发布2021-10-20 11:31:53
1.2K0
发布2021-10-20 11:31:53
举报
文章被收录于专栏:电子狂人电子狂人

前言

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

只介绍下一些基本原理和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指定图像的路径和文件名,与读写的使用一致。

示例

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

结果

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

图像运算

直方图

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

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

示例

代码语言:javascript
复制
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是变换矩阵

示例

代码语言:javascript
复制
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('均衡后的图像直方图');

结果

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

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

灰度线性变换

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

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

线性函数是一个直线方程,表达式如下:

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

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

示例

代码语言:javascript
复制
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('直方图');

结果

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

灰度非线性变换

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

其中,对数变换可拉深深数值较小的灰度范围,压缩数值较大的灰度范围,比较符合人的视觉特性,其数学函数表达如下:

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

伽马变换又称指数变换,或幂变换,对应的函数表达式如下:

其中,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,等下看实际效果。

示例

代码语言:javascript
复制
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进行的本篇记录

示例

代码语言:javascript
复制
[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是角度外,其他与缩放的一致。

示例

代码语言:javascript
复制
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,即黑色。

END

结语

从去年6月到今日,一年多,跌跌撞撞的写

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-10-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 电子狂人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 图像知识
    • 图像类型
      • 1、RGB图
      • 2、灰度图
      • 3、二值化图
  • 读写图像文件
  • 显示图像
    • 示例
      • 结果
      • 图像运算
        • 直方图
          • 示例
          • 结果
        • 直方图均衡
          • 示例
          • 结果
        • 灰度线性变换
          • 示例
          • 结果
          • 示例
          • 结果
      • 灰度非线性变换
      • 图像变换
        • 图像缩放
          • 示例
          • 结果
        • 图像旋转
          • 示例
          • 结果
      • 结语
      相关产品与服务
      图像处理
      图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档