清华大学自动化系
数字图像处理
第二次作业
ZHT
张海涛
2008011535
2 0 1 1 年 1 0 月 3 1 日
数字图像处理
2011 年 10 月 31 日
1. 写出描述下图中目标体(灰色)边界的 4 链码,8 链码,4 链码微分,8 链码
微分,归一化 4 链码微分,和归一化 8 链码微分。图中"+"给出链码的起始
点。
解:
4 链码:
8 链码:
4 链码微分:
8 链码微分:
归一化 4 链码微分:
归一化 8 链码微分:
32223301000301211022
544660107023144
30010113003111303201
702021771216301
00101130031113032013
017020217712163
2. 假 定 4- 链 码 从 左 下 角 开 始 , 方 向 规 定 如 下 图 所 示 。 所 得 编 码 是
11100010030003332212223222
(1) 画出链码表示的图形,求此链码所表示的感兴趣区的面积;
(2) 如何不画图而直接根据编码求面积(可以选用程序流程图、程序说明或者
数学公式来表示)。
解:
(1) 如下图所示:
S
面积=5*9-8=37(单位正方体的面积)
2
数字图像处理
2011 年 10 月 31 日
(2) 根据网上搜索资料,目前比较流行的是基于 Freeman 链码的图像中多
个区域面积的计算方法:
算法 基于 Freeman 4-链码的目标面积计算
step1 把目标面积变量 area 设为 0,把起始点的纵坐标值 y0 赋给变
量 y。
Step2 对每一个链码的元素(值 0,1,2,3)执行
3
数字图像处理
2011 年 10 月 31 日
switch (code)
{
case 0: area = area + y
break;
case 1: y = y + 1;
break;
case 2: area = area - y;
break;
case 3: y = y – 1;
break;
}
Step3 如果所有的边界链元素都被处理过了,则目标面积在被保存在
变量 area 里。
算法 基于 Freeman 8-链码的目标面积计算
Step1 初始化,A=0, i=1。
Step2 对每一个链码的元素执行
Step3 结束。
算法 基于三角形的目标面积计算
Step1 计算出所有轮廓点的坐标,即
Step2 初始化,A = 0,i = 1。
Step3 对每一个链码元素执行
Step4 结束。
3. 请将下面的图和其直方图对应起来:
4
数字图像处理
2011 年 10 月 31 日
解:
(a)对应(e);
(b)对应(g);
(c)对应(f);
(d)对应(h)。
4. 图中白色代表位于本底的象素,其余代表前景象素。本底象素和前景象素之
间的距离是无限大。求:
(a) 左上角点 p 和右下角点 q 之间的按城市街道距离和棋盘格距离计算的最
短路径长度。
(b) 前景的 8 连通区和 4 连通区的个数以及相应的背景连通区的个数。(注意,
背景区不以打格的地方为限,不是前景的地方即为背景)
解:
P 与 q 之间的棋盘格距离:14
(a)p 与 q 之间的城市街道距离:21
(b)前景的 8-连通区个数:1;相应的背景 4-连通区个数:10;
前景的 4-连通区个数:9;相应的背景 8-连通区个数:4;
5. 请解释一般情况下:
(a) 用 8 比特来表示灰度图的灰度,如果将最高位或者最低位都置 0,对该
图的直方图以及对比度是否产生影响?如果有影响,请说明。
(b) 为什么数字图像经直方图均衡化之后,直方图仍不能变成很平坦的。
解:
(a)有影响,但影响不同。将最高位置 0,直方图中 128~255 的灰度数据叠加进 0~
127 的区域内,对对比度的影响的也较大;将最低位置 0,直方图中相邻的两格合并,
但总体影响很小,对比度影响也较小。
(b)均衡化只是把峰拉伸了,不过峰值却并未改变,因此直方图不能变成平坦的。
5
数字图像处理
编程题
2011 年 10 月 31 日
目的:通过实际问题熟悉图像分割的理论和方法
内容:文字识别是图像处理中的一种典型应用,在大多数文字识别算法中,首先需要将文本
从背景中分离出来,以便进行倾斜校正和字符分割,因此分割的过程很重要。然而在实际应
用中,我们得到的经常是下图所示那样的图像,存在光照不足,阴影……
请利用图像分割的理论和方法,对该图像进行二值分割处理,实现前景文字与背景的分离。
实验平台:
操作系统:Windows7
编程平台:MATLAB20011a
任务内容:
1) 原理:
图像分割方法选取: 全局阈值分割;
阈值选取: 为简单的中值,
;
分块全局: 但由于光线照明不足,阴暗等原因,全局的阈值在原始图像较暗的区域无
法有效的分离,故采用将图片分割成许多小块,每块用全局阈值分割;
修正: 由于图像最左侧空白部分,用中值作为阈值二分化,始终存在低灰度值的情况,
所以对于这部分,在进行分块全局阈值分割时,单另处理,全部赋值为 1,即只作为背
景.
2) 代码及其说明:
6
MaxMinLevel2
数字图像处理
2011 年 10 月 31 日
主程序模块:
Image_original=imread('HW2.jpg'); %读取图像文件
figure,imshow(Image_original);
title('ÔʼͼÏñ'); %输出原始图像
Image_gray=rgb2gray(Image_original); %转化为灰度图
Image_result=Image_division(Image_gray,97,97); %分块阈值分割处理
figure,imshow(Image_result);
title('´¦Àíºó¶þÖµ»¯Í¼Ïñ'); %输出二进制处理图像
图像分块函数 Image_division():
function Image_result =
Image_division(Image_gray,row_space_argument,col_space_argument)
row=size(Image_gray,1); %原始矩阵行数
col=size(Image_gray,2); %原始矩阵列数
row_space=row_space_argument; %行间隔
col_space=col_space_argument; %列间隔
row_num=round(row/row_space); %行分割块数
col_num=round(col/col_space); %列分割块数
%区域分割
t1=(0:row_num-1)*row_space+1; %块行起始坐标
t2=(1:row_num)*row_space; %块行终止坐标
t3=(0:col_num-1)*col_space+1; %块列起始坐标
t4=(1:col_num)*col_space; %块列终止坐标
for i=1:row_num
for j=1:col_num
t1(i)=isboundary(t1(i),row);
t2(i)=isboundary(t2(i),row);
t3(i)=isboundary(t3(i),col);
t4(i)=isboundary(t4(i),col);
x=t1(i):t2(i);
y=t3(j):t4(j);
if(y>80) %对于边界的处理,全为1
temp = Image_gray(x,y);
Image_result(x,y)=Image_handle(temp);
else
Image_result(x,y)=1;
end
end
end
end
7
数字图像处理
2011 年 10 月 31 日
阈值生成及二分化函数 Image_handle():
function Image_2bw = Image_handle( Image_gray )
Image_max=double(max(max(Image_gray))); %最大值并输出双精度值
Image_min=double(min(min(Image_gray))); %最小值并输出双精度值
level=((Image_max+Image_min)/2)/255; %获得最佳阈值
Image_2bw_temp=im2bw(Image_gray,level); %转化为二进制图像
Image_2bw=double(Image_2bw_temp);
end
图像分块越界函数 isboundary ():
function temp = isboundary(temp,stdard)
if (temp >= stdard)
temp = stdard;
end
end
3) 效果展示:
8