MATLAB第十章_图像处理算法

news/2024/10/24 4:00:01/

目录

图像处理算法

图像处理基础

图像处理函数

默认显示方式

添加颜色条

显示多帧图像

显示动画

三维材质图像

图像的直方图

灰度变换

均衡直方图

图像处理应用

图像增强

图像重建

图像变换

图像压缩

图像分割

图像边缘检测

图像识别


图像处理算法


图像处理基础


        数字图像处理技术主要包括:图像增强、图像重建、图像变换、图像压缩、图像分割、图像边缘监测和图像识别等。

(1)图像增强

①空域法:在图像所在的像素空间进行处理

②频域法:通过对图像进行傅里叶变换后再频域上间接进行的

(2)图像重建

(3)图像变换

        把图像从空域转换到频域,对原图像函数寻找一个合适变换的数学问题。可分为可分离变换和统计变换两大类。

(4)图像压缩

(5)图像分割

        图像分割的方法主要有两种:一种是假设图像各个成分的强度值是均匀的,并利用这个特性,这种方法的技术有直方图分割;另外一种方法是寻找图像成分之间的边界,利用的是图像的不均匀性,基于这种方法的有梯度法分割

(6)图像边缘检测

        监测图像中的线状局部结构

(7)图像识别

        图像识别是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对象的技术


图像处理函数


默认显示方式

 imshow - 显示图像
在图窗中显示灰度图像 I。imshow 使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。

imshow(I) 在图窗中显示灰度图像 Iimshow 使用图像数据类型的默认显示范围,并优化图窗、坐标区和图像对象属性以便显示图像。

imshow(I,[low high]) 显示灰度图像 I,以二元素向量 [low high] 形式指定显示范围。

imshow(RGB) 在图窗中显示真彩色图像 RGB

imshow(BW) 在图窗中显示二值图像 BW。对于二值图像,imshow 将值为 0(零)的像素显示为黑色,将值为 1 的像素显示为白色。


添加颜色条

        GUI 可以给图像添加颜色条控件,从而通过颜色条来判断图像中的数据数值。

imshow WIN7.png
colorbar


显示多帧图像

两种显示方式:

①在一个窗体中显示所有帧

②显示其中单独的某帧

创建多帧图像

montage - Display multiple image frames as rectangular montage. This MATLAB function displays all frames of a multiframe image array I.

 load mri
montage(D,map)

 单独显示第20帧

load mri
imshow(D(:,:,:,20))


显示动画

        movie命令从多帧图像中创建动画,但是这个命令只能处理索引图。

load mri
mov = immovie(D,map);
colormap(map), movie(mov)

immovie - 基于多帧图像制作影片
此 MATLAB 函数 从使用颜色图 cmap 的多帧索引图像 X 中的图像返回影片结构体数组 mov。


三维材质图像

        这种三维图像是指在三维图的表面显示二维图像。warp函数的功能是显示材质图像,所使用的技术是线性插值。

[x,y,z]=sphere;
A=imread('win7.png');
warp(x,y,z,A)
title(' win7.png')

warp(X,map)在一个简单的矩形表面上将带有颜色地图的索引图像X显示为纹理地图。

warp(I,n) 在一个简单的矩形表面上将具有n个层次的强度图像I作为纹理图显示出来。

warp(BW)将二值图像BW作为纹理图显示在一个简单的矩形表面上。

warp(RGB)将真彩色图像RGB作为纹理图显示在一个简单的矩形表面上。
warp(Z,___) 在Z面上显示图像。
warp(X,Y,Z,____)将图像显示在表面(X,Y,Z)上。

h = warp(___) 返回一个到纹理映射表面的句柄。 


图像的直方图

        可以对RGB图、灰度图和二值图进行灰度转换,其中,灰度图和二值图的直方图表示不同。imhist

[counts,binLocations] = imhist(I) 计算灰度图像 I 的直方图。imhist 函数在 counts 中返回直方图计数,在 binLocations 中返回 bin 位置。直方图中 bin 的数量由图像类型确定。

[counts,binLocations] = imhist(I,n) 指定用于计算直方图的 bin 的数量 n

[counts,binLocations] = imhist(X,map) 计算具有颜色图 map 的索引图像 X 的直方图。对于颜色图中的每个条目,直方图中都有一个对应的 bin。

imhist(___) 显示绘制的直方图。如果输入图像是索引图像,则直方图在颜色图 map 的颜色条上方显示像素值分布。

I = imread('pout.tif');
clear all
clc
I = imread('pout.tif');
subplot(2,1,1),
imshow(I),
title('pout ');
subplot(2,1,2),
imhist(I),
title('直方图');


灰度变换

        灰度变换的主要功能是改变图像的对比度imadjust

imadjust:调整图像强度值或颜色图

J = imadjust(I) 将灰度图像 I 中的强度值映射到 J 中的新值。默认情况下,imadjust 对所有像素值中最低的 1% 和最高的 1% 进行饱和处理。此运算可提高输出图像 J 的对比度。

J = imadjust(I,[low_in high_in]) 将 I 中的强度值映射到 J 中的新值,以使 low_in 和 high_in 之间的值映射到 0 到 1 之间的值。

J = imadjust(I,[low_in high_in],[low_out high_out]) 将 I 中的强度值映射到 J 中的新值,以使 low_in 和 high_in 之间的值映射到 low_out 到 high_out 之间的值。

J = imadjust(I,[low_in high_in],[low_out high_out],gamma) 将 I 中的强度值映射到 J 中的新值,其中 gamma 指定描述 I 和 J 中的值之间关系的曲线形状。

J = imadjust(RGB,[low_in high_in],___) 将真彩色图像 RGB 中的值映射到 J 中的新值。您可以为每个颜色通道应用相同的映射或互不相同的映射。

newmap = imadjust(cmap,[low_in high_in],___) 将颜色图 cmap 中的值映射到 newmap 中的新值。您可以为每个颜色通道应用相同的映射或互不相同的映射。

I = imread('pout.tif');
J = imadjust(I, [0.3,0.7], []);
subplot(2,2,1),imshow(I),title('灰度图pout');
subplot(2,2,2),imhist(I), title('调整前的直方图');
subplot(2,2,3),imshow(J),title('调整后的灰度图pout');
subplot(2,2,4),imhist(J), title('调整后的直方图');


均衡直方图

        根据图像直方图自动给出灰度变换函数,使得调整后的图像的直方图能尽可能接近预定定义的直方图,利用histeq对灰度图和索引图做直方图均衡。

J = histeq(I,hgram) 变换灰度图像 I,以使输出灰度图像 J 具有 length(hgram) 个 bin 的直方图近似匹配目标直方图 hgram

J = histeq(I,n) 变换灰度图像 I,以使输出灰度图像 J 具有 n 个 bin 的直方图大致平坦。当 n 远小于 I 中的离散灰度级数时,J 的直方图更平坦。

J = histeq(I) 变换灰度图像 I,以使输出灰度图像 J 的直方图具有 64 个 bin 且大致平坦。

newmap = histeq(X,map) 变换颜色图中的值,以使索引图像 X 的灰度分量的直方图大致平坦。变换后的颜色图是 newmap

newmap = histeq(X,map,hgram) 变换与索引图像 X 相关联的颜色图,以使索引图像 (Xnewmap) 的灰度分量直方图近似匹配目标直方图 hgramhisteq 函数返回变换后的颜色图 newmaplength(hgram) 必须与 size(map,1) 相同。

[___,T] = histeq(___) 还返回变换 T,该变换将输入灰度图像或颜色图的灰度分量映射到输出灰度图像或颜色图的灰度分量。

I= imread('pout.tif');
J = histeq(I);figure(1),
subplot(1,2,1),
imshow(I),
title('调整前');
subplot(1,2,2),
imshow(J),
title('调整后');


图像处理应用


图像增强

        图像增强技术主要包括直方图修改处理、图像平滑化处理、图像尖锐化处理和彩色处理技术等。

%利用直方图统计算法对灰度图像进行增强
clear all 
clc
I=imread('cameraman.tif');
subplot(2,2,[1,2])
imshow(I);
title('原始图像');
subplot(2,2,3)
imhist(I,64)  %绘制图像的直方图,n为灰度图像灰度级;     
title('灰度级64的直方图');
subplot(2,2,4)
imhist(I,256)  %绘制图像的直方图,n为灰度图像灰度级;     
title('灰度级256的直方图');


图像重建

        利用phantom函数产生的大脑图,对于不同投影角度,重建图像。

 phantom - Create head phantom image
    This MATLAB function generates an image of a head phantom that can be used to test the numerical accuracy of radon and iradon or other two-dimensional reconstruction algorithms.

P = phantom(def,n)  

P是一个灰度图像,由一个大椭圆(代表大脑)组成,包含几个小椭圆(代表大脑中的特征)。 def指定要生成的头部幻影的类型,n指定幻影图像中的行和列的数量。

R = radon(I) 返回二维灰度图像 I 的 Radon 变换 R,角度范围为 [0, 179] 度。Radon 变换是图像强度沿特定角度的径向线的投影。

R = radon(I,theta) 返回基于 theta 所指定角度的 Radon 变换。

[R,xp] = radon(___) 返回向量 xp,其中包含与图像的每行对应的径向坐标。

iradon - 反radon变换

I = iradon(R,theta) 从R中以投影角theta捕获的投影数据重建图像I。

I = iradon(R,theta,interp,filter,frequency_scaling,output_size) 指定用于反Radon变换的参数。可以指定后四个参数的任何组合。对于你省略的参数,iradon使用默认值。

[I,H] = iradon(___) 还返回滤波器的频率响应,H。

imagesc - 使用缩放颜色显示图像

imagesc(C) 将数组 C 中的数据显示为一个图像,该图像使用颜色图中的全部颜色。C 的每个元素指定图像的一个像素的颜色。生成的图像是一个 m×n 像素网格,其中 m 和 n 分别是 C 中的行数和列数。这些元素的行索引和列索引确定了对应像素的中心。

示例

imagesc(x,y,C) 指定图像位置。使用 x 和 y 可指定与 C(1,1) 和 C(m,n) 对应的边角的位置。要同时指定两个边角,请将 x 和 y 设置为二元素向量。要指定第一个边角并让 imagesc 确定另一个,请将 x 和 y 设为标量值。图像将根据需要进行拉伸和定向。

clear all
clc 
%用phantom函数产生Sheep-Logan的大脑图
P=phantom('Modified Shepp-Logan',200);
imshow(P)
title('原始图像')
%以下为三种不同角度的投影模式
theta1=0:10:190;
[R1,xp]=radon(P,theta1);   %存在20个角度投影
theta2=0:5:195;
[R2,xp]=radon(P,theta2);    %存在40个角度投影
theta3=0:2:178;
[R3,xp]=radon(P,theta3);    %存在90个角度投影
figure(1)
subplot(2,3,[1,2,3]);
imagesc(theta3,xp,R3);
colormap(hot);
colorbar;
%显示图像Sheep-Logan的radon变换
title('经radon变换后的图像')
xlabel('\theta');
ylabel('x\prime');     %定义坐标轴
%用三种情况的逆radon变换来重建图像
I1=iradon(R1,8);
I2=iradon(R2,8);
I3=iradon(R3,8);
subplot(2,3,4);
imshow(I1)
title('投影角度20个')
subplot(2,3,5);
imshow(I2)
title('投影角度40个')
subplot(2,3,6);
imshow(I3)
title('投影角度90个')


图像变换

        为了用正交函数或正交矩阵表示图像而对原图像进行二维线性可逆变换时,一般称原始图像为空间域图像,称变换后的图像为转换域图像,转换域图像可反变换为空间域图像。图像处理过程中用的变换都是酉变换即变换和满足正交条件的变换,更有利于特征抽取,增强,压缩和图像编码。

clear all 
clc
%%%%%%%%%%分辨率为100%%%%%%%%%
figure(1)                 %创建窗口的图形对象,句柄为1
subplot(2,2,1)
N=100;                    %分辨率
f=zeros(50,50);           %产生一个50*50的全0数组
f(15:35,23:28)=1;       
%定义图像数组,从15行到35行,23列到28列附值为1,为白色,其他区域为黑色
imshow(f)                %显示图像
title('原始图像(分辨率100)');
F=fft2(f,N,N);           %在二维傅立叶变换前把f截断或者添加0,使其成为N*N的数组
subplot(2,2,2)
imshow(F,[-1,5]);
title('二维快速傅立叶变换后的图像');
subplot(2,2,[3,4])
F2=fftshift(abs(F));     %把傅立叶变换的零频率部分移到频谱的中间
x=1:N;
y=1:N;            %定义x和y的范围
mesh(x,y,F2(x,y));%绘制立体网状图,将图形对象的色度改为灰度图像
title('傅里叶变换后零频率部分移到频谱中间');
colormap(gray);
colorbar 

图像压缩

①DCT压缩

        DCT不能直接对图像产生压缩作用,但是对图像的能量有很好的集中效果,为压缩打下了基础。

clear all
clc
I=imread('cameraman.tif');
figure(1)
subplot(1,2,1)
imshow(I);
title('原始图像')
disp('原始图像大小:')
whos('I')
I=im2double(I);
%图像类型存储转换,将图像矩阵转换成双精度类型
T=dctmtx(8);
%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
mask=[1 1 1 1 0 0 0 01 1 1 0 0 0 0 01 1 0 0 0 0 0 01 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 00 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
subplot(1,2,2)
imshow(I2);
title('压缩后的图像')
disp('压缩图像的大小:')
whos('I2')

②小波变换


图像分割

        把一个阵列划分成若干不交叠区域。遗传算法/贝叶斯算法。


图像边缘检测

        Sobel算子主要用于获得数字图像的一节梯度,常见应用是边缘检测。

edge - 查找图像强度的边缘

BW = edge(I) 返回二值图像 BW,其中的值 1 对应于灰度或二值图像 I 中函数找到边缘的位置,值 0 对应于其他位置。默认情况下,edge 使用 Sobel 边缘检测方法。

BW = edge(I,method) 使用 method 指定的边缘检测算法检测图像 I 中的边缘。

BW = edge(I,method,threshold) 返回强度高于 threshold 的所有边缘。

BW = edge(I,method,threshold,direction) 指定要检测的边缘的方向。Sobel 和 Prewitt 方法可以检测垂直方向和/或水平方向的边缘。Roberts 方法可以检测与水平方向成 45 度角和/或 135 度角的边缘。仅当 method 是 'Sobel''Prewitt' 或 'Roberts' 时,此语法才有效。

clear all 
clc 
I=imread('cameraman.tif');
figure(1)
subplot(2,3,1)
imshow(I)
title('原始图像')
BW=edge(I,'sobel');  
%以自动域值选择法对图像进行Sobel算子边缘检测
subplot(2,3,2)
imshow(BW);
title('边缘检测')
[BW,thresh]=edge(I,'sobel');  
%返回当前Sobel算子边缘检测的域值
disp('sobel算子自动选择的域值为:')
disp(thresh)
BW1=edge(I,'sobel',0.02,'horizontal');  
%以域值为0.02水平方向对图像进行Sobel算子边缘检测
subplot(2,3,3)
imshow(BW1)
title('水平方向域值0.02')
BW2=edge(I,'sobel',0.02,'vertical');
%以域值为0.02垂直方向对图像进行Sobel算子边缘检测
subplot(2,3,4)
imshow(BW2)
title('垂直方向域值0.02')
BW3=edge(I,'sobel',0.05,'horizontal');
%以域值为0.05水平方向对图像进行Sobel算子边缘检测
subplot(2,3,5)
imshow(BW3)
title('水平方向域值0.05')
BW4=edge(I,'sobel',0.05,'vertical');
%以域值为0.05垂直方向对图像进行Sobel算子边缘检测
subplot(2,3,6)
imshow(BW4)
title('垂直方向域值0.05') % sobel算子自动选择的阈值为:0.1433


图像识别

        模板匹配模型

人脸识别算法

clear all
clc 
%获取RGB图片
i=imread('face.jpg');
I=rgb2gray(i);
BW=im2bw(I);
figure(1)
imshow(BW)
%最小化背景
[n1 n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;for i=1:10y1=1;y2=c;for j=1:10if (y2<=c | y2>=9*c) | (x1==1 | x2==r*10)loc=find(BW(x1:x2, y1:y2)==0);[o p]=size(loc);pr=o*100/s;if pr<=100BW(x1:x2, y1:y2)=0;r1=x1;r2=x2;s1=y1;s2=y2;pr1=0;endimshow(BW);endy1=y1+c;y2=y2+c;endx1=x1+r;x2=x2+r;
end
figure(2)
subplot(1,2,1);
imshow(BW)
title('图像处理')
%人脸识别
L = bwlabel(BW,8);
BB  = regionprops(L, 'BoundingBox');
BB1=struct2cell(BB);
BB2=cell2mat(BB1);[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1p=BB2(1,k)*BB2(1,k+1);if p>mx & (BB2(1,k)/BB2(1,k+1))<1.8mx=p;j=k;end
end
subplot(1,2,2);
title('人脸识别')
imshow(I);
hold on;
rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j+1)],'EdgeColor','r' )


http://www.ppmy.cn/news/79096.html

相关文章

目标检测的通用实例提取

论文&#xff1a;General Instance Distillation for Object Detection 论文地址&#xff1a;https://arxiv.org/pdf/2103.02340.pdfhttps://arxiv.org/pdf/2103.02340.pdf 摘要 In recent years, knowledge distillation has been proved to be an effective solution for m…

JavaScript进阶——闭包、高阶函数与柯里化

一、闭包 闭包&#xff08;closure&#xff09;是指在函数内部创建一个新的作用域&#xff0c;使得函数内部的变量和函数可以被保留或者延长它们的生命周期而不被释放。 具体来说&#xff0c;当一个函数返回另一个函数时&#xff0c;内部函数可以访问外部函数的变量、参数以及…

本地Jrebel 许可服务器搭建

一、下载 下载 JrebelLicenseServer.zip 二、解压 解压后进入 bin 目录 三、服务安装|启动|停止|删除|... 安装服务&#xff1a;JrebelLicenseServer.bat install启动服务&#xff1a;JrebelLicenseServer.bat start停止服务&#xff1a;JrebelLicenseServer.bat stop删除服…

什么是自动化测试框架?我们该如何搭建自动化测试框架?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

Redis的五大类型

一、String数据类型 概述&#xff1a;String是redis最基本的类型&#xff0c;最大能存储512MB的数据&#xff0c;String类型是二进制安全的&#xff0c;即可以存储任何数据、比如数字、图片、序列化对象等 1. SET/GET/APPEND/STRLEN: append命令&#xff1a;append key valu…

【Java】泛型

泛型 什么是泛型引出泛型语法 泛型类的使用语法示例 泛型是如何编译的泛型的上界语法示例 泛型方法语法示例 通配符通配符解决什么问题通配符上界通配符下界总结 什么是泛型 一般的类和方法&#xff0c;只能使用具体的类型: 要么是基本类型&#xff0c;要么是自定义的类。如果…

每日练习---C语言

目录 前言&#xff1a; 1.打印菱形 1.1补充练习 2.打印水仙花 2.1补充训练 前言&#xff1a; 记录博主做题的收获&#xff0c;以及提升自己的代码能力&#xff0c;今天写的题目是&#xff1a;打印菱形、打印水仙花数。 1.打印菱形 我们先看到牛客网的题&#xff1a;OJ链…

MFC中如何利用CToolBarCtrl创建工具条

本文讲述了如何利用MFC的CToolBarCtrl 类&#xff0c;在对话框上创建工具条。 1 使用CToolBarCtrl的步骤 CToolBarCtrl 对象包含若干重要的内部数据结构&#xff1a;按钮图像位图或图像列表的列表、按钮标签字符串的列表&#xff0c;以及将图像和/或字符串与按钮的位置、样式、…