数字信号与信息处理1:图像特征定位

实验目的

  1. 实验类型:设计性实验;
  2. 掌握卷积和相关运算的基本原理与主要应用;
  3. 掌握利用MATLAB语言环境进行灰度图像的读取和显示;
  4. 掌握利用相关运算进行图像特征的定位的主要方法;

    实验主要仪器设备,软件

  5. 硬件准备:PC机

  6. 软件准备:Matlab语言环境

实验的基本原理与内容:

  1. 实验原理:数字信号处理应用中广泛的应用到相关和卷积运算。从技术上讲,相关和卷积是相同的过程。相关运算常用它来度量两个序列相似的程度,可应用到在图像特性的定位。二维卷积和相关运算的表达式如下:
  2. 实验内容:应用Matlab语言进行编程,实现在一个包含文字的图像中定位所有的字母“e”。图像matlab工具箱自带图像名为‘text.png’。

  3. 用到主要的Matlab命令:
    imreadimshowginputim2doublerot90conv2(或corr2)。

实验的步骤:

  1. 输入图像的读取与显示
    1
    2
    >>bw = imread('text.png');
    >>imshow(bw);

  1. 从图像中提取字母“e” 的模板图形
    用鼠标取点字母”e”左上角和右下角,划定范围,得出x,y坐标。
  • 鼠标取点:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >> [x,y] = ginput(2)
    x =
    51.7526
    62.7916
    y =
    10.7505
    10.7505
    23.8922

  • 求所取矩形的中点,并以该矩形的中心作为基准,将矩形转换为正方形:

    1
    2
    3
    4
    >> l = min(x(2)-x(1) , y(2)-y(1));
    >> half_l = int32(0.5*l);
    >> ave_x = int32(0.5*(x(1)+x(2)));
    >> ave_y = int32(0.5*(y(1)+y(2)));
  • 提取字母模板”e”:

    1
    2
    >> letter1 = bw(ave_y-half_l:ave_y+half_l, ave_x-half_l:ave_x+half_l);
    >> imshow(letter_1)
  • 进行输入图像类型的转换,将“e”模板与输入图像进行相关运算

    1
    >> xcorr2(im2double(bw),im2double(letter_1))
  • 设定阈值进行特征定位

    1
    2
    3
    >> le_max=max(c1(:));
    >> thresh=le_max-5; %%减5是为了降噪
    >> imshow(c1>thresh);
  • 将“e”与上一步所得特征定位图做卷积运算提取字母“e”

    1
    >>imshow(conv2(im2double(m1),im2double(letter_1)));
  • 将模板“e”图像旋转90度,同理进行相关运算并设定阈值进行特征定位,然后进行卷积得到纵向的“e”

    1
    2
    3
    >> letter_2 = rot90(letter_1,1);
    >> c2 = xcorr2(im2double(bw),im2double(letter_2));
    >> imshow(conv2(im2double(m2),im2double(letter_2)));
  • 将两次运算得到的“e”相加,得到最终结果
    1
    >> imshow((c1>thresh) + (c1>thresh));

附完整代码

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
31
32
%%清屏
clc;
clear;
%%读图
bw = imread('text.png');
imshow(bw);
[x,y] = ginput(2); %取点
%%提取字母模板
l = min(x(2)-x(1) , y(2)-y(1));
half_l = int32(0.5*l);
ave_x = int32(0.5*(x(1)+x(2)));
ave_y = int32(0.5*(y(1)+y(2)));
letter_1 = bw(ave_y-half_l:ave_y+half_l,ave_x-half_l:ave_x+half_l);
%%相关运算
c1=xcorr2(im2double(bw),im2double(letter_1));
%%设定阈值并定位
le_max=max(c1(:));
thresh=le_max-5;
m1 = (c1>thresh);
%%纵向字母定位
letter_2 = rot90(letter_1,1);
c2 = xcorr2(im2double(bw),im2double(letter_2));
m2 = (c2>thresh);
%%卷积运算,将所需字母提取出来
imshow(conv2(im2double(m1),im2double(letter_1))+conv2(im2double(m2),im2double(letter_2)));
若本文对您有帮助,请打赏鼓励本人!
---------------- End ----------------
扫二维码
扫一扫,使用手机查看

扫一扫,使用手机查看

QQ