- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
PAGE\*ROMANI
连通问题PAGE6
[键入文字]
目录
TOC\o1-3\h\z\u第1章课题概述 1
1.1课题的目的 1
1.2课题的要求 1
1.2.1输入输出的要求 1
1.2.2程序实现的功能要求 1
第2章概要设计 2
2.1整个程序的模块结构及流程 2
2.2bmp图片信息分析 2
2.3连通的判断 3
第3章程序功能的实现 5
3.1读取图片信息 5
3.2判断连通 7
第4章调试及发现问题的解决 11
第5章程序测试及分析 12
第6章总结 14
参考文献 15
连通问题PAGE14
PAGE14
第1章课题概述
本次数据结构课程设计的题目是设计并实现位深度为1的bmp图片的联通问题。
1.1课题的目的
位深度为1的bmp图片是只有黑白两种颜色的图片,信息比较容易读取。连通:两个点距离如果小于2个像素,则认为这两个点连通。也就是说以一个点为中心的九宫格中,围绕它的8个点与它都是连通的。
这个课题的目的是分析给出的黑白bmp图片中所有独立连通的群体,输出每个连通群体的面积。所谓面积,就是它含有的像素的个数。
1.2课题的要求
1.2.1输入输出的要求
(1)程序运行后应首先弹出一个窗口,窗口提供一个输入图片名称的输入框和确定按钮。
(2)输入名称,点击确定后,弹出新的窗口,并在窗口中输出各个连通区域的面积,每一行输出一个。
1.2.2程序实现的功能要求
(1)bmp图片的信息储存在图片中,需要用流来读取图片的信息,并加以处理,使程序可以适用于任何像素的bmp图片。
(2)输入格式有错误要给出合适的提示。
第2章概要设计
2.1整个程序的模块
根据课题要求,整个程序可大致分为三个模块,读取图片信息,处理图片信息,计算连通。此外,还具有窗口,及简短的说明提示等。程序各功能模块的划分,及主要流程如图2-1所示。
图2-1整个程序模块
2.2bmp图片信息分析
偏移:10字节,长度4字节:图像数据真正开始的位置。
偏移:18字节,长度4字节:位图的宽度,单位是像素。
偏移:22字节,长度4字节:位图的高度,单位是像素。
Windows规定图像文件中一个扫描行所占的字节数必须是4字节的倍数,
不足的位均以0填充。
因此在编写程序时要注意两点:
(1)从图片中读取的数据为4个字节,且将其倒置后,才是图片的真正数据。
(2)读取的图片像素的宽若不是4字节的倍数,补0后会产生多余的数据,需要经过处理来跳过它们。
2.3连通的判断
bmp图片中像素黑色为0,白色为1。遍历数组,遇到某连通区域的第一个黑色的点时,改变其值为2,接着判断后面的像素周围是否存在黑色的像素,若存在,改变其值为除0,1之外最小的数,否则,将该像素的值改为3,依次递增1。当周围有两种或以上不同连通区域的像素时,例如2,3。将其值改为2后,要将二维数组中所有的3改为2。当遍历一次后,数出二维数组中除了0,1之外相同数字的个数,即连通区域的面积。
例如题目中的t1.bmp:
这张图的连通区域有9个,8个面积为1和一个面积为11。下面三张图片说明了改变像素值,并输出不同数字个数的过程。为了方便观察,用A来代替10,B来代替11,依次类推。
图2.3.1改变某连通区域第一个像素值
图2.3.2像素周围有大于1的数的情况
后面的像素与前面几个像素修改方法相同。
图2.3.3修改完成后的像素图
第3章程序功能的实现
3.1读取图片信息
用DataInputStream来读取图片中的信息,读取4个字节后,用handleByte()方法来处理数组,得到图片的信息。用多重for循环将读取到的像素信息处理并存入二维数组中。代码如下:
privateinthandleByte(byte[]b){
StringBuffersb=newStringBuffer();
for(inti=b.length-1;i=0;i--){
StringBuffertemp=newStringBuffer(Integer.toBinaryString(b[i]));
Stringfin=
if(b[i]!=0){
if(temp.length()8){
fin=temp.substring(temp.length()-8);
}
while(temp.length()8){
temp.insert(0,0);
fin=temp.
文档评论(0)