简单的图像配准(C语言实现)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
通过上述分析,可知像素块(小方块悬浮水平和垂直平移时与投影在大方块上成阴影的 小方块配准)过程,即两二维数组的比较函数。函数代码如下:
int compare_array(int m[10][10],int n[10][10]) {
int i,j,flag; for(i=0; i<10; i++) { for(j=0; j<10; j++) { if(m[i][j] != n[i][j]) { flag=1; } } } if(flag==1) { return 0; //不相等 } else { return 1; //相等 }
int compare_array(int m[10][10],int n[10][10]);
//声明比较两数组的函数,返回 1(相等),0(不相等)
int compare_block(int y,int x,int m[30][40]);
//声明按块比较函数
int a[30][40]={
{0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
};
int main ()
{
int i,j; //用于双重 for 循环来遍历二维数组
int m,n; //分别存放最后找到的小方块左上角的 x 坐标和 y 坐标值
int img_h=30,img_w=40;
//大图像的高和宽
int block_h=10,block_w=10; //小图像的高和宽
{0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
block_h
block_w
y 方 向
img_h-block_h
图 7 垂直平移示意图
上图将要寻找的小字块“3”抽象成小方块 A[i][j](即 block_w×block_h 的二维数组) 在大方块(即 img_w×img_h 的二维数组)上方悬浮水平和垂直平移,平移时即和投影在大方 块处的小方块 B[i][j]对比。如对比结果相同(即 A[i][j]的数组元素与 B[i][j]相同),即是要配 准的地位。记录下此时小方块左上角的 x 坐标和 y 坐标。 五、像素块配准子函数
{0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0}
};
//第 1 行 //第 2 行 //第 3 行 //第 4 行 //第 5 行 //第 6 行 //第 7 行 //第 8 行 //第 9 行 //第 10 行 //第 11 行 //第 12 行 //第 13 行 //第 14 行 //第 15 行 //第 16 行 //第 17 行 //第 18 行 //第 19 行 //第 20 行 //第 21 行 //第 22 行 //第 23 行 //第 24 行 //第 25 行 //第 26 行 //第 27 行 //第 28 行 //第 29 行 //第 30 行
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
一、图像基础
电子图像,也叫位图,是由像素(Pixel)组成的,像素是位图最小的信息单元,存储
在图像栅格中。 每个像素都具有特定的位置和颜色值。按从左到右、从上到下的顺序来记
录图像中每一个像素的信息,如:像素在屏幕上的位置、像素的颜色等。位图图像质量是由
单位长度内像素的多少来决定的。单位长度内像素越多,分辨率越高,图像的效果越好。位
{0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
简单的图像配准(C 语言实现)
周常欣 2017-5-14
如有以下美女图片,我们要用程序自动找到她那双迷人的眼睛:
,如何实现呢?
图 1 美女图 又有一情境,我们用无人机进行航拍,如何用程序自动实现搜寻日本国会大厦位置呢? 放心!我只是想为国家的军事科技尽一份绵薄的力量,我的无人机上没有投炸弹功能。
图 2 日本国会大厦
{0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0},
{0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0},
在这里,我们主要探索已知图像的二值化后二维数组和,如何将其目标定位出来。 三、图像配准简图
在这里以最简单的模型开始学习,配准的目标是没有旋转、扭曲、变形、遮挡的。
图 5 简单图像配准简图
四、图像简单配准过程 (一)x 方向配准
X 方向
img_w-block_w
img_h
img_w 图 6 水平平移示意图 这一配准过程可看成,三维空间里(x 轴、y 轴、z 轴描述)有一小方块在大矩形上方悬浮 平移(即小方块 z 轴值固定),小方块从左至右水平平移(x 方向移动)和从上至下垂直平移(此 处高指 y 轴方向移动)的过程,平移的步长是 1 像素。通过图 6 和图 7 可知: X 方向:小方块的左上角坐标值变化从 0 开始,至(img_w-block_w)处(含义些点)结束。 Y 方向:小方块的左上角坐标值变化从 0 开始,至(img_h-block_h)处(含义些点)结束。
for(i=0; i<=(img_h-block_h);i++) {
for(j=0; j<=(iቤተ መጻሕፍቲ ባይዱg_w-block_w);j++) {
if(compare_block(i,j,a)==1); {
m=i; n=j; } } } printf("x 坐标为%d,y 坐标为%d\n",(n+1),(m+1)); return 0; }
{0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0},
图也称为“位图图像”、“点阵图像”、“数据图像”、“数码图像”等名字。
N列
N列
像素点 像素值
M
M


图 3 图像示意图
图 4 二维数组示意图
二、数字图像转成二维数组 我们喜欢将图像的像素值存为二维数组,因为利用二维数组,我们操作数组元素比较方
便,通过数组下标就可以得到像素点的值。大学本科理工科类都要学线性代数,可以采用矩 阵成熟的理论(二维数组)和矩阵算法对数字图像进行分析和处理。将电子图像的像素点转 为二维数组,则要对电子图像格式结构非常了解,另外还要有比较好的编程功底才能够实现。 一般都是以 BMP 位图为研究起点(BMP 位图格式没有压缩,像素区就是像素值)。以后我会 写读取 BMP 像素值到二维数组及二值化(令背景及杂点是 0,识别目标点像素为 1)的文章。
{0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
} 六、完整的代码 #include <stdio.h>
int str3[10][10]={
{0,1,1,1,1,0,0,0,0,0}, {1,0,0,0,0,1,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {0,0,1,1,1,0,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0}, {1,0,0,0,0,1,0,0,0,0}, {0,1,1,1,1,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
{1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0},
{0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0},
相关文档
最新文档