并行图像细化算法和C代码实现
- 格式:doc
- 大小:72.50 KB
- 文档页数:9
图像处理并行算法研究与实现的开题报告一、选题背景和意义随着计算机技术和图像传感器技术的不断发展,图像处理已成为一项重要的研究领域。
图像处理技术广泛应用于医学影像、计算机视觉、数字媒体等领域。
在图像处理过程中,如何提高处理速度是一个重要的问题。
而并行计算技术可以有效地提高图像处理的速度。
目前,计算机系统中的多核技术和分布式计算技术已经得到了广泛应用。
在分布式计算领域,MapReduce等框架已经成为了分布式计算的重要工具。
因此,开发一种基于分布式计算框架的图像处理并行算法,可以提高图像处理的速度,使得图像处理技术更加实用。
二、研究内容和研究方法本文将研究基于分布式计算框架的图像处理并行算法,研究内容包括以下方面:1. 图像处理算法的设计与实现。
主要包括图像的读取、处理和输出等基本操作。
2. 并行计算模型的设计。
主要包括多机分布式计算和多核共享内存计算两种模型。
3. 数据分布和负载均衡的优化。
在分布式计算中,数据分布和负载均衡是影响并行计算效率的关键因素。
4. 性能分析和实验结果。
通过实验比较,分析两种并行计算模型的效率和并行算法的优化效果。
本文将采用如下研究方法:1. 阅读相关文献,研究现有的图像处理并行算法及其优化策略。
2. 设计并实现基于分布式计算框架的图像处理并行算法,并对算法进行优化。
3. 使用Perf、Gprof等性能分析工具对算法进行性能分析。
4. 对实验结果进行比较和分析。
三、论文结构和进度安排本文共分为五个部分,具体结构如下:1. 绪论。
介绍本文的研究背景、选题意义、研究内容和研究方法。
2. 相关技术介绍。
介绍并行计算技术、MapReduce技术、图像处理算法及其优化等相关技术。
3. 并行算法设计。
包括基于分布式计算框架的图像处理算法设计、多机分布式计算模型和多核共享内存计算模型的设计。
4. 算法优化和性能分析。
主要包括数据分布和负载均衡的优化、性能分析和实验结果。
5. 结论与展望。
基于并行计算的图像处理算法研究一、前言随着科技的发展,计算机在图像处理领域得到了广泛应用。
而并行计算则是提高计算机性能的重要手段之一。
本文将介绍基于并行计算的图像处理算法的研究。
二、并行计算与图像处理并行计算是指将一个大的计算任务分成若干个小任务,同时在多个处理器上进行计算,以达到提高计算效率的目的。
而图像处理是指对图像进行预处理、增强、分割等操作,使图像更符合要求的一种技术。
在图像处理中,常用的操作包括图像缩放、旋转、滤波等。
这些操作对于大型图像来说需要大量的计算资源和时间。
而并行计算可以将这些操作分担到多个处理器上,在保证图像处理质量的同时大幅缩短处理时间。
三、并行计算的图像处理算法1.并行图像缩放算法图像缩放是一种常见的图像处理操作。
常用的缩放算法有双线性插值算法、最近邻插值算法等。
其中,双线性插值算法是一种效果比较好的算法,但计算量比较大。
针对双线性插值算法的计算量大的问题,可以采用并行计算来优化。
具体地,可以将缩放任务分成若干个小任务,每个小任务由一个处理器计算。
这样可以极大地提高缩放效率,同时避免单个处理器计算量过大导致的性能瓶颈。
2.并行图像滤波算法图像滤波是一种常用的图像处理操作。
常用的滤波算法有均值滤波、中值滤波等。
其中,中值滤波算法是一种非常常用的滤波算法,可以有效地去除图像中的噪声。
对于大型图像,中值滤波的计算量也比较大。
此时可以采用并行计算来优化计算性能。
具体地,可以将图像分成多个小块,每个块由一个处理器计算,最后将各个块的计算结果合并即可。
3.并行图像分割算法图像分割是一种对图像进行区域划分的操作,可以将图像中的不同区域提取出来,从而更好地理解图像内容。
常用的图像分割算法有阈值分割、区域生长等。
其中,阈值分割是一种常见、易于实现的算法。
然而,对于大型图像而言,阈值分割也需要大量的计算资源。
此时可以采用并行计算的方式来进行优化。
具体地,可以将图像分成多个小块,每个小块由一个处理器计算,最后将各个小块的计算结果合并即可。
大数据量图像处理中的并行算法设计与实现随着科技的发展和应用,每天处理的图像量也在不断地增加。
大数据量的图像处理通常是需要耗费大量的时间和能量,这也导致了许多问题的出现。
为解决这些问题,人们开始采用并行算法来优化图像处理效率。
那么,大数据量图像处理中的并行算法设计与实现是怎样的呢?一、并行算法的基本思想并行算法是指在计算机中同时执行多个程序,在一个程序运行的同时,其他程序也在运行。
在大数据量的图像处理中,常常采用并行算法来提高处理效率。
并行算法的基本思想是将一个大任务拆分成多个小任务,每个小任务由一个独立的线程完成。
在这个过程中,多个线程并发进行,互不干扰,最后合并结果得到最终的输出。
二、并行算法设计流程并行算法设计的流程可以分为以下几步:1. 任务的拆分将大任务拆分成多个小任务,并确定每个小任务处理的数据量和计算量。
2. 硬件资源的分配根据任务的拆分情况,确定所需的硬件资源,如CPU核数、内存大小、硬盘容量等。
3. 线程的设计线程是并行算法的基本单元。
在设计线程时,需要考虑到线程的数量和各个线程之间的通信及同步问题。
4. 任务的调度任务调度是指将各个线程的执行顺序和时间安排好,以达到最优化的效果。
5. 结果的合并每个线程处理完任务后,需要将结果合并,得到最终的输出。
三、并行算法实现的关键技术并行算法实现的关键技术包括以下几个方面:1. 多线程编程技术多线程编程是实现并行算法的基础。
在多线程编程中,需要考虑到线程之间的同步和通信问题。
2. 并行计算技术并行计算是指将一个计算任务分配给多个处理器同时计算的技术。
并行计算可以大大缩短计算时间。
3. 基于硬件的并行技术基于硬件的并行技术是指使用多核CPU、GPU等硬件资源来实现并行计算的技术。
这种技术可以大幅提高计算效率。
4. 并行算法优化技术在并行算法的设计和实现过程中,需要考虑到算法的优化问题。
优化技术可以使算法更加高效。
四、并行算法实例下面以图像处理为例,介绍一下并行算法的实例。
Zhang-Suen图像细化算法python实现算法流程⾸先要反转原图像,因为算法之后所有的操作都将0作为前景,将1作为背景。
中⼼像素x_1(x,y)的8-近邻定义如下所⽰:考虑以下两个步骤步骤1:执⾏光栅扫描并标记满⾜以下5个条件的所有像素:这是⼀个⿊⾊像素;顺时针查看x2、x3、...、x9、x2时,从0到1的变化次数仅为1;x2、x3、...、x9中1的个数在2个以上6个以下;x2、x4、x6中⾄少有1个为1;x4、x6、x8中⾄少有1个为1;将满⾜条件的所有像素标为1步骤2:执⾏光栅扫描并标记满⾜以下5个条件的所有像素:这是⼀个⿊⾊像素;顺时针查看x2、x3、...、x9、x2时,从0到1的变化次数仅为1;x2、x3、...、x9中1的个数在2个以上6个以下;x2、x4、x8中⾄少有1个为1;x2、x6、x8中⾄少有1个为1;将满⾜条件的所有像素标为1反复执⾏步骤1和步骤2,直到没有点发⽣变化。
python实现:import cv2import numpy as npimport matplotlib.pyplot as plt# Zhang Suen thining algorythmdef Zhang_Suen_thining(img):# get shapeH, W, C = img.shape# prepare out imageout = np.zeros((H, W), dtype=np.int)out[img[..., 0] > 0] = 1# inverseout = 1 - outwhile True:s1 = []s2 = []# step 1 ( rasta scan )for y in range(1, H-1):for x in range(1, W-1):# condition 1if out[y, x] > 0:continue# condition 2f1 = 0if (out[y-1, x+1] - out[y-1, x]) == 1:f1 += 1if (out[y, x+1] - out[y-1, x+1]) == 1:f1 += 1if (out[y+1, x+1] - out[y, x+1]) == 1:f1 += 1if (out[y+1, x] - out[y+1,x+1]) == 1:f1 += 1if (out[y+1, x-1] - out[y+1, x]) == 1:f1 += 1if (out[y, x-1] - out[y+1, x-1]) == 1:f1 += 1if (out[y-1, x-1] - out[y, x-1]) == 1:f1 += 1if (out[y-1, x] - out[y-1, x-1]) == 1:f1 += 1if f1 != 1:continue# condition 3f2 = np.sum(out[y-1:y+2, x-1:x+2])if f2 < 2 or f2 > 6:continue# condition 4# x2 x4 x6if (out[y-1, x] + out[y, x+1] + out[y+1, x]) < 1 : continue# condition 5# x4 x6 x8if (out[y, x+1] + out[y+1, x] + out[y, x-1]) < 1 : continues1.append([y, x])for v in s1:out[v[0], v[1]] = 1# step 2 ( rasta scan )for y in range(1, H-1):for x in range(1, W-1):# condition 1if out[y, x] > 0:continue# condition 2f1 = 0if (out[y-1, x+1] - out[y-1, x]) == 1:f1 += 1if (out[y, x+1] - out[y-1, x+1]) == 1:f1 += 1if (out[y+1, x+1] - out[y, x+1]) == 1:f1 += 1if (out[y+1, x] - out[y+1,x+1]) == 1:f1 += 1if (out[y+1, x-1] - out[y+1, x]) == 1:f1 += 1if (out[y, x-1] - out[y+1, x-1]) == 1:f1 += 1if (out[y-1, x-1] - out[y, x-1]) == 1:f1 += 1if (out[y-1, x] - out[y-1, x-1]) == 1:f1 += 1if f1 != 1:continue# condition 3f2 = np.sum(out[y-1:y+2, x-1:x+2])if f2 < 2 or f2 > 6:continue# condition 4# x2 x4 x8if (out[y-1, x] + out[y, x+1] + out[y, x-1]) < 1 : continue# condition 5# x2 x6 x8if (out[y-1, x] + out[y+1, x] + out[y, x-1]) < 1 : continues2.append([y, x])for v in s2:out[v[0], v[1]] = 1# if not any pixel is changedif len(s1) < 1 and len(s2) < 1:breakout = 1 - outout = out.astype(np.uint8) * 255return out# Read imageimg = cv2.imread("../thin.png").astype(np.float32) # Zhang Suen thiningout = Zhang_Suen_thining(img)# Save resultcv2.imwrite("out.png", out)cv2.imshow("result", out)cv2.waitKey(0)cv2.destroyAllWindows()实验结果:。
基于C的图像处理算法设计与实现图像处理是计算机视觉领域中的重要研究方向,而C语言作为一种高效、灵活的编程语言,在图像处理算法设计与实现中也扮演着重要的角色。
本文将介绍基于C语言的图像处理算法设计与实现,包括图像读取、处理、保存等步骤,旨在帮助读者深入了解图像处理算法的实现原理和方法。
1. 图像处理算法概述图像处理算法是对数字图像进行操作和变换的数学方法和技术。
常见的图像处理算法包括滤波、边缘检测、图像分割、特征提取等。
在基于C语言的图像处理算法设计与实现中,我们将主要关注以下几个方面:图像读取:从文件中读取图像数据到内存中。
图像处理:对图像进行各种操作和变换。
图像保存:将处理后的图像数据保存到文件中。
2. 图像读取在C语言中,我们可以使用第三方库如OpenCV或者自行编写函数来实现图像读取功能。
下面是一个简单的示例代码:示例代码star:编程语言:c#include <stdio.h>#include <stdlib.h>int main() {FILE *file;unsigned char *image;int width, height;file = fopen("lena.bmp", "rb");if (!file) {printf("Error: Unable to open the imagefile.\n");return 1;}// 读取图像宽度和高度fseek(file, 18, SEEK_SET);fread(&width, sizeof(int), 1, file);fread(&height, sizeof(int), 1, file);// 分配内存并读取图像数据image = (unsigned char*)malloc(width * height * 3);fseek(file, 54, SEEK_SET);fread(image, sizeof(unsigned char), width * height * 3, file);fclose(file);// 处理图像// TODO: 图像处理算法// 释放内存free(image);return 0;}示例代码end3. 图像处理在图像处理过程中,我们可以根据需求设计各种算法来对图像进行操作。
并行MRI图像重建算法比较及软件实现黄敏;陈军波;熊琼;汪超;李宁【期刊名称】《波谱学杂志》【年(卷),期】2011(028)001【摘要】首先介绍了不加速的并行MRI图像重建方法,然后对加速的并行MRI的4种图像重建算法进行了比较,得出结论:加速因子相同时,重建质量上,GRAPPA和SENSE的重建质量最好,SMASH的重建质量次之,PILS算法对线圈位置要求极高,重建质量最差;重建速度上,SMASH的重建速度最快,其次是SENSE和PILS,GRAPPA的重建速度最慢.当加速因子变大时,所有算法重建质量都变差.最后介绍了算法实现软件,该软件可以读入原始数据,显示数据采集轨迹,计箅线圈灵敏度,选择图像重建方法,分析和比较重建图像质量.该软件为我国在MRI成像领域提供了一个学习和进一步研究图像重建算法的有力工具.【总页数】10页(P99-108)【作者】黄敏;陈军波;熊琼;汪超;李宁【作者单位】中南民族大学生物医学工程学院,湖北武汉430074;中南民族大学生物医学工程学院,湖北武汉430074;中南民族大学生物医学工程学院,湖北武汉430074;中南民族大学生物医学工程学院,湖北武汉430074;中南民族大学生物医学工程学院,湖北武汉430074【正文语种】中文【中图分类】R138.04【相关文献】1.BPF重建算法的 CUDA并行实现 [J], 伍绍佳;陈皓;廖丽;桂建保2.扇束工业CT图像重建算法的并行实现 [J], 邹永宁;王珏;卢艳平3.锥束CT FDK重建算法的GPU并行实现 [J], 韩玉;闫镔;宇超群;李磊;李建新4.稀疏磁共振图像重建算法的 GPU 并行设计与实现 [J], 李国燕;侯向丹;顾军华;宋庆增;周博君5.基于CAMP稀疏重建算法的并行实现 [J], 郭宾;张冰尘因版权原因,仅展示原文概要,查看原文内容请购买。
利用C语言实现计算机图像处理的方法利用C语言实现计算机图像处理的方法利用C语言如何实现计算机图像处理?以下是店铺为大家分享的利用C语言实现计算机图像处理的方法,一起来看看吧。
1.图像平移图像平移只是改变图像在屏幕上的位置,图像本身并不发生变化。
假设原图像区域左上角坐标为(x0, y0),右下角坐标为(x1, y1),将图像分别沿x和y轴平移dx和dy,则新图像的左上角坐标为(x0 +dx, y0 + dy),右下角坐标为(x1 + dx, y1 + dy)。
坐标平移变换公式为:x′ = x + dxy′ = y + dy在屏幕上实现图像的移动分为四个步骤:⑴ 保存原图像到缓冲区。
⑵ 擦除原图像。
⑶ 计算平移后的新坐标。
⑷ 在新的坐标位置重新显示原图像。
其中,擦除原图像的方法与图形变换中擦除原图形的方法一致,在实现中仍采用XOR异或方式画图擦除原图像。
对于新坐标值的计算还需要考虑边界情况,不要在图像平移后超出允许的屏幕范围。
此外,如果采用C函数getimage()和putimage()来保存和恢复图像,则图像的大小不能超过64K。
2.图像颠倒图像颠倒是指把定义好的图像区域上下翻转地显示在屏幕上。
分析图像颠倒的过程,可发现每行的图像信息都保持不变,而只是改变了行的顺序,将第一行与最后的第n行相互交换,第二行与第n -1行交换……,依此类推,从而实现了图像的颠倒。
只需采用按行交换的方式,即可方便地修改缓冲区内容,实现图像的颠倒。
基本步骤如下:(1) 用getimage()保存原图像,并擦除原图像。
(2) 计算图像的高度,即行数height;计算图像宽度width;计算保存一行图像信息height = bottom - top + 1;width = right - left + 1;linebytes = (width + 7) / 8 * 4;(3)利用行交换缓冲区linebuf在图像内存缓冲区中进行信息交换,即把第一行与最末行交换,第2行与第n-1行交换……,依此类推,直至全部交换完毕。
C语言的图形图像处理与图像识别引言图形图像处理和图像识别是计算机视觉领域中的两个重要分支,它们在很多实际应用中发挥着重要作用。
C语言是一种通用的编程语言,广泛应用于嵌入式系统和科学计算领域。
本文将探讨如何使用C语言进行图形图像处理和图像识别,讨论相关算法和技术,并提供一些实用的示例。
图形图像处理基础什么是图形图像处理图形图像处理是指利用计算机来处理和改变数字图像的过程。
数字图像是由像素点组成的二维矩阵,每个像素点表示图像中的一个点的颜色和亮度信息。
图形图像处理可以包括图像的增强、滤波、变换等操作,用于改善图像的质量、增强图像的特征等。
图形图像处理的应用图形图像处理在很多领域都有应用,例如医学影像处理、数字媒体、安全监控等。
在医学影像处理中,可以对医学图像进行增强和分析,用于疾病诊断和治疗。
在数字媒体中,图像处理可以用于图像编辑、合成和特效处理,用于电影、游戏等领域。
在安全监控中,图像处理可以用于人脸识别、车牌识别等任务。
使用C语言进行图形图像处理图像读写在C语言中,可以使用各种图像处理库来读取和写入图像。
常用的图像处理库包括OpenCV和SDL等。
通过这些库,可以方便地加载和保存图像数据,并进行后续的处理。
#include <stdio.h>#include <stdlib.h>#include <opencv2/opencv.h>int main(){// 读取图像IplImage* image = cvLoadImage("image.jpg");// 操作图像// 保存图像cvSaveImage("output.jpg", image);// 释放资源cvReleaseImage(&image);return0;}图像增强图像增强是改善图像质量的一种常见操作。
常用的图像增强方法包括灰度变换、直方图均衡化、滤波等。
《VC图像处理教案二:C++多线程并行处理技巧》多线程并行处理技巧在现代计算机应用中,图像处理是一个普遍且重要的应用领域。
在图像处理过程中,有很多不同的算法和技巧可以用于处理和优化图像。
其中之一是多线程并行处理技巧,可以提高图像处理算法的效率和效果。
在VC++中,多线程并行处理技巧是一种很常见的图像处理方法。
多线程并行处理技巧可以将一个图像处理算法分成多个部分,同时使用多个线程来并行处理这些部分,从加快整个图像处理过程的速度,提高效率。
本教案将介绍如何使用C++多线程并行处理技巧来加速图像处理算法。
一、多线程并行处理原理在了解C++多线程并行处理技巧之前,我们需要先了解多线程并行处理的原理。
当我们要处理一个较大的图像时,可以将该图像分割成多个小块,然后使用多个线程来分别处理这些小块。
多个线程可以并行处理,从而可以提高处理速度。
在多线程并行处理中,需要注意线程之间的同步问题。
由于多个线程同时访问同一块内存区域时可能会发生冲突,因此需要使用同步机制来保证线程之间的正常运行。
二、C++多线程并行处理技巧下面我们将介绍如何使用C++多线程并行处理技巧来加速图像处理算法。
1.定义线程函数需要定义一个线程函数,该函数用于处理图像的一个小块。
线程函数的原型如下:```void ProcessImageBlock(ImageBlock block);```该函数接受一个图像块作为参数,然后对该块进行处理。
这个函数的实现可以根据具体的图像处理算法来确定。
2.分割图像随后,需要将整个图像分割成多个小块,每个小块都可以分配到一个线程上进行处理。
图像分割的方法可以根据具体的算法来确定,例如可以按照图像的列数或行数进行分割,也可以按照图像的位置来进行分割。
3.创建线程接下来,需要创建多个线程来处理分割后的图像块。
一般来说,可以根据处理器的核心数来确定线程的数量。
例如,如果处理器有8个核心,那么可以创建8个线程来并行处理图像块。
并行图像细化算法和C代码实现图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成'骨架',形成骨架后能比较容易的分析图像,如提取图像的特征.细化分成串行细化和并行细化2中,串行细化即是一遍检测满足细化条件的点一边删除细化点,并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点.细化基本思想是'层层剥夺',即从线条边缘开始一层一层向里剥夺,直到线条剩下一个象素的为止.进行细化算法前要先对图像进行2值化,即图像中直包含'黑'和'白'2中颜色.细化算法:在微观上取检测点的8个临域(因为是并行细化,有些模板要扩展为12临域),如下xxxxoxxxx其中o为检测点x为其相邻点以下用1代表黑色点,用0代表白色点,用x代表任意颜色的点,要剥夺(删除)的点应满足一下8个模板中的一个.模板a(向右扩大)0x1x01110x1x模板b(向右扩大) 00xx0111x11x模板c(向右扩大) x11x011100xx模板d111x1x000模板e1x01101x0模板fx00110x1x模板gx1xx00模板h(向下扩大)000x1x111x1x符合以上8个模板的点为要剥夺的点,因为符合这8个模板的点可以确认为线条边沿上的点.而试事实上经过这8个模板并行细化后还有下面2种特殊的边沿点保留了下来, 特殊边沿点1000010111特殊边沿点2001011001造成这种2种特殊点的原因扩大后的模板a和扩大后的模板h,扩大的的本意是防止偶数列(行)的线条被完全消去(并行细化并然的).解决方法是在并行细化后再进行一次串行细化,选取缩小后的模板a和模板h 模板a(缩小后)0110x1模板h(缩小后)000x1x111其中缩小后的模板a解决了特殊情况1,缩小后的模板h解决了特殊情况2,注意这次是串行细化了.一下根据这个原理用C++Builder6.0实现,关键代码如下. //--------------------------------BCB6 代码#include <vcl.h>#pragma hdrstop#include<stdio.h>#include "Unit1.h"#include"File1.h"#include<math.h>#include<time.h>#include<vector>#pragma pack(1)using namespace std;/*程序:图像细化sboom(Lingch)日期:05年1月18日*///BMP文件头struct BITMAPFILEHEADER_{short type;int bfSize;short re1,re2;int Offbits;};//BMP信息头struct BITMAPINFO_{long size;long width,height;short planes,bitCount;long p,sizeImg;long xpels,ypels;long used,important;};//------将BMP彩色表的数据校正到BCB 的TColor的数据。
并行图像细化算法和C代码实现图像细化一般作为一种图像预处理技术出现,目的是提取源图像的骨架,即是将原图像中线条宽度大于1个象素的线条细化成只有一个象素宽,形成'骨架',形成骨架后能比较容易的分析图像,如提取图像的特征.细化分成串行细化和并行细化2中,串行细化即是一遍检测满足细化条件的点一边删除细化点,并行细化即是检测细化点的时候不进行点的删除只进行标记,而在检测完整幅图像后一次性去除要细化的点.细化基本思想是'层层剥夺',即从线条边缘开始一层一层向里剥夺,直到线条剩下一个象素的为止.进行细化算法前要先对图像进行2值化,即图像中直包含'黑'和'白'2中颜色.细化算法:在微观上取检测点的8个临域(由于是并行细化,有些模板要扩展为12临域),如下xxxxoxxxx其中o为检测点x为其相邻点以下用1代表黑色点,用0代表白色点,用x代表任意颜色的点,要剥夺(删除)的点应满足一下8个模板中的一个.模板a(向右扩大)0x1x01110x1x模板b(向右扩大)00xx0111x11x模板c(向右扩大)x11x011100xx模板d111x1x000模板e1x01101x0模板fx00110x1x模板gx1x110x00模板h(向下扩大)000x1x111x1x符合以上8个模板的点为要剥夺的点,因为符合这8个模板的点可以确认为线条边沿上的点.而试事实上经过这8个模板并行细化后还有下面2种特殊的边沿点保留了下来, 特殊边沿点1000010111特殊边沿点2001011001造成这种2种特殊点的原因扩大后的模板a和扩大后的模板h,扩大的的本意是防止偶数列(行)的线条被完全消去(并行细化并然的).解决方法是在并行细化后再进行一次串行细化,选取缩小后的模板a和模板h模板a(缩小后)0x10110x1模板h(缩小后)000x1x111其中缩小后的模板a解决了特殊情况1,缩小后的模板h解决了特殊情况2,注意这次是串行细化了.一下根据这个原理用C++Builder6.0实现,关键代码如下.//--------------------------------BCB6 代码#include <vcl.h>#pragma hdrstop#include<stdio.h>#include "Unit1.h"#include"File1.h"#include<math.h>#include<time.h>#include<vector>#pragma pack(1)using namespace std;/*程序:图像细化作者:sboom(Lingch)日期:05年1月18日*///BMP文件头struct BITMAPFILEHEADER_{short type;int bfSize;short re1,re2;int Offbits;};//BMP信息头struct BITMAPINFO_{long size;long width,height;short planes,bitCount;long comp,sizeImg;long xpels,ypels;long used,important;};//------将BMP彩色表的数据校正到BCB 的TColor的数据。
TColor* SwitchColor(unsigned char r,unsigned char g,unsigned char b) {TColor *re=new TColor;*re=(r | g<<8 | b<<16 );*re=*re & 0x00ffffff;return re;}void xxx(){FILE *f=fopen("f:\\1.bmp","rb");if(f==NULL) /*判断文件是否打开成功*/{ShowMessage("File open error");return;}fseek(f,0,0);//移动到开头//----------读BMP文件头BITMAPFILEHEADER_ *bmph=new BITMAPFILEHEADER_();if(fread((char*)bmph,sizeof(BITMAPFILEHEADER_),1,f)==NULL) {ShowMessage("File read error");return;}//-----------读BMP信息头BITMAPINFO_ *bmpi=new BITMAPINFO_();if(fread((char*)bmpi,sizeof(BITMAPINFO_),1,f)==NULL){ShowMessage("File read error2");return;}fseek(f,bmph->Offbits,0);//----------显示一些信息Form1->Edit1->Text=IntToStr(bmph->bfSize);Form1->Edit2->Text=IntToStr(bmpi->width);Form1->Edit3->Text=IntToStr(bmpi->height);Form1->Edit4->Text=IntToStr(bmpi->comp);Form1->Edit5->Text=IntToStr(bmpi->used);int i,j,k,l,wc,pos;long N=bmph->bfSize- bmph->Offbits;//象素总数unsigned char *image=new unsigned char[N]; //位图矩阵fread(image,N,1,f);//读入位图矩阵int skip=0; //BMP 文件4字节对齐if(bmpi->width%4==0)skip=0;elseskip=4-bmpi->width%4;unsigned char color=0;TColor *tc;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//2值化for(i=0;i<N;i++){if((unsigned char)image[i]<0xa0)image[i]=(unsigned char)0;elseimage[i]=(unsigned char)0xff;}//int flag=1;long x,b;unsigned char *om=new unsigned char[N]; //标记矩阵for(i=0;i<N;i++) //初始化om[i]=0;while(flag==1) //flag=0时迭代结束{flag=0;for( i=2;i<bmpi->height-2;i++){for(j=2;j<bmpi->width-2;j++){//模板aif(image[(i-1)*(bmpi->width+skip)+j-1]==0xff && image[(i-1)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j-1]==0xff && image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j+2]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0xff && image[(i+1)*(bmpi->width+skip)+j+1]==0) {om[(i)*(bmpi->width+skip)+j]=0xff; flag=1;continue;}//模板bif(image[(i-1)*(bmpi->width+skip)+j-0]==0&& image[(i-1)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j-1]==0xff&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j+2]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0xff && image[(i+1)*(bmpi->width+skip)+j-0]==0xff) {om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板cif(image[(i-1)*(bmpi->width+skip)+j-1]==0xff && image[(i-1)*(bmpi->width+skip)+j-0]==0xff && image[(i)*(bmpi->width+skip)+j-1]==0xff&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j+2]==0&& image[(i+1)*(bmpi->width+skip)+j-0]==0&& image[(i+1)*(bmpi->width+skip)+j+1]==0){om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板dif(image[(i-1)*(bmpi->width+skip)+j-1]==0xff && image[(i-1)*(bmpi->width+skip)+j-0]==0xff && image[(i-1)*(bmpi->width+skip)+j+1]==0xff && image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0&& image[(i+1)*(bmpi->width+skip)+j-0]==0&& image[(i+1)*(bmpi->width+skip)+j+1]==0){om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板e&& image[(i-1)*(bmpi->width+skip)+j+1]==0xff && image[(i)*(bmpi->width+skip)+j-1]==0&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0xff&& image[(i+1)*(bmpi->width+skip)+j-1]==0&& image[(i+1)*(bmpi->width+skip)+j+1]==0xff) {om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板fif(image[(i-1)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j-1]==0&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0xff&& image[(i+1)*(bmpi->width+skip)+j-0]==0xff && image[(i+1)*(bmpi->width+skip)+j+1]==0xff) {om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板gif(image[(i-1)*(bmpi->width+skip)+j-0]==0xff && image[(i-1)*(bmpi->width+skip)+j+1]==0xff && image[(i)*(bmpi->width+skip)+j-1]==0&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0xff&& image[(i+1)*(bmpi->width+skip)+j-0]==0){om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}//模板hif(image[(i-2)*(bmpi->width+skip)+j-0]==0&& image[(i-1)*(bmpi->width+skip)+j-1]==0&& image[(i-1)*(bmpi->width+skip)+j-0]==0&& image[(i-1)*(bmpi->width+skip)+j+1]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0xff && image[(i+1)*(bmpi->width+skip)+j-0]==0xff && image[(i+1)*(bmpi->width+skip)+j+1]==0xff) {om[(i)*(bmpi->width+skip)+j]=0xff;flag=1;continue;}}}for(i=0;i<N;i++){if(om[i]==0xff){image[i]=0xff;}}}//-------------第二次串行细化for( i=2;i<bmpi->height-2;i++){for(j=2;j<bmpi->width-2;j++){//缩小后的模板aif(image[(i-1)*(bmpi->width+skip)+j-1]==0xff && image[(i-1)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j-1]==0xff&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i)*(bmpi->width+skip)+j+1]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0xff && image[(i+1)*(bmpi->width+skip)+j+1]==0){image[(i)*(bmpi->width+skip)+j]=0xff; flag=1;continue;}//缩小后的模板hif(image[(i-1)*(bmpi->width+skip)+j-1]==0&& image[(i-1)*(bmpi->width+skip)+j-0]==0&& image[(i-1)*(bmpi->width+skip)+j+1]==0&& image[(i)*(bmpi->width+skip)+j-0]==0&& image[(i+1)*(bmpi->width+skip)+j-1]==0xff && image[(i+1)*(bmpi->width+skip)+j-0]==0xff && image[(i+1)*(bmpi->width+skip)+j+1]==0xff) {image[(i)*(bmpi->width+skip)+j]=0xff; flag=1;continue;}}}//---------------显示图形for( i=0;i<bmpi->height;i++){for(j=0;j<bmpi->width;j++){//-----原始图形color=image[(i)*(bmpi->width+skip)+j];tc=SwitchColor(color,color,color);Form1->Canvas->Pixels[10+j][400-i]=*tc;}}//----------关闭文件fclose(f);}//------------------------------------------------------------------------原图和细化效果图对比细化是常用的图像预处理技术,目前也有很多图像细化算法,细化后能更好的分析图像,现在很多图像的特征提取,特征分析算法是基于细化后的图像的.。