图像处理matlab项目

2015-10-12 19:47:54 zxc024000 阅读数 87096

写在前头:说到数字图像处理,不得不提起MATLAB。这是一款非常方便的仿真软件,绝大多数的图像处理可以用MATLAB完成。
  有人问,处理图片,用PS岂不是更好。两者各有优点,如果需要将10000幅图片转换成灰度图像并保存呢?MATLAB只需要一段很短的程序运行几秒就可以完成这个工作。
本文基于MatlabR2012a,将由浅入深写下去。

MATLAB中图像的基本操作

1、读取、显示图片

MATLAB中提供了immread()与imshow()函数读取和显示图片。其中读取函数imread()原型:

imread:
A = imread(filename, fmt)

A是结构体名,用来存储读入的图像数据。filename是读取的文件名,文件名要用”括起来。fmt是读取文件的类型如:jpg、png等等,这个参数可以不输入,由MATLAB自动判断。
显示函数imshow()原型:

    imshow:
    imshow(I)

I为读取后保存在MATLAB中的结构体名。
程序实例:  

A=imread('1.jpg');%读取名为1.jpg的图片
     imshow(A)%显示图片

这里写图片描述

2、将灰度图片变成负片

  对图像进行操作,实际上是将图像看成许多个像素点,对每个像素点进行操作。在计算机系统中,灰度图片被看成是许多个由值在[0~255]之间的像素点组成的图像,255表示白色,0表示黑色,黑白之间存在256个灰度级。
这里写图片描述
  负片是指将原灰度图白色的地方变成黑色,黑色的地方变成白色。也就是将0变成255,255变成0。MALTAB的imadjust()函数提供了该功能。其函数原型:  

imadjust:
  J = imadjust(I,[low_in; high_in],[low_out; high_out])

  其中,I为原灰度图像,low_in,high_in为输入图像的低和高灰度级,设置为[0,1]表示从0~255的归一化,low_out,high_out为输出图像的低高灰度级。
  若是想将图片转换为负片,那么将[low_in; high_in]设置为[0,1],将[low_out; high_out]设置为[1,0]。即原来输入为0的地方变成1输出,输入为1的地方变成0输出。
  实例: 

 A=imread('1.jpg');
imshow(A)%显示原图
A1=imadjust(A,[0,1],[1,0]);%将灰度级对调
figure,imshow(A1)%显示负片

  这里写图片描述
  

3、彩色图片转换成灰度图片

  我们在计算机中看到的大多数彩色图片是基于RBG三通道的图片,红绿蓝三种颜色,每一种取值均为[0~255]。通过255*255*255,可以构成庞大的颜色群。而灰度图像只有256个灰度级。通过以下公式可以将RGB转换成灰度
  GRAY=0.2989 R + 0.5870 * G + 0.1140 * B*
  MATLAB中提供的函数rgb2gray为我们提供了将彩色图片转换成灰度图片的功能。函数原型: 

I = rgb2gray(RGB)

实例:

 A=imread('001.png');%原彩色图片
imshow(A)
A_gray=rgb2gray(A);%转换成灰度图片
figure,imshow(A_gray)

这里写图片描述
  

2019-07-16 16:05:55 MoeDisk 阅读数 563

MATLAB是一款数学软件,是MatrixLaboratory(矩阵实验室)的缩写。它把数学中的矩阵和线性代数等知识和传统的计算机编程语言结合到了一起,并内置了丰富的库,让很多算法轻松实现仿真化成为了可能。比如,你通过数学写了一个二维图像灰度变换的函数公式,可以在matlab下轻松地像以C语言math情况下去描述它,并实现赋值计算,再通过它内置的图形计算库还可以把你的算法完完全全仿真出来。

MathWorks公司历史悠久、团队强大、产品专一。它的matlab产品可用于多种学术研究专业,这样首屈一指的软件使得它在全世界都十分流行。也是数字图像处理仿真的好帮手。本文送给从未接触过matlab的朋友们。


关于数图处理的一些前景知识;

图像处理系统基础设计的一个重要特点是测试和实验的有效程度。系统方法和快速原型候选解决方案的能力在减少运算开销和时间方面起着重要的作用。

一幅图像可以定义为一个二维函数f(x,y),其中x和y是空间坐标,而f在任意坐标(x,y)处的幅度称为图像在该点处的亮度和灰度。彩色图像是由多个单色图像组合而成。当x,y和f的幅值都是有限的离散值时,称该函数为数字图像。数字图像是由有限数量的数组组成的,每个元素都有一个特殊的位置和数值。这些元素称为图片元素(picture element)、图像元素(image element)和像素(pixels\pels)。

数字图像处理分为低中高三种处理: 低级处理包括原始操作(降低噪声、对比度增强..),输入输出都是图像。 中级处理(分割..),把图像分为区域或目标,然后对目标进行描述。输入是图像,输出是图像提取出的属性。 高级处理通过执行通常与人类视觉相关的感知函数,来对识别的对象进行总体确认。


matlab与数字图像处理的一些关系;

一幅图像可定义为一个二维数组f(x,y),其中x和y是空间(平面)坐标。图像关于x坐标、y坐标和幅度是连续的。将坐标值数字化称为采样,将幅值数字化称为量化。当x、y和幅值f都是有限的、离散的量时,我们称该图像为数字图像。

采样和量化得到的是一个实数矩阵。假设对一幅图像f(x,y)采样后得到一个M行、N列的图像。我们可以称这幅图像的大小是MxN,坐标的值是离散量。

这样,一幅二维数字图像就可以把它看做成一个矩阵函数f(x,y),把阵列的每个元素赋值就可以显示出东西。这个阵列的每个元素都称为图像元素、图画元素或像素。一个1N的矩阵被称为一个行向量,一个M1的矩阵被称为一个列向量。一个1*1的矩阵则被称为标量。

把二位数字图像看成矩阵,这样我们就可以轻松地在matlab中做各种仿真尝试惹。


matlab数据的表示和运算;

matlab的命令行(>>)窗口是我们操作matlab的一个重要媒介。

我们可以进行一些简单计算,比如把2+2的值赋给变量a。

a=2+2

如果输入的表达式后面加上分号;的话,那么结果就不会显示出来。还有,matlab的变量名是对大小写字母敏感的。它主要支持以下数值运算符:

+(加)、-(减)、*(乘)、/(除)、^(幂)、'(矩阵转制)。

同时,matlab中还提供一些预定义变量可以直接使用。

i或j    根号1
pi      π
abs     数值的大小(实数的绝对值)
angle   复数的角度,以弧度表示
real    求复数的实部
imag    求复数的虚部
cos     余弦函数,假设角度是弧度制
sin     正弦函数。假设角度是弧度制
exp     指数函数
sqrt    求平方根

matlab矩阵的表示和运算;

我们可以指定元素建立向量。创建一个1*4的行向量:

v=[1 3 5 7]; 或 v=[1,3,5,7];

也可以增加向量,变成1 3 5 7 8:

v(5)=8;

用等间隔元素建立向量:

t=0:.1:10;

这个命令创建了一个1*101的向量,元素为0,0.1,0.2,…,10。这个表达式中前面的数字表示初值,后面的数字表示终值,中间的数字表示增量。

函数linespace和logspace也可用于创建向量;

x=linespace(a,b,n);
a表初值,b表终值,n指定元素个数,默认n为100,x是1*n的线性等间隔分部的向量。
x=logspace(a,b,n);
a表示的向量初值为10的a次方,b表示终值为10的b次方,n指定元素个数,默认n为50,x是1*n的向量,这n个元素取以10为底的对数后在[a,b]间等间隔分布。

矩阵可以通过输入行列元素获得:

M=[1 2 4;3 6 8];
M=1.00  2.00    4.00
  3.00  6.00    8.00

矩阵特定位置元素可以通过下面的命令赋值:

M(1,2)=5;

用下面几个命令可以定义一些特殊矩阵:

M=[];            空矩阵
M=zeros(n,m);    n*m的0矩阵
M=ones(n,m);     n*m的1矩阵
M=eye(n);        n*m的单位阵

要得到向量或矩阵的规模可以用下面这两个函数:

[r,c]=size(A)   r、c分别为矩阵A的行数和列数
n=length(b)     n为向量b的长度

matlab部分基本常用功能;

波形的绘制:

plot            绘制曲线图
stem            绘制杆图
hold on         保留当前图形及坐标的全部属性
hold off        恢复图形设置缺省值
grid on         画网格线
grid off        去掉网格线
subplot(m,n,p)  将当前窗口分成m*n个子图,并选择在其中第p个上绘图
figure          创建图形窗口
xlabel          横轴标注
ylabel          纵轴标注
legend          在右上角建立一个图例说明盒
axis            确定坐标轴刻度范围
text            在图中特定位置标注

数据的输入和输出:

load my.mat     调用my.mat数据文件
load data.txt   调用txt文件,并生成与文件名同名的变量
save my t y     把变量t和y保存名为my.mat的二进制文件
save data.txt t y-ascii
把变量t和y保存名为data.txt的8位ASCII文件

其它常用matlab命令:

who     列出内存中的变量名
whos    列出内存中变量的详细信息
clc     清除命令窗口
clear   清除内存变量和函数
clf     清除图形窗口
sound   对声音进行回放
help    帮助

你还可以尝试在安卓或ios端安装matlab官方的远程软件操控电脑端的matlab,需要局域网环境和较新版本的matlab。

connector on
connector on password
connector off

matlab下的数字图像处理快速上手;

读入数字二维图像文件到matlab变量f:

f=imread('test.png');

在新的图形窗口显示变量f中的图像:

figure,imshow(f)

写入图像write函数(调整质量的范例):

imwrite(f,'test.png','quality','q');
q是0到100的一个整数,数字越小劣化越高

matlab提供惹一个图像处理工具箱,它把matlab数值计算环境扩展到图像处理的函数合集。

工具箱支持4种图像类型:

灰度级图像(Gray-scale images)
二值图像(Binary images)
索引图像(Indexed images)
RGB图像(RGB images)

类和图像类型:

double      双精度浮点数,范围±10的308次方(8byte/元素)
single      单精度浮点数,范围±10的38次方(4byte/元素)
uint8       无符号8字节整数,范围[0,255](1byte/元素)
uint16      无符号16字节整数,范围[0,65535](2byte/元素)
uint32      无符号32字节整数,范围[0,4294967295](4byte/元素)
int8        有符号8字节整数,范围[-128,127](1byte/元素)
int16       有符号16字节整数,范围[-32768,32767](1byte/元素)
int32       有符号32字节整数,范围[-2147483648,2147483647](4byte,元素)
char        字符(2字节/元素)
logical     值为0或1(1字节/元素)

类uint8和logical广泛地用于图像处理,浮点类double和single用于计算灰度的操作。

灰度级图像:一幅灰度级图像是一个数据矩阵,矩阵的值表示灰度的浓淡。

二值图像:一幅二值图像是一个取值只有0和1的逻辑数组。使用函数logical可将数值数组转换为二值图像。

判断c是否为二值数组:islogical(c)
转换变量A到g变为二值图像:g=mat2gray

matlab下的M文件;

M文件是大量MATLAB命令的集合,它以文本文件的形式存储,文件后缀".m"。M文件可以是一个有输入、输出变量的函数,也可以是一系列的命令脚本。可以直接放到matlab里执行。

引例,一个计算两数之和的函数:

创建:edit z
function z=yplus(y,x)
z=y+x;
调用:z=yplusx(2,3)

关系运算符:
<(小于)、>(大于)、<=(小于等于)、>=(大于等于)、==(等于)、~=(不等于)。
逻辑运算符:
&(逐个元素"与")、|(逐个元素"或")、~(逐个元素"非")、&&(标量"与")、||(标量"或")。

流控制语句:
if          if与else和elseif一起,执行基于指定逻辑条件的一组语句
for         对一组语句执行规定次数
while       根据规定的逻辑条件,对一组语句执行不确定的次数
break       中止执行for或while循环
continue    将控制传递到for或while循环的下一次迭代,跳过循环体中所剩余的语句
switch      switch与case和otherwise一起,根据规定的值或字符串执行不同的语句组
return      使执行返回到调用参数
try...catch 若在执行过程中检测到错误,则改变流控制

matlab函数tic和toc可用于测量函数执行的时间。

tic;sinfun1(100);toc

函数timeit可用于得到函数调用的可靠的可重复的时间测量。

s=timeif(f)

利用矩阵和向量形式写的M文件效率比较高。循环和if语句也可以在matlab中使用,但是计算效率较低,所以要谨慎使用。

向量化说明和函数meshgrid的介绍。

我们用matlab基于如下公式写函数来创建一幅合成图像:f(x,y)=Asin(u0x+v0y)

for循环版:

function f=twodsin1(A,u0,v0,M,N)
f=zeros(M,N);
for c=1:N
    v0y=v0*(c-1);
    for r=1:M
        u0x=u0*(r-1);
        f(r,c)=A*sin(u0x+v0y);
    end
end

meshgrid向量版:

function f2=twodsin2(A,u0,v0,M,N)
    r=0:M-1;
    c=0:N-1;
    [C,R]=meshgrid(c,r);
    f2=A*sin(u0*R+v0*C);
end

检验:

timeit(@()twodsin1(1,1/(4*pi),1/(4*pi),512,512))
f=twodsin1(1,1/(4*pi),1/(4*pi),512,512);
imshow(f,[])

向量化形式运行的时间约可少50%。


本地磁盘姬

ohayou.aimo.moe

微博:@本地磁盘姬碟酱

Twitter:本地磁盘姬

2019年07月16日

2018-09-07 22:44:43 qq_39990094 阅读数 8014

1.基本函数:

iread('文件路径');

idisp();

2.一元操作:o[u,v]=f(I[u,v])

imd=idouble(im);  //将像素从unit8(范围在0-255的整数像素)到范围在[0,1]的双精度值

grey=imono(im);    //将彩色图像转变成灰度图像。

ihist();//显示每一个像素值出现的次数

im=igamma(im,1/0.45); //伽马编码,一种非线性一元操作

3.二元操作:o[u,v]=f(I_{1}[u,v],I_{2}[u,v])

isamesize(image1,image2);  //将2缩放并裁剪到跟1相同的大小

........

4.空间操作o[u,v]=f(I[u+i,v+j])

 

4.1互相关 o[u,v]=\sum _{(i,j)\epsilon w }I[u+i,v+j]K[i,j], K是互相关核,对于每一个输出像素,对应输入图像中的像素窗口w要逐个元素地与互相关核K相乘。

在工具箱中,互相关使用函数iconv表示。iconv(image,K);

 

4.1.1平滑处理(光滑化、模糊化或者散焦)

K=ones(21,21)/21^2; //每一个输出像素都是输入图像中与之相对应的21x21相领像素的平均值  ->平均值滤波

G(u,v)=\frac{1}{2\pi\sigma ^{2} }e^{-\frac{u^{2}+v^{2}}{2\sigma ^{2}}}  二维高斯函数(关于原点对称,曲线下方体积为1)的扩展由标准差参数\sigma控制。 ->高斯滤波

K=kguass(5); //指定标准差为5像素

 

4.1.2边界检测:
 lena=iread('C:\Users\Administrator\Desktop\matlab实验照片\2.jpeg','double','grey');

 p=lena(60,:);  //在v=60处图像中的一条水平线

沿着这个横截面的一阶倒数是p^{^{'}}[v]=p[v]-p[v-1],一阶倒数可以用diff函数计算。->亮度变化的倒数

在v点处的导数也可以写成对称的一阶差分:p^{^{'}}[v]=\frac{1}{2}(p[v+1]-p[v-1])

它等同于和下面的一维互相关核求互相关运算:

                                                                 K=(-\frac{1}{2} 0 \frac{1}{2})

将图像与这个核求互相关:

K=[-0.5 0 0.5];

idsip(iconv(lena,K),'invsigned')    ->图片具有高水平梯度的竖直边缘清晰可见。效果如下所示(上面为原图):

  

利用索伯互相关核计算水平梯度,利用三行水平梯度的加权值。

Du=ksobel,上图为原图,下面为处理之后的

坎尼算子:

算法大致流程:

1、求图像与高斯平滑滤波器卷积:

2、使用一阶有限差分计算偏导数的两个阵列P与Q:

3、幅值和方位角:

4、非极大值抑制(NMS ) :细化幅值图像中的屋脊带,即只保留幅值局部变化最大的点。

将梯度角的变化范围减小到圆周的四个扇区之一,方向角和幅值分别为:

非极大值抑制通过抑制梯度线上所有非屋脊峰值的幅值来细化M[i,j],中的梯度幅值屋脊.这一算法首先将梯度角θ[i,j]的变化范围减小到圆周的四个扇区之一

edges=icanny(lena,2);效果如下所示:

4.2模板匹配O[u,v]=s(T,W)

函数s(T,W)是一个标量测度,用来描述两幅相同大小的图像T和W之间的相似性。

常用方法有:绝对差值(SAD),差值平方和(SSD)以及互相关(NCC)

 

2017-06-24 09:17:09 hongbin_xu 阅读数 38656

学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧。前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码。今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码。这里没有使用神经网络等,只是用了最基础的数字图像处理算法,最后通过模板匹配,得到结果。

源码下载链接:

下载链接(注意:有两套,第二套是后来改进的,都能运行的)

运行结果:

这里写图片描述
这里读取了车牌图片目录中的第一幅图片,并显示出来了原图像;随后计算出车牌的区域,进行图像切割,单独把车牌提取出来;最后,从图像中切割出每个字符,并与事先准备好的模板进行匹配,找到与其误差最小的模板就认为是对应的字符。
这里写图片描述
这里是另外一个识别车牌号的结果。

程序思路:

第一步:从原图像中切割出车牌,去除无用信息
1、读取原图像。
这里写图片描述

2、将原始彩色图像转换成灰度图像,并显示直方图(如果分布十分不均匀,使用直方图均衡化处理)。
这里写图片描述

3、使用roberts算子进行边缘检测(MATLAB中调用edge函数)。
这里写图片描述

4、图像腐蚀(去除不需要的边缘信息,尽可能只保留车牌上字符的轮廓)。
这里写图片描述

5、图像膨胀(平滑图像轮廓,图中没能完全滤出车牌之外的所有边缘信息,剩下了一部分,其实就是车牌上的那个奥迪标志,后面还要想办法把它给去掉)。
这里写图片描述

6、从图像中移除小块对象(调用bwareaopen()函数,从图像中删除所有少于2200像素8邻接的区域,最后只剩下车牌区域了)。
这里写图片描述

7、根据最后图像中“白色”的那部分界定车牌所处的区域,并重新在原图像中进行切割,得到车牌的图像。
这里写图片描述

第二步:从前面得到的车牌图像中切割出每个字符
1、先将车牌图像转换为灰度图像并绘制直方图。
这里写图片描述

2、为增强对比度,对灰度图像再做直方图均衡化。
这里写图片描述

3、将图像二值化。
这里写图片描述

4、中值滤波,滤除一些无用信息。
这里写图片描述

5、调用编写的my_imsplit.m和getword.m脚本,计算每个字符的位置,并逐一进行切割,得到只储存单一字符的图像。
这里写图片描述

这里写图片描述

6、与准备好的字符模板比对,计算出与其误差最小的某个字符模板,识别为对应的字符。
这里写图片描述

最后的识别结果:
这里写图片描述

2018-06-18 20:25:13 weixin_40590063 阅读数 20419

前言:本文类似于学习笔记,所以有疑问或者有什么宝贵的建议欢迎在下方留言。(注:本文代码大部分可从《数字图像处理 第三版》中找到

使用软件:MATLAB R2018a

参考资料:《数字图像处理 第三版》,CSDN博客

使用初音图片P站画师uid:1589657。

最终实现效果:(下图)

 

 

正文内容

    打开matlab后输入guide后弹出选择界面,新建一个GUI界面

在左边选择自己需要按钮在界面中展出后,右键该按钮选择查看回调→Callback打开后会自动跳转到该按钮的代码块,只要在定位到的function pushbutton1_Callback代码下写要实现的功能就可以了。

下面直接展示相关代码功能:

(1)导入图片

[file path]=uigetfile('*.bmp;*.jpg;*.png','请选择一幅图像');
if file==0 warndlg('您得输入一幅图像');
%警告对话框提示输入合法图像文件
else
    I=imread(fullfile(path,file));
    axes(handles.axes1);
    imshow(I);title('原图像');
    handles.I=I;
end
%Update handles structure
guidata(hObject,handles);

(2)清除图片和文本框内容

%清除视图图片
cla(handles.axes2,'reset');  %handles.axes2为显示图片窗口,reset即清除
% 重置清空动态txt的文字
set(handles.edit1,'string','');  %handles.edit1为要清除文字的文本框(双击文本框可以看见tag)

(3)关闭程序

close

(4)平移(用文本框实现输入数字进行平移图像)

        ①先创建一个可编辑文本框(输入水平平移的位移),然后给他添加代码

%获取text文本框的数字,竖直平移X的数值
global x;%定义一个x的全局变量
x=str2num(get(hObject,'String'));

        ②先创建一个可编辑文本框(输入竖直平移的位移),然后给他添加代码

%获取text文本框的数字,竖直平移Y的数值
global y;
y=str2num(get(hObject,'String'));

        ③创建一个button,给他添加代码

global y;
global x;
I=handles.I;
axes(handles.axes2);
se=translate(strel(1),[x y]);  
j=imdilate(I,se); 
axes(handles.axes2);
imshow(j);title('竖直平移后图像');

    在X和Y的文本框中输入数值,点击button后就能使图像平移了(如输入X:260;Y:90)

 

 

(5)旋转

 

%图像的旋转
I=handles.I;
a=str2num(get(hObject,'String'));
J1=imrotate(I, a);   %设置旋转角度,实现旋转并显示
axes(handles.axes2);
imshow(J1);title('旋转后图像');
guidata(hObject,handles);

(6)镜像

%用下拉列表实现水平镜像,垂直镜像,水平垂直镜像
switch get(hObject,'value')   %实现下拉列表需要写改语法
case 1
       
case 2
         I=handles.I;
        J1=flipdim(I,2);%原图像的水平镜像
        axes(handles.axes2);
        imshow(J1);title('水平镜像');
        guidata(hObject,handles);
case 3
         I=handles.I;
        J2=flipdim(I,1);%原图像的垂直镜像
        axes(handles.axes2);
        imshow(J2);title('垂直镜像');
        guidata(hObject,handles);
case 4
         I=handles.I;
        J3=flipdim(I,1);%原图像的水平垂直镜像
        J4=flipdim(J3,2);
        axes(handles.axes2);
        imshow(J4);title('水平垂直镜像');
        guidata(hObject,handles);
end

下面就不把全部代码都写出来了,只挑选一部分出来(上面代码几乎能实现每个按钮的用法)

(7)DCT变换

%DCT变换(P58)
I=handles.I;
J=rgb2gray(I);%将图片转变为灰色图像
axes(handles.axes2);
imshow(J);title('原灰图像');
K=dct2(J);%对图像做DCT变换
axes(handles.axes3);
imshow(log(abs(K))+1,[0,10]);title('DCT变换结果');

 

(8)对受椒盐噪声污染的图像采用中值滤波去噪

I=handles.I;
I=rgb2gray(I);%转化为灰度图像
J=imnoise(I,'salt & pepper',0.04);%对图像增加椒盐噪声,强度为0.04
axes(handles.axes2);    %显示在axex2框中
imshow(J); title('受椒盐噪声污染图片');
K=medfilt2(J);          %二维中值滤波
axes(handles.axes3);
imshow(K);title('二维中值滤波处理后的图片');

 

(9)彩色图像增强(分别使用RGB和HSV方法)——用下拉列表实现

switch get(hObject,'value')
    case 1
        
    case 2
        RGB=handles.I;
        R=RGB(:,:,1);
        G=RGB(:,:,2);
        B=RGB(:,:,3);
        R1=histeq(R);
        G1=histeq(G);
        B1=histeq(B);
        RGB1=cat(3,R1,G1,B1);
        axes(handles.axes2);    %显示在axes2框中
        imshow(RGB1);title('RGB增强');
    case 3
        RGB=handles.I;
        R=RGB(:,:,1);
        G=RGB(:,:,2);
        B=RGB(:,:,3);
        R1=histeq(R);
        G1=histeq(G);
        B1=histeq(B);
        RGB1=cat(3,R1,G1,B1);
        [H,S,V]=rgb2hsv(R,G,B);
        V=histeq(V);
        [R2,G2,B2]=hsv2rgb(H,S,V);
        RGB2=cat(3,R2,G2,B2);
        axes(handles.axes2);    %显示在axes2框中
        imshow(RGB2,[]);title('HSV增强');
        C=double(RGB1)./255-RGB2;
        axes(handles.axes3);    %显示在axes3框中
        imshow(C);title('差值图像');
end

RGB增强:

HVS增强:

(10)彩色图像锐化

代码引用了:点击打开链接

I=handles.I;
fb=tofloat(I);  	%将图像转化为浮点型
lapmask=[1 1 1;1 -8 1;1 1 1]; 	%拉普拉斯滤波模板
fen=fb-imfilter(fb,lapmask,'replicate');
axes(handles.axes2);
imshow(fen);title('拉普拉斯锐化');
function [out,revertclass] = tofloat(inputimage)
%Copy the book of Gonzales
identify = @(x) x;
tosingle = @im2single;
table = {'uint8',tosingle,@im2uint8 
         'uint16',tosingle,@im2uint16 
         'logical',tosingle,@logical
         'double',identify,identify
         'single',identify,identify};
classIndex = find(strcmp(class(inputimage),table(:,1)));
if isempty(classIndex)
    error('不支持的图像类型');
end
out = table{classIndex,2}(inputimage);
revertclass = table{classIndex,3};

 

 

 

(10)彩色图像复原

%维纳滤波复原图像
I=handles.I;
len=28;
theta=14;
PSF=fspecial('motion',len,theta);
blurred=imfilter(I,PSF,'circular','conv');%读入无噪声模糊图像,并命名blurred
len=28;
theta=14;
wnrl=deconvwnr(blurred,PSF,0.04);%维纳滤波复原图像
axes(handles.axes2);
imshow(blurred);title('由运动形成模糊图像');%显示模糊图像
axes(handles.axes3);
imshow(wnrl);title('维纳滤波复原图像');%显示复原图像

(11)square膨胀

%用square结构元素膨胀图片(用text文本框比较好)
a=str2num(get(hObject,'String'));
I=handles.I;
se1=strel('square',a);
I1=imerode(I,se1);
axes(handles.axes2);    %显示在axes2框中
imshow(I1);title('用square结构元素膨胀图片');

这里输入了20的数值

(12)边缘检测(使用canny算子)

I=handles.I;
        I=rgb2gray(I);
        BW5=edge(I,'canny');%进行canny算子边缘检测,门限值采用默认值
        axes(handles.axes2);    %显示在axes2框中
        imshow(BW5,[]);title('canny算子');

 

附上源程序:点击打开链接

链接:https://pan.baidu.com/s/1lxPy7NIboCSK5_pq_9OKTQ
提取码:v6mz

MATLAB图像处理

阅读数 6378