Chinaunix首页 | 论坛 | 博客
  • 博客访问: 13028
  • 博文数量: 6
  • 博客积分: 200
  • 博客等级: 二等列兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-17 11:23
文章分类

全部博文(6)

文章存档

2011年(1)

2009年(5)

我的朋友
最近访客

分类:

2009-03-19 14:59:46

图像处理的一些基本的东西

代码 Matlab(转)

1、图像的读取
MATLAB中从图像文件中读取数据用函数imread(),这个函数的作用就是将图像文件的数据读入矩阵中,此外还可以用imfinfo()函数查看图像文件的信息(见例1)
%例1:图像数据及图像信息的读取
imfinfo c:\lilizong\boat.bmp
%读取图像信息
[A,M]=imread('c:\lilizong\boat.bmp');
%图像数据的读取,将图像数据放入矩阵A中,颜色数据放入矩阵M中
imshow(A,M);title('原图像');
M(:,1)=0;  %将颜色数据矩阵的一列置零
figure
imshow(A,M);title('改变颜色后的图像')

MATLAB还提供了将数据写入一个文件的函数imwrite以及不同类型文件相互转换的函数,可以参考MATLAB 的帮助文件。

2、灰度直方图及直方图均衡化

灰度直方图用于显示图像的灰度值分布情况,是数字图像处理中最简单和最实用的工具。MATLAB中提供了专门绘制直方图的函数imhist()。用它可以很简单的绘制出一幅图像的灰度直方图(见例2)。

%例2:直方图的显示
imshow('c:\lilizong\boat.bmp');title('原图像')
%显示原图像
A=imread('e:\matlabwork\tuxiang\Girl.bmp','bmp');
figure;imhist(A),title('对应直方图')

在图像处理中,点运算是简单而又重要的一种技术,其中最常用的一种应用就是直方图的均衡化(见例3)。

%例3:直方图均衡化

imshow('c:\lilizong\boat1.bmp');title('原图像')
I=imread('c:\lilizong\boat1.bmp');
figure;imhist(I),title('对应直方图')
%从得到的直方图可以看出,图像的对比度很低,灰度级集中在70-160范围内,如果只取
%这个范围内的灰度,并扩展到[0,255],则会明显增强图像对比度
J=imadjust(I,[70/255 160/255],[]);
figure;imshow(J),title('经灰度级调整后的图')
figure;imhist(J),title('灰度级调整后的直方图')
%MATLAB还提供了histeq函数(自动直方图均衡化)
K=histeq(I);
figure;imshow(K),title('经直方图均衡化后的图')
figure;imhist(K),title('直方图均衡化后的直方图')

3、图像的代数运算

代数运算是指对两幅输入图像进行点对点的加、减、乘和除计算而得到输出图像的运算。对于相加和相乘的情形,可能不止有两幅图像参加运算。图像相加的一个重要应用是对同一场景的多幅图像求平均值。这点被经常用来有效地降低加性(additive)随机噪声的影响(见例4)

%例4:图象加噪声再通过多次相加求平均的方法祛除噪声
[I,M]=imread('c:\boat.png');
J=imnoise(I,'salt & pepper',0.005);
subplot(1,2,1),imshow(I,M),title('原图象');
subplot(1,2,2),imshow(J,M),title('加噪声后图象');
K=zeros(256);
for i=1:100
   
     J=imnoise(I,'salt & pepper',0.005);
   
     J1=im2double(J);

%     K=K+J1;
K=K+J1;

end

K=K/100;
figure,imshow(K),title('相加求平均后的图象');

4、图像滤波处理

在数字图像处理中,常常会遇到图像中混杂有许多的噪声。因此,在进行图像处理中,有时要先进行祛除噪声的工作。最常用的祛除噪声的方法是用滤波器进行滤波处理。MATLAB的图像处理工具箱里也设计了许多的滤波器。如均值滤波器、中值滤波器、维纳滤波器等。用户可以很方便的运用一些函数完成数字滤波工作。(见例5)。

%例5:用滤波器祛除图象噪声(分别用均值滤波,中值滤波,及维纳滤波器祛除加入高斯噪声的图象)

I=imread('C:\boat.png');
J=imnoise(I,'gaussian',0,0.002); %加入高斯噪声
%进行均值滤波
h=fspecial('average',3);    %fspecial函数用于产生预定义滤波器
I2=uint8(round(filter2(h,I)));   %filter2函数用于图像滤波,此处h是滤波参数(均值),I是要处理的图像
%进行中值滤波
I3=medfilt2(J,[3,3]);   %medfilt2函数用于图像的中值滤波
%进行维纳滤波
I4=wiener2(J,[3,3]);%进行一次维纳滤波
I5=wiener2(I4,[3,3]);%进行二次维纳滤波
subplot(2,3,1),imshow(I),title('原图象')
subplot(2,3,2),imshow(J),title('加噪声图象')
subplot(2,3,3),imshow(I2),title('均值滤波后图象')
subplot(2,3,4),imshow(I3),title('中值滤波后图象')
subplot(2,3,5),imshow(I4),title('维纳滤波后图象')
subplot(2,3,6),imshow(I5),title('两次维纳滤波后图象')

5、傅立叶变换

傅立叶变换是线性系统分析的一个有力的工具。它在图像处理,特别是在图像增强、复原和压缩中,扮演着非常重要的作用。实际中一般采用一种叫做快速傅立叶变换(FFT)的方法,MATLAB中的fft2指令用于得到二维FFT的结果,ifft2指令用于得到二维FFT逆变换的结果。(见例6)

%例6:近似冲击函数的二维快速傅立叶变换(FFT)
x=1:99;y=1:99;
[X,Y]=meshgrid(x,y);
A=zeros(99,99);
A(49:51,49:51)=1;
B=fft2(A);
subplot(1,2,1),imshow(A),xlabel('空域图象');
subplot(1,2,2),imshow(B),xlabel('时域图象');
figure
subplot(1,2,1),mesh(X,Y,A),xlabel('空域'),grid on;
subplot(1,2,2),mesh(X,Y,abs(B)),xlabel('时域'),grid on;

6、图像压缩

在图像的变换和压缩中,常常用到离散余弦变换(DCT)。DCT具有能使图像的最重要的信息集中在DCT的几个系数上的性能。正是基于此,DCT通常应用于图像的压缩。(见例7)

JPEG图像压缩算法:
输入图像被分成8*8或16*16的小块,然后对每一小块进行二维DCT(离散余弦变换)变换,变换后的系数量化、编码并传输;
JPEG文件解码量化了的DCT系数,对每一块计算二维逆DCT变换,最后把结果块拼接成一个完整的图像。在DCT变换后舍弃那些不严重影响图像重构的接近0的系数。
DCT变换的特点是变换后图像大部分能量集中在左上角,因为左上放映原图像低频部分数据,右下反映原图像高频部分数据。而图像的能量通常集中在低频部分。

%例7:DCT变换用于图象的压缩实例

I=imread('d:\lilizong\test.jpg');
%该图片在安装matlab的目录中找,原图为灰度图象
I=im2double(I);%图像存储类型转换
T=dctmtx(8);%离散余弦变换矩阵
B=blkproc(I,[8 8],'P1*x*P2',T,T');
%对原图像进行DCT变换
mask=[1 1 1 1 0 0 0 0
       1 1 1 0 0 0 0 0
       1 1 0 0 0 0 0 0
       1 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0
       0 0 0 0 0 0 0 0];
B2=blkproc(B,[8 8],'P1.*x',mask);
%数据压缩,丢弃右下角高频数据
I2=blkproc(B2,[8 8],'P1*x*P2',T',T);
%进行DCT反变换,得到压缩后的图像
imshow(I)
title('原始图像')
figure;
imshow(I2)
title('压缩后的图像')


应用到的函数:
I=imread('图像文件名') :读取图像数据,保存在矩阵I中;
imshow(I) :显示灰度图像I,其他用法见matlab帮助;
I2=im2double(I1) :把图像数组I1转换成double精度类型;
D=dctmtx(n) :二维离散余弦变换函数,返回n*n离散余弦变换矩阵。

一个n*n的变换矩阵T被定义成:
Tpq=1/sqrt(n)                                   
,当p=0,0<=q<=M-1;
Tpq=sqrt(2/n)*cos[pi*(2q+1)*p/2n]    
,当1<=p<=M-1,0<=q<=M-1。

B=blkproc(A,[m n],fun,P1,P2...) :块操作函数。对图像A的每个不同的m*n块应用fun函数,P1,P2等为fun函数参数。在图像边缘用0来扩展;只有当fun的返回矩阵是m*n矩阵时,B和A的大小才相同。
figure:强制生成一个新的个绘图窗口;
可以看出,尽管由于85%的DCT系数被抛弃而使恢复后的图像质量有所降低,图像内容仍能清晰可辨,达到了图像压缩的目的。

一 读写图像文件

     1 imread

     imread函数用于读入各种图像文件,如:a=imread('e:\w01.tif')

     注:计算机E盘上要有w01相应的.tif文件。

     2 imwrite

     imwrite函数用于写入图像文件,如:imwrite(a,'e:\w02.tif',’tif’)

     3 imfinfo

     imfinfo函数用于读取图像文件的有关信息,如:imfinfo('e:\w01.tif')

     二 图像的显示

     1 image

     image函数是MATLAB提供的最原始的图像显示函数,如:

     a=[1,2,3,4;4,5,6,7;8,9,10,11,12];

     image(a);

     2 imshow

     imshow函数用于图像文件的显示,如:

     i=imread('e:\w01.tif');

     imshow(i);

     3 colorbar

     colorbar函数用显示图像的颜色条,如:

     i=imread('e:\w01.tif');

     imshow(i);

     colorbar;

     4 figure

     figure函数用于设定图像显示窗口,如:figure(1); /figure(2);

     三 图像的变换

     1 fft2

     fft2函数用于数字图像的二维傅立叶变换,如:

     i=imread('e:\w01.tif');

     j=fft2(i);

     2 ifft2

     ifft2函数用于数字图像的二维傅立叶反变换,如:

     i=imread('e:\w01.tif');

     j=fft2(i);

     k=ifft2(j);

     3 利用fft2计算二维卷积

     利用fft2函数可以计算二维卷积,如:

     a=[8,1,6;3,5,7;4,9,2];

     b=[1,1,1;1,1,1;1,1,1];

     a(8,8)=0;

     b(8,8)=0;

     c=ifft2(fft2(a).*fft2(b));

     c=c(1:5,1:5);

     利用conv2(二维卷积函数)校验, 如:

     a=[8,1,6;3,5,7;4,9,2];

     b=[1,1,1;1,1,1;1,1,1];

     c=conv2(a,b);

     四 模拟噪声生成函数和预定义滤波器

     1 imnoise

     imnoise函数用于对图像生成模拟噪声,如:

     i=imread('e:\w01.tif');

     j=imnoise(i,'gaussian',0,0.02);%模拟高斯噪声

     2 fspecial

     fspecial函数用于产生预定义滤波器,如:

     h=fspecial('sobel');%sobel水平边缘增强滤波器

     h=fspecial('gaussian');%高斯低通滤波器

     h=fspecial('laplacian');%拉普拉斯滤波器

     h=fspecial('log');%高斯拉普拉斯(LoG)滤波器

     h=fspecial('average');%均值滤波器

     五 图像的增强

     1 直方图

     imhist函数用于数字图像的直方图显示,如:

     i=imread('e:\w01.tif');

     imhist(i);

     2 直方图均化

     histeq函数用于数字图像的直方图均化,如:

     i=imread('e:\w01.tif');

     j=histeq(i);

     3 对比度调整

     imadjust函数用于数字图像的对比度调整,如:

     i=imread('e:\w01.tif');

     j=imadjust(i,[0.3,0.7],[]);

     4 对数变换

     log函数用于数字图像的对数变换,如:

     i=imread('e:\w01.tif');

     j=double(i);

     k=log(j);

     5 基于卷积的图像滤波函数

     filter2函数用于图像滤波,如:

     i=imread('e:\w01.tif');

     h=[1,2,1;0,0,0;-1,-2,-1];

     j=filter2(h,i);

     6 线性滤波

     利用二维卷积conv2滤波, 如:

     i=imread('e:\w01.tif');

     h=[1,1,1;1,1,1;1,1,1];

     h=h/9;

     j=conv2(i,h);

     7 中值滤波

     medfilt2函数用于图像的中值滤波,如:

     i=imread('e:\w01.tif');

     j=medfilt2(i);

     8 锐化

     (1)利用Sobel算子锐化图像, 如:

     i=imread('e:\w01.tif');

     h=[1,2,1;0,0,0;-1,-2,-1];%Sobel算子

     j=filter2(h,i);

     (2)利用拉氏算子锐化图像, 如:

     i=imread('e:\w01.tif');

     j=double(i);

     h=[0,1,0;1,-4,0;0,1,0];%拉氏算子

     k=conv2(j,h,'same');

     m=j-k;

     六 举例

     二维傅立叶变换和二维傅立叶反变换:

     i=imread('e:\w01.tif');

     figure(1);

     imshow(i);

     colorbar;

     j=fft2(i);

     k=fftshift(j);

     figure(2);

     l=log(abs(k));

     imshow(l,[]);

     colorbar

     n=ifft2(j)/255;

     figure(3);

     imshow(n);

     colorbar;

BMP图像文件格式

BMP图像文件格式是微软公司为其Windows环境设置的标准图像格式,而且 Windows系统软件中还同时内含了一系列支持BMP图像处理的API函数,随着Windows 在世界范围内的不断普及,BMP文件格式无疑也已经成为PC机上的流行图像文件格 式。它的主要特点可以概括为:文件结构与PCX文件格式类似,每个文件只能存放一幅图像;图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理成为图 像文件的一个选项,用户可以根据需要进行选择。其中,非压缩格式是BMP图像文件所 采用的一种通用格式。但是,如果用户确定将BMP文件格式压缩处理,则Windows设计 了两种压缩方式:如果图像为16色模式,则采用RLE4压缩方式,若图像为256色模式, 则采用RLE8压缩方式。同时,BMP图像文件格式可以存储单色、16色、256色以及真彩 色四种图像数据,,其数据的排列顺序与一般文件不同,它以图像的左下角为起点存储图 像,而不是以图像的左上角为起点;而且BMP图像文件格式中还存在另外一个与众不同 的特点,即其调色板数据所采用的数据结构中,红、绿、蓝三种基色数据的排列顺序也 恰好与其它图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境 的新特色,而且随着Windows版本的不断更新,微软公司也在不断改进其BMP图像文件 格式,例如:当前BMP图像文件版本中允许采用32位颜色表,而且针对32位Windows 的产生,相应的API函数也在不断地报陈出新,这些无疑都同时促成了BMP文件格式的 不断风靡。但由于BMP文件格式只适合于Windows上的应用软件,而对于DOS环境中的 各种应用软件则无法提供相应的支持手段,因此这无疑是阻碍BMP文件格式的流通程度超过PCX文件格式的一个重要因素。

 

Windows中定义了两种位图文件类型,即一般位图文件格式与设备无关位图文件格 式。其中,由于设备无关位图(DIB)文件格式具有更强的灵活性与完整的图像数据、 压缩方式等定义。BMP图像文件的结构可以分为如下三个部分:文件头、调色板数据以 及图像数据。其中文件头的长度为固定值54个字节;调色板数据对所有不超过256色的 图像模式都需要进行设置,即使是单色图像模式也不例外,但是对于真彩色图像模式, 其对应的BMP文件结构中却不存在相应调色板数据的设置信息;图像数据既可以采用一 定的压缩算法进行处理,也可以不必对图像数据进行压缩处理,这不仅与图像文件的大小相关,而且也与对应的图像处理软件是否支持经过压缩处理的BMP图像文件相关。以下将分别介绍BMP图像文件结构中的这三个重要组成部分。特别值得注意的是:BMP 图像文件结构设计得相当简单,这无疑有利于图像文件的处理速度,但是同时也使得 BMP图像文件格式具有一定的局限性,即一个BMP图像文件只能存储一幅图像。

BMP图像文件的文件头定义

Windows中将BMP图像文件的文件头分成两个数据结构,其中一个数据结构中包含 BMP文件的类型、大小和打印格式等信息,称为BITMAPFILEHEADERl另外一个数据 结构中则包含BMP文件的尺寸定义等信息,称为BITMAPINFOHEADERl如果图像文 件还需要调色板数据,则将其存放在文件头信息之后。 BITMAPFIlEHEADER数据结构在Windows.h中的定义为:

typedef struCttagBITMAPFIlEHEADER

{

WORD bftype;

DWORD bfsiZe:

WORD bfReservedl;

WORD bgReserved2:

DWORD bfoffBits:

}BITMAPFILEHEADER;

其中,bfrype在图像文件存储空间中的数据地址为0,数据类型为unsignedchar,内 容为固定值"BM",用于标志文件格式,表示该图像文件为BMP文件。

bfsize的数据地址为2,类型为unsignedlong,它以字节为单位,定义位图文件的大 小。

bfReservedl与bfReserved2的数据地址分别为6和8,数据类型则都为unsignedint,二 者都是BMP文件的保留字,没有任何意义,其值必须为0.

bfoffBits的数据地址为10,数据类型为unsignedlong,它以字节为单位,指示图像 数据在文件内的起始地址,即图像数据针对文件头的偏移量。

BITMAPINFOHEADER数据结构用于说明位图的大小,其定义为:

type struttagBITMAPINFOHEADER

{

DWORD biSize:

DWORD biWldth;

DWORD biHeight;

WORD biPlanes:

WORD biBitCount:

DWORD biCOmpression;

DWORD biSiZelmage;

DWORD biXPelsPerMeter:

DWORD biYPelsPerMeter:

DWORD biClrUsed;

DWORD biClrlmportant;

}BITMAPINFOHEADER;

其中,biSize的数据地址为14,数据类型为unsignedlong,它以字节为单位指定数据 结构BITMAPINFOHEADER所占用的存储容量,固定值为40。

biWidth与biHeight的数据地址分别为18和22,数据类型都是unsignedlong,它们分 别以像素为单位,给出该BMP文件所描述位图的宽度与高度。若biHeight的取值为正数, 则表明位图为bottom—up类型的DIB位图,而且位图原点为左下角。若biHeight的取值为 负数,则表明位图为top—down类型的DIB位图,而且位图原点为左上角。

注意:一般位图定义中,这两个字段的取值必须为正数。

biPlanes的数据地址为26,类型为unsignedint,它代表目标设备的平面数必须为1。

biBitCount的数据地址为28,类型为utlsigned Int,它确定每个像素所需要的位数。 当图像为单色时,该字段的取值为1;当图像为16色时,该字段的取值为4;当图像为256 色时,该字段的取值为8;当图像为真彩色时,该字段的取值为24。

biCompression的数据地址为30,类型为unsignedlong,它代表bottom—up类型位图的 压缩类型(注意:t叩—down类型位图不能进行压缩处理),其可能取值及其含义分别为: 若该字段的取值为BI—RGB,则表示文件内的图像数据没有经过压缩处理;若该字段的 取值为BI—RLE8,则表示所压缩的图像数据是256色,采用的压缩方法是RLE8;若该字 段的取值为BI—RLE4,则表示所压缩的图像数据是16色,采用的压缩方法是RLE4;若 该字段的取值为BI—BITFIELDS,则表明图像文件内的数据没有经过压缩处理,而且颜 色表由分别表示每个像素点的红、绿、蓝三原色的双字组成。

注意:BMP文件格式在处理单色或者真彩色图像时,不论图像数据多么庞大,都不 对图像数据进行任何压缩处理。

biSizelmage的数据地址为34,类型为unsignedlong7它以字节为单位,给出该BMP 内图像数据占用的空间大小。若图像文件描述BI—RGB位图,则该字段的值必须设置为0。

biXPelsPerMeter字段与biYPelsPerMeter字段的数据地址分别为38与42,类型都是 unsignedlong,它们分别以每米像素数为单位,给出位图目的设备水平以及垂直方向的 分辨率;其中,应用程序可以根据biXPelsPerMeter字段的值,从源位图组中选择与当前 设备特点最匹配的位图。

biCkUsed的数据地址为46,类型为unsignedlong,给出位图实际使用的颜色表中的 颜色变址数。如果该字段的取值为0,则代表本位图使用了biBitCount字段值所代表的最 大颜色值,其中biBitCount字段的取值与biCompression所指定的压缩方法相关。例如: 如果图像为16色,而该字段的取值为10,则代表本位图共使用了12种颜色;如果该字段 的取值非零,而且biBitCount字段的取值小于16,则该字段指定图像或者设备驱动器存 取的实际颜色数。若biBitCount字段的取值大于或者等于16,则该字段指定使Window 系统调色板达到最优性能的颜色表大小。

biChlmportant的数据地址为50,数据类型为unsignedlong,它给出位图显示过程中 重要颜色的变址数。若该字段的取值为0,则表示所有使用的颜色都是重要颜色。

调色板数据

如果位图的描述还需要调色板数据,则应该在BMP文件头之后定义一个颜色表,它 包含若干个表项。其中,每一个表项定义了一种颜色,Windows将其定义为如下的 RGBQUAD结构:

typedef tagRGBQUAD

{

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

}RGBQUAD;

注意:RGBQUAD数据结构中,增加了一个保留字段rgbReserved,它不代表任何意 义,必须取固定值00同时,RGBQUAD结构定义的颜色值中,红色、绿色与蓝色的排 列顺序与一般图像文件的颜色数据排列顺序恰好相反,即:蓝色的亮度由rgbBlue字段 定义、绿色的亮度由rgbGreen字段定义,红色的亮度由rgbRed字段定义。若位图中某个 像素点的颜色描述为"00,00,FF,00",则表示该点的颜色为纯红色,而不是纯 蓝色。

综上,在DIB位图文件组成中,紧随BITMAPFILEHEADER结构其后的数据结构为 BITMAPINFO,两者共同构成完整的位图文件。Windows将BITMAPINFO结构定义为:

tyPedef stmCt tagBITMAPINFO

{

BITMAPINFOHEADER bmiHeader:

RGBQUAD bmiC010ur[1];

}BITMAPINFO;

其中,bmiHeader字段指向包含位图颜色格式以及大小定义的 BITMAPHEADERINFO结构。bmiCo1our[1]字段指向RGBQUAD结构数组或者定义位图 颜色值的双字数据结构,它定义了BMP图像文件的颜色表,它包含多少个表项是由 BITMAPINFOHEADER数据结构中的biBitCount字段定义的:若该字段的取值为1,则颜 色表中共包含两个表项;若该字段的取值为4,则颜色表中共包含16个表项;若该字段 的取值为8,则颜色表中共包含256个表项;若该字段的取值为16,而且 BITMAPINFOHEADER结构定义中指定bmiColors字段的取值为BI_RGB,则颜色表中的 表项为空,位图阵列中每个字代表一个像素,字中每5位上的值代表该像素点一种基色 的亮度,其中最低5位代表蓝色亮度,依次为绿色与红色,字的最高位没有任何意义。 若该字段的取值为24,则颜色表中的表项为空,而位图阵列的每三个字节代表一个像 素,这3个字节直接定义了像素颜色中蓝、绿、红三种基色的相对亮度。 若该字段的取 值为32,而且BITMAPINFOHEADER结构定义中bmiC010rs字段的取值为BI—RGB,则颜 色表中的表项为空,且位图阵列中的每个双字代表一个像素的三原色亮度构成。 注意:颜色表中的数据应该按照重要性的帧序进行排列。另外,如果应用程序中需 要使用DIB位图,则bmiColors字段可以为16位的无符号整数数组,这些整数指定当前逻 辑调色板的颜色索引,而不是显式的RGB值。当然,如果位图存储在文件中或者需要传 送到其它应用程序,则该字段中不能包含调色板索引值。

c语言中图形处理函数

第一部分 图形系统管理

一 c语言中的图形处理需要包含头文件#include

还要初始化 方法是initgraph(&gdriver,&gmode,"tc所在的文件夹");(如"I:\\tc")

但是之前是需要定义int gdriver=DETECT,gmode;

这里gdriver=DETECT是让系统自动检测图形适配器的最高分辨模式的,并装入相应的图形驱动程序

gdriver是一个整型值

DETECT 0

CGA 1

MCGA 2

EGA 3

EGA64 4

EGAMONO 5

IBM8514 6

HERCOMONO 7

ATT400 8

VGA 9

PC3270 10

表一

gmode是一个整型值,用来设置图形的显示模式的

二 关闭图形方式

closegraph();

三 设置视图区

setviewport(x1,y1,x2,y2,c);

x1,y1为视图区 的左上角坐标,

x2,y2为视图区 的左下角坐标;

c为裁剪状态参数c=1时,则自动裁剪超出图形部分的部分,当c=0时,则超出的部分不做裁剪处理

四 清除视图区

cleardevice();

第二部分 绘图函数

一直线类

1,line 画直线

line(x1,y1,x2,y2);

x1,y1,x2,y2为直线两端点坐标;

注意x1,y1,x2,y2均为整型 而且是绝对坐标,不能用变量

2,lineto 从当前点到指定位置画直线

lineto(x,y);

3,moveto(x,y);

移动当前点;

4,linerel(dx,dy);

dx dy均为增量

5,moverel(dx,dy);

与moveto相似,dxdy 均为增量;

二 画弧类函数

1,circle(画圆)

circle(x,y,r);

x,y为整型表示圆形中心坐标,r表示半径

2,acr(x,y,angs,ange,r);

ange,ange:分别为圆弧的起始角和终止角;

3,ellips(画椭圆)

ellipse(x,y,angs.ange,xr,yr);

x,y 为椭圆的中心坐标.

angs,ange;分别为椭圆弧的起始角和终止角,单位为度

xr,yr分别为椭圆的水平半轴和竖直

三 多边形

1,rectangle 画矩形

rectangle(x1,y1,x2,y2);

参数 均为整型;

以 x1,y1为左上角顶点,以x2,y2 为右下角顶点坐标

2,drawpoly 画多变折线

调用格式为drawpoly(nps,*pxy);

nps表示顶点的个数,*pxy是一个数组名,存放顶点坐标的序列.

第三部分 图形属性控制

1,setbkcolor(color);函数

color为一个整型数据,代表索取的颜色,也可以用整型常数,符号常数

见表

BLACK 0 黑色

BLUE 1 蓝色

GREEN 2 绿色

CYAN 3 青色

RED 4 红色

MAGENTA 5 紫红色

BROWN 6 棕色

LIGHTGRAY 7 浅灰色

DARKGRAY 8 深灰色

LIGHTBULE 9 浅蓝色

LIGHTGREEN 10 浅绿色

LIGHTCYAN 11 淡青色

LIGHTRED 12 浅红色

LIGHTMAGENTA 13 淡紫色

YELLOW 14 黄色

WHITE 15 白色

表 二

2,setcolor(color);

设置前景颜色 参数同上;

3,setlinestyle(sty,pat,b);

sty:为整型值,用来定义所画直线的类型见表三

pat:为无符号数,该参数需要用户定义线型时使用,

如果时使用前四种系统预定义的线型,则该参数为0

b:为整型数,指定所画直线的粗细,以象素为单位,见表四;

符号名 数值 含义

SOLID_LINE 0 实线(缺省)

DOTTED_LINE 1 点线

CENTER_LINE 2 中心线

DASHED_LINE 3 虚线

USERBIT_LINE 4 用户定义类型

表三

符号名 数值 含义

NORM-WIDTH 1 1个象素宽

THICK_WIDTH 3 3个象素宽

表四

4,setfillstyle函数

setfillstyle(pattern,color);

pattern 用于指定充填模式,系统共有11种(表五)

符号名 数值 含义

ENPTY_FILL 0 用背景色填充

SOLID_FILL 1 用指定颜色填充

LINE_FILL 2 用线填充

LTSLASH_FILL 3 用斜线填充

SLASH_FILL 4 用粗斜线填充

BKSLASH_FILL 5 用粗反斜线填充

LTBKSLASH_FILL 6 用反斜线填充

HATCH_FILL 7 用网格线填充

XHATCH_FILL 8 用斜交叉线填充

INTERLEAVE_FILL 9 用间隔线填充

WINEDEDOT_FILL 10 用稀疏点填充

CLOSEDOT_FILL 11 用密集点填充

USER_FILL 12 用户自定义填充

表五

floodfill函数

floodfill(x,y,bcolor);

x,y 指位于充填区域任意一点的坐标

bcolor为填充边界颜色

第四部分 文本输出

settextstyle(font,direction,csize);

font :是一个整型数,用来指定所使用的字体见表六

direction:指定文本输出方向;0:从左到右,1从上到下;

符号名 数值 含义

DEFAULT_FONT 0 8*8位图字体(缺省)

TRIPLEX_FONT 1 三重矢量字体

SMALL_FONT 2 小号字体

SANSSERIF_FONT 3 无衬线矢量字体

GOTHIC_FONT 4 哥特矢量字体

表六

2,outtext函数

outtext(*text)

text是字符串

例如outtext("hello!");

3,outtextxy

outtextxy(x,y,*text);

x,y为指定点坐标,text为字符串.

下面举几个例子

是一个简单的直线图形,它是由矩形的长取等分点连线组成的.绘图程序如下

#include

main()

{int x;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"I\\tc");

cleardevice();

setbkcolor(10);

for(x=160;x<=480;x+=20)

{line(160,240,x,120);

line(160,240,x,360);

line(480,240,640-x,360);

line(480,240,640-x,120);

}

getch();

closegraph();

}

金刚石图案

将半径为R的圆周等分为n份,然后用直线将各等分点两两链接,这样形成的图案成为金刚石图案

程序如下

#include

#include

main()

{float t;

int x0=320,y0=240;

int n,i,j,r;

int x[50],y[50];

int gdriver=DETECT,gmode;

printf("input n(23-31)and r(r100-200)\n");

scanf("%d,%d",&n,&r);

initgraph(&gdriver,&gmode,"I:\\tc");

cleardevice();

setbkcolor(8);

setcolor(4);

t=6.28318/n;

for(i=0;i

{x=r*cos(i*t)+x0;

y=r*sin(i*t)+y0;

}

for(i=0;i<=n-2;i++)

{

for(j=i+1;j<=n-1;j++)

line(x,y,x[j],y[j]);

}

getch();

closegraph();

}

三 飘带图案

程序如下

#include

#include

#define PI 3.1415926

main()

{int x1,y1,x2,px=320,py=240;

double a;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"I:\\tc");

cleardevice();

setbkcolor(9);

setcolor(4);

for(a=0;a<=PI;a+=PI/380)

{x1=280*cos(1.6*a)+px;

y1=479-((90*sin(8*a))*cos(a/2.5)+py);

x2=280*cos(1.8*a)+px;

line(x1,y1,x2,y1);

}

getch();

closegraph();

}

四 图形文字

改程序的运行结果是:对你的hello 由小到大逐渐推向屏幕中央.程序重的函数"delay"

用于延迟执行的时间,因为如果执行太快看不到字符串变化的过程.延迟时间可通过t控制;

#include

#include

main()

{

int i,t,x=300,y=80;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"I:\\tc");

setbkcolor(9);

setcolor(4);

printf("input delay time(1--10):");

scanf("%d",&t);

for(i=1;i<=10;i++)

{x=x-15;

y=y+15;

settextstle(1,0,i);

cleardevice();

outtextxy(x,y,"hello");

delay(100*t);

}

getch();

closegraph();

}

第四部分        文本输出

settextstyle(font,direction,csize);

font :是一个整型数,用来指定所使用的字体见表六

direction:指定文本输出方向;0:从左到右,1从上到下;

符号名                数值           含义

DEFAULT_FONT           0             8*8位图字体(缺省)

TRIPLEX_FONT           1             三重矢量字体

SMALL_FONT             2             小号字体

SANSSERIF_FONT         3             无衬线矢量字体

GOTHIC_FONT            4             哥特矢量字体

            表六

2,outtext函数

outtext(*text)

text是字符串

例如outtext("hello!");

3,outtextxy

  outtextxy(x,y,*text);

x,y为指定点坐标,text为字符串.

下面举几个例子

一 

是一个简单的直线图形,它是由矩形的长取等分点连线组成的.绘图程序如下

#include

main()

{int x;

int gdriver=DETECT,gmode;

initgraph(&gdriver,&gmode,"I\\tc");

cleardevice();

setbkcolor(10);

for(x=160;x<=480;x+=20)

        {line(160,240,x,120);

         line(160,240,x,360);

         line(480,240,640-x,360);

         line(480,240,640-x,120);

}

getch();

closegraph();

}

 
阅读(3005) | 评论(0) | 转发(0) |
0

上一篇:唉~~要不得哦

下一篇:分水岭算法

给主人留下些什么吧!~~