Matlab图像匹配问题
2024-08-25 21:44:05
已知一个任意形状,查找在大图像中最接近的形状位置。
输入:一个小图形状和一张大图
输出:最接近的形状在大图中的位置
假设:
(1)已知形状与目标形状有一定的形变。
(2)形状与大图像均为二值图像,图中有多个形状。
要求:
建立数学模型,并编写程序实现;
查找精度高,抗噪能力强(大图像可能含有噪声),速度快。
例如,小图形状如下:
大图形状如下:
首先介绍一下Matlab中如果对于一些函数的功能使用不是很熟悉的时候,可以直接使用help function查看该函数或者语句的具体使用方法,英文描述,虽然会有个别单词不认识,但总体写的十分的详细并且有example,能够让你读懂如何使用该函数或语句;比如使用Matlab解这道数学建模题目时,要用到imread(),fullfile(),imageSet(),等等函数语句时,可以使用help xxx进行具体查看其各个参数代表什么意思;
解题思路:
问题分析:
该问题是需要我们队两张二值图进行图像匹配,寻找大图中的对应小图中的目标图案;因此需要寻找一个key值,使得其能够唯一的标识每一个图案;
图案的大小以及方向都可能发生了形变,根据像素位置显然是不能解决的;
模型构成:
先将大图的图案总数量提取出来,然后对每个图案求得其key值,这里我设置的key值是图案边界key=(周长/面积);将每个图案的key值和小图的key值进行差值运算,差值最小的编号图案即是我们所要寻找的图案;
模型求解(使用Matlab中各种函数求解):
代码:
big=imread('pic_Big.png');
sma=imread('pic_Sma.png');
se=strel('disk',2);
level_Big=graythresh(big);
level_Sma=graythresh(sma);
bw_Big=im2bw(big,level_Big);
bw_Sma=im2bw(sma,level_Sma);
openbw_Big=imopen(bw_Big,se);
>> openbw_Sma=imopen(bw_Sma,se);
>> %首先big代表大图,即含有多个图案的图像,sma代表小图,即所要寻找的目标图案;
>> %bw_Big和bw_Sma分别是将两张图转换成二值图;
>> %graythresh是寻找阈值的函数,具体使用可以通过help graythresh以及百度深入了解;
>> %openbe_Big和openbw_Sma分别是对两张二值图做开运算(属于形态学图像处理),用途:使边界平滑,消除细小的尖刺,断开狭小的连接,保持面积不变;
>> [L,num]=bwlabel(openbw_Big,8);
>> %将openbw_Big的联通区域块数计算出来,即num表示有几个联通区域(白色块);
>> stats_Big=regionprops(openbw_Big,'Area','Perimeter','BoundingBox');
>> stats_Sma=regionprops(openbw_Sma,'Area','Perimeter','BoundingBox');
>> Sma_key=double(stats_Sma(2).Perimeter/stats_Sma(2).Area);
>> %使用regionprops(图像,'属性')将各个联通块的属性存储下来;
>> %计算出sma图案的Sma_key即图案的(周长/面积)值;
Big_key=zeros(1,num);
%定义一个一维数组存储big的多个key值;
>> for i=1:num
Big_key(1,i)=stats_Big(i).Perimeter/stats_Big(i).Area;
end
%求出big图像中各个图案的(周长/面积)值存放在Big_key数组;
>> min=10;
des=10;
for i=2:num
if min>abs(Big_key(1,i)-Sma_key)
min=abs(Big_key(1,i)-Sma_key);
sprintf('%d\n',i);
des=i;
end
end
>> %设置最小值min(后续判断各个图案的key值和目标key值差值最小存放变量);
>> %设置变量des存放最终key值和目标key值差值最小的联通块的编号;后续求得des=2;
boundingbox=stats_Big(des).BoundingBox;
>> %将寻找到的目标联通块编号即des=2的联通块的BoundingBox(边界框)找出;
>> figure(1),imshow(openbw_Big);
rectangle('position',boundingbox,'EdgeColor','r');
>> %使用rectangle函数将该联通块用某红颜色的矩形框框出来;
>> rectangle('position',boundingbox,'EdgeColor','b');
%使用蓝色矩形框将联通块框出来;
具体其中的各个函数及其中参数意义可以自行百度深入了解,或者有什么问题欢迎留言讨论;
最新文章
- 12个学习 CSS3 网站布局设计的优秀案例
- 生成bat文件及sh文件
- storyboard pushViewController 的时候,新的界面黑屏
- Java 常用字符串操作总结
- sql 主外键
- 转载cocos2dx的各种动作用法
- [转] 从 dll 程序集中动态加载窗体
- C# struct
- HDU 2647
- Android Spinner列表选择框
- grub 的安装与使用
- 用SpeedFan来控制CPU风扇转速
- MySQL常用的查询命令
- 随心测试_软测基础_003<; 理解测试 >;
- 码云Gitee上新建项目教程
- celipse关联hadoop源码
- angular.js 教程 -- 实例讲解
- 数据库与hadoop与分布式文件系统的区别和联系
- Rspec: everyday-rspec实操: 第8章DRY. (6个方法,其中3个方法好上手)
- oracle的with as用法
热门文章
- ruby的循环控制命令loop等
- vue打包完样式冲突
- tkinter的GUI设计:界面与逻辑分离(一)-- 初次见面
- BZOJ2439【中山市选2011】序列
- Python Machine Learning: Scikit-Learn Tutorial
- C#简单的四位纯数字验证码
- 英文样式教师求职简历免费word模板
- 执行shell脚本时提示bad interpreter:No such file or directory的解决办法
- [硬件配置]Ubuntu 16.04下使用NETGEAR Nighthawk AC1900 (A7000) WIFi USB适配器
- CsvReader和CsvWriter操作csv文件