Java课程设计--连通问题.docx

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 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)

ze122230743 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档