数字图像处理实验一(位图文件信息的提取和二值化处理)
数字图像处理实验报告

数字图像处理实验报告实验一数字图像处理编程基础一、实验目的1. 了解MATLAB图像处理工具箱;2. 掌握MATLAB的基本应用方法;3. 掌握MATLAB图像存储/图像数据类型/图像类型;4. 掌握图像文件的读/写/信息查询;5. 掌握图像显示--显示多幅图像、4种图像类型的显示方法;6. 编程实现图像类型间的转换。
二、实验内容1. 实现对图像文件的读/写/信息查询,图像显示--显示多幅图像、4种图像类型的显示方法、图像类型间的转换。
2. 运行图像处理程序,并保存处理结果图像。
三、源代码I=imread('cameraman.tif')imshow(I);subplot(221),title('图像1');imwrite('cameraman.tif')M=imread('pout.tif')imview(M)subplot(222),imshow(M);title('图像2');imread('pout.bmp')N=imread('eight.tif')imview(N)subplot(223),imshow(N);title('图像3');V=imread('circuit.tif')imview(V)subplot(224),imshow(V);title('图像4');N=imread('C:\Users\Administrator\Desktop\1.jpg')imshow(N);I=rgb2gary(GRB)[X.map]=gary2ind(N,2)RGB=ind2 rgb(X,map)[X.map]=gary2ind(I,2)I=ind2 gary(X,map)I=imread('C:\Users\dell\Desktop\111.jpg');subplot(231),imshow(I);title('原图');M=rgb2gray(I);subplot(232),imshow(M);[X,map]=gray2ind(M,100);subplot(233),imshow(X);RGB=ind2rgb(X,map);subplot(234),imshow(X);[X,map]=rbg2ind(I);subplot(235),imshow(X);四、实验效果实验二 图像几何变换实验一、实验目的1.学习几种常见的图像几何变换,并通过实验体会几何变换的效果;2.掌握图像平移、剪切、缩放、旋转、镜像等几何变换的算法原理及编程实现;3.掌握matlab 编程环境中基本的图像处理函数。
数字图像处理 实验 bmp位图的二值化与反色

XXXXXXXX大学(数字图形处理)实验报告实验名称bmp位图的二值化与反色实验时间年月日专业姓名学号预习操作座位号教师签名总评一、实验目的:1. 理解图像的象素操作,理解二值化与反色的本质。
2. 能够使用VC++6.0进行简单的二值化与反色的变换。
二、实验原理:计算机只能处理离散的信号,因此必须进行转换,而利用福利叶变换和傅里叶级数能够使连续的信号离散化从而进行二值化。
图像的反色就依次求出每个像素点的补色,由于用的是256位的图像,所以只需要使用255减去原本像素的色值即可。
三、实验内容:根据实验一的结果,在VC++6.0开发环境下的资源编辑器中,在主菜单中添加一名为“基本运算”的菜单,在其中建立子菜单“点运算”,并在其中添加两个名为“二值化”“发色”的子菜单,分别给他们命名为“IDM_ERZHI”、“IDM_FANSE”的ID,分别通过类向导建立函数。
在函数体中分别加入如下代码:void CHangView::OnErzhi(){// TODO: Add your command handler code herelong w,h,i,j;w=m_DibHead->biWidth;h=m_DibHead->biHeight;unsigned char temp(0);for(i<0;j<3*h;j++)for(j<0;j<w;j++){temp=*(m_Image+i*w+j);if(temp>50)*(m_Image+i*w+j)=255;else*(m_Image+i*w+j)=0;}Invalidate(false);}void CHangView::OnFanse(){// TODO: Add your command handler code herelong w,h;unsigned char *lpsrc;lpsrc=m_Image;w=m_DibHead->biWidth;h=m_DibHead->biHeight;long x,y;int f,a,b;a=1;b=0;for(y=0;y<h;y++)for(x=0;x<w;x++){f=*(lpsrc+y*w+x);*(lpsrc+y*w+x)=255-f;}Invalidate();}四、实验总结:当程序运行没有错误,但是不能够实现函数功能的时候,是因为没有Invalidate函数,而没有能够使试图更新。
数字图像处理实验报告

数字图像处理实验报告1. 引言数字图像处理是使用计算机来处理和优化图像的一种技术。
在本实验中,我们将探索几种常见的数字图像处理方法,并使用Python编程语言和相关库来实现。
2. 实验目的本实验的主要目的是:1.了解图像的基本特性和数字图像处理的基本原理;2.熟悉Python编程语言和相关图像处理库的使用;3.实现常见的图像处理算法并进行实验验证。
3. 实验方法在本实验中,我们使用Python编程语言和以下相关库来实现图像处理算法:•OpenCV:用于图像读取、显示和保存等基本操作;•Numpy:用于图像数据的处理和算术运算;•Matplotlib:用于图像的可视化和结果展示。
以下是实验涉及到的图像处理方法和步骤:1.图像读取和显示:使用OpenCV库读取图像,使用Matplotlib库显示图像;2.图像的灰度化:将彩色图像转换为灰度图像;3.图像的二值化:将灰度图像转换为黑白二值图像;4.图像的平滑处理:使用平滑滤波器对图像进行平滑处理,如均值滤波和高斯滤波;5.图像的边缘检测:使用边缘检测算法对图像进行边缘检测,如Sobel算子和Canny算子;6.图像的直方图均衡化:对灰度图像进行直方图均衡化,增强图像的对比度。
4. 实验过程和结果4.1 图像读取和显示首先,我们使用OpenCV库读取一张图像,并使用Matplotlib库显示该图像:import cv2import matplotlib.pyplot as plt# 读取图像img = cv2.imread('image.jpg')# 显示图像plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.axis('off')plt.show()4.2 图像的灰度化接下来,我们将彩色图像转换为灰度图像:# 灰度化图像gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 显示灰度图像plt.imshow(gray_img, cmap='gray')plt.axis('off')plt.show()4.3 图像的二值化然后,我们将灰度图像转换为黑白二值图像:# 二值化图像_, binary_img = cv2.threshold(gray_img, 128, 255, cv2.THRESH_BINARY)# 显示二值图像plt.imshow(binary_img, cmap='gray')plt.axis('off')plt.show()4.4 图像的平滑处理接下来,我们使用平滑滤波器对图像进行平滑处理,例如使用5x5的均值滤波器和高斯滤波器:# 均值滤波mean_img = cv2.blur(img, (5, 5))# 高斯滤波gaussian_img = cv2.GaussianBlur(img, (5, 5), 0) # 显示平滑处理后的图像plt.figure(figsize=(10, 5))plt.subplot(121)plt.imshow(cv2.cvtColor(mean_img, cv2.COLOR_BGR2R GB))plt.title('Mean Filter')plt.axis('off')plt.subplot(122)plt.imshow(cv2.cvtColor(gaussian_img, cv2.COLOR_B GR2RGB))plt.title('Gaussian Filter')plt.axis('off')plt.show()4.5 图像的边缘检测然后,我们使用边缘检测算法对图像进行边缘检测,例如使用Sobel算子和Canny算子:# 边缘检测sobel_img = cv2.Sobel(gray_img, cv2.CV_8U, 1, 1, ksize=3)canny_img = cv2.Canny(gray_img, 50, 150)# 显示边缘检测结果plt.figure(figsize=(10, 5))plt.subplot(121)plt.imshow(sobel_img, cmap='gray')plt.title('Sobel Operator')plt.axis('off')plt.subplot(122)plt.imshow(canny_img, cmap='gray')plt.title('Canny Operator')plt.axis('off')plt.show()4.6 图像的直方图均衡化最后,我们对灰度图像进行直方图均衡化,以增强图像的对比度:# 直方图均衡化equalized_img = cv2.equalizeHist(gray_img)# 显示直方图均衡化结果plt.imshow(equalized_img, cmap='gray')plt.axis('off')plt.show()5. 实验总结通过本实验,我们熟悉了数字图像处理的基本方法和步骤,并使用Python编程语言和相关库实现了图像的读取、显示、灰度化、二值化、平滑处理、边缘检测和直方图均衡化等操作。
图像二值化实验报告c

竭诚为您提供优质文档/双击可除图像二值化实验报告c篇一:图像处理实验报告1常用mATLAb图像处理命令一、实验目的1、熟悉并掌握mATLAb工具的使用;2、实现图像的读取、显示、代数运算和简单变换。
二、实验环境mATLAb20XXa版本、wIn7计算机三、常用函数?读写图像文件1imreadimread函数用于读入各种图像文件,如:a=imread(e:\w01.tif)2imwriteimwrite函数用于写入图像文件,如:imwrite(a,e:\w02.tif,’tif’)3imfinfoimfinfo函数用于读取图像文件的有关信息,如:imfinfo(e:\w01.tif)?图像的显示1imageimage函数是mATLAb提供的最原始的图像显示函数,如:a=[1,2,3,4;4,5,6,7;8,9,10,11,12];image(a);2imshowimshow函数用于图像文件的显示,如:i=imread(e:\w01.tif);imshow(i);title(‘原图像’)%加上图像标题3colorbarcolorbar函数用显示图像的颜色条,如:i=imread(e:\w01.tif);imshow(i);colorbar;4figurefigure函数用于设定图像显示窗口,如:figure(1);/figure(2);5subplot把图形窗口分成多个矩形部分,每个部分可以分别用来进行显示。
subplot(m,n,p)分成m*n个小窗口,在第p个窗口中创建坐标轴为当前坐标轴,用于显示图形。
6plot绘制二维图形plot(y)plot(x,y)xy可以是向量、矩阵。
?图像类型转换1rgb2gray把真彩图像转换为灰度图像i=rgb2gray(j)2im2bw通过阈值化方法把图像转换为二值图像I=im2bw(j,level)Level表示灰度阈值,取值范围0~1(即0.n),表示阈值取自原图像灰度范围的n%3imresize改变图像的大小I=imresize(j,[mn])将图像j大小调整为m行n列?图像运算1imadd两幅图像相加,要求同样大小,同种数据类型Z=imadd(x,y)表示图像x+y2imsubstract两幅图像相减,要求同样大小,同种数据类型Z=imsubtract(x,y)表示图像x-y3immultiplyZ=immultiply(x,y)表示图像x*y4imdivideZ=imdivide(x,y)表示图像x/y四、心得体会学习了matlab中基本的图像处理命令,为以后图像处理打下了较好的基础。
数字图像处理实验报告

目录实验一:数字图像的基本处理操作 (4):实验目的 (4):实验任务和要求 (4):实验步骤和结果 (5):结果分析 (8)实验二:图像的灰度变换和直方图变换 (9):实验目的 (9):实验任务和要求 (9):实验步骤和结果 (9):结果分析 (13)实验三:图像的平滑处理 (14):实验目的 (14):实验任务和要求 (14):实验步骤和结果 (14):结果分析 (18)实验四:图像的锐化处理 (19):实验目的 (19):实验任务和要求 (19):实验步骤和结果 (19):结果分析 (21)实验一:数字图像的基本处理操作:实验目的1、熟悉并掌握MATLAB、PHOTOSHOP等工具的使用;2、实现图像的读取、显示、代数运算和简单变换。
3、熟悉及掌握图像的傅里叶变换原理及性质,实现图像的傅里叶变换。
:实验任务和要求1.读入一幅RGB图像,变换为灰度图像和二值图像,并在同一个窗口内分成三个子窗口来分别显示RGB图像和灰度图像,注上文字标题。
2.对两幅不同图像执行加、减、乘、除操作,在同一个窗口内分成五个子窗口来分别显示,注上文字标题。
3.对一幅图像进行平移,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与平移后傅里叶频谱的对应关系。
4.对一幅图像进行旋转,显示原始图像与处理后图像,分别对其进行傅里叶变换,显示变换后结果,分析原图的傅里叶谱与旋转后傅里叶频谱的对应关系。
:实验步骤和结果1.对实验任务1的实现代码如下:a=imread('d:\');i=rgb2gray(a);I=im2bw(a,;subplot(1,3,1);imshow(a);title('原图像');subplot(1,3,2);imshow(i);title('灰度图像');subplot(1,3,3);imshow(I);title('二值图像');subplot(1,3,1);imshow(a);title('原图像');结果如图所示:图原图及其灰度图像,二值图像2.对实验任务2的实现代码如下:a=imread('d:\');A=imresize(a,[800 800]);b=imread('d:\');B=imresize(b,[800 800]);Z1=imadd(A,B);Z2=imsubtract(A,B);Z3=immultiply(A,B);Z4=imdivide(A,B);subplot(3,2,1);imshow(A);title('原图像 A'); subplot(3,2,2);imshow(B);title('原图像 B'); subplot(3,2,3);imshow(Z1);title('加法图像'); subplot(3,2,4);imshow(Z2);title('减法图像'); subplot(3,2,5);imshow(Z3);title('乘法图像'); subplot(3,2,6);imshow(Z2);title('除法图像');结果如图所示:3.对实验任务3的实现代码如下:s=imread('d:\');i=rgb2gray(s);i=double(i);j=fft2(i);k=fftshift(j); %直流分量移到频谱中心I=log(abs(k)); %对数变换m=fftshift(j); %直流分量移到频谱中心RR=real(m); %取傅里叶变换的实部II=imag(m); %取傅里叶变换的虚部A=sqrt(RR.^2+II.^2);A=(A-min(min(A)))/(max(max(A)))*255;b=circshift(s,[800 450]);b=rgb2gray(b);b=double(b);c=fft2(b);e=fftshift(c);I=log(abs(e));f=fftshift(c);WW=real(f);ZZ=imag(f);B=sqrt(WW.^2+ZZ.^2);B=(B-min(min(B)))/(max(max(B)))*255;subplot(2,2,1);imshow(s);title('原图像');subplot(2,2,2);imshow(uint8(b));title('平移图像');subplot(2,2,3);imshow(A);title('离散傅里叶变换频谱');subplot(2,2,4);imshow(B);title('平移图像离散傅里叶变换频谱');结果如图所示:4.对实验任务4的实现代码如下:s=imread('d:\');i=rgb2gray(s);i=double(i);j=fft2(i);k=fftshift(j);I=log(abs(k));m=fftshift(j);RR=real(m);II=imag(m);A=sqrt(RR.^2+II.^2);A=(A-min(min(A)))/(max(max(A)))*255;b=imrotate(s,-90);b=rgb2gray(b);b=double(b);c=fft2(b);e=fftshift(c);I=log(abs(e));f=fftshift(c);WW=real(f);ZZ=imag(f);B=sqrt(WW.^2+ZZ.^2);B=(B-min(min(B)))/(max(max(B)))*255;subplot(2,2,1);imshow(s);title('原图像');subplot(2,2,2);imshow(uint8(b));title('平移图像');subplot(2,2,3);imshow(A);title('离散傅里叶频谱');subplot(2,2,4);imshow(B);title('平移图像离散傅里叶频谱');结果如图所示::结果分析对MATLAB软件的操作开始时不太熟悉,许多语法和函数都不会使用,写出程序后,调试运行,最开始无法显示图像,检查原因,是有些标点符号没有在英文状态下输入和一些其他的细节,学会了imread(),imshow(),rgb2gray()等函数。
数字图像处理二值图像处理PPT课件

第14页/共57页
(d) 边界的8链码表
•链 码 的 表 示 方 法 具 有 下 面 一 些 有 趣 的 特 性 : • ① 如果曲线上的像素数目为N,那么链码的长度则为N-1; • ② 链码是和起点相关的,不同的起点可以得到不同的链码表示。 • ③ 链码具有平移的不变性,也就是说曲线的位置变动不改变其链码结构; • ④ 曲线的旋转将使得得到的链码中的每个元素分量增加相同的数值。
• 对于离散的的数字图像f(i,j),矩定义为:
• 对于二值图像,在目标区域R有f(i,j)=1,背景区域f(i,j)=0,因此:
M 1 N 1
mpq
i p j q f (i, j) p, q 0,1,2
i0 j0
mpq
ip jq
(i, j)R
第22页/共57页
• 同样的,考察二值图像各阶矩,我们可以知道,其零阶矩m00为目标区域的面 积,也即区域中包含的点数;假设
• ② 对称性:
;
• ③ 三角不等式:
d(A, B) 0
d(A, B) d(B, A) d(A,C) d(A, B) d(B,C)
第2页/共57页
•假 设 计 算 点 P ( a , b ) 与 Q ( c , d ) 间 距 离 可 以 采 取 下 面 的 几 种 定 义 形 式 :
•
① 欧几里德距离,用来De表示,如下式所示:
阶矩称为惯性矩。
•中心矩 :
pq (x x) p ( y y)q f (x, y)dxdy p, q 0,1,2
第21页/共57页
• 低阶矩主要描述区域的面积、转动惯量、质心等等,具有明显得几何意义,而高 阶矩一般主要描述区域的细节特征,比如三阶矩描述扭曲度,四阶矩描述峰值的状 态等等,一般来说高阶矩受到图像离散化等的影响,高阶矩一般在应用中不一定十 分准确。
数字图像处理实验报告
《数字图像处理》实验报告专业:软件工程*名:***学号: S********* 指导老师:***2019年 12 月 28 日信息学部软件学院目录实验一、BMP文件的读写 (1)1 实验目的与实验内容 (1)2 实验原理 (1)3 实验关键代码 (1)4 实验运行结果 (3)5 总结 (4)实验二、图像缩放 (4)1 实验目的及内容 (4)2 实验原理 (5)3 实验关键代码和运行结果 (6)4 结果分析 (8)实验三、直方图均衡 (9)1 实验目的及内容 (9)2 实验原理 (9)3 实验关键代码和实验结果 (10)4 思考题 (11)5结果分析 (12)实验四、图像滤波 (12)1 实验目的及内容 (12)2 图像滤波的原理 (12)3 实验关键代码及结果 (13)实验五、图像的灰度映射 (17)1 实验目的及内容 (17)2 实验关键代码及结果 (17)3 不同参数的变换结果 (20)附录一 (17)实验要求:用 c/c++语言编程实现以下功能实验环境:Windows10开发工具:CodeBlocks实验一、BMP文件的读写1 实验目的与实验内容1.1灰度 BMP 图像的读写:(1) 读入 lena.bmp 文件;(2) 通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;(3) 提取出原图像中的位图数据,另存为 lena.raw, 并通过 photoshop 打开该文件,查看所读取的数据。
(4)仅取原始图像左上角 1/4 的数据,另存一个 lenas.bmp 图像,在photoshop 中打开查看效果。
1.2 彩色 BMP 图像读写(1) 读入文件 lena_C.bmp 文件;(2) 通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;(3) 提取出原图像中的位图数据,另存为 lena_C.raw, 并通过 photoshop 打开该文件,查看所读取的数据。
数字图像处理实验指导书
实验一:图像文件类型转换实验目的:理解数字图像文件的几种基本类型掌握在MATLAB中进行图象文件类型转换的方法观察图象转换前后的效果加深对图象文件类型的理解熟悉图象格式、颜色系统间的转换实验内容:1)灰度图像与索引图像的相互转换2)RGB图像与索引图像的相互转换3)将图像转换为二值化图像实验方法:利用MATLAB工具进行实验一、灰度图像到索引图像的转换启动MATLAB,新建一个自己的工作文件夹(如下图中的“MYFIG”)。
并把它设置在当前的工作路径(Current Directory)下。
1)在该文件夹中拷入个灰度图片,比如“2.jpg”文件。
2)在MATLAB命令输入窗中,调用函数info=imfinfo('2.jpg')观查2.jpg是否为灰度图像在ColorType: 'grayscale' 属性行如此显示,则说明以2.jpg命名的文件为灰度图像。
3)输入如下命令完成转换RGB=imread('2.jpg'); % 将图像“2.jpg”的数据赋给变量RGBfigure(3); % 设定显示窗口3imshow(RGB); % 显示原“2.jpg”文件figure(1); % 设定显示窗口1[RGB1,map1]=gray2ind(RGB,128); % 指定灰度级128,进行灰度图像到索引图像转换imshow(RGB1,map1) ; % 显示索引图像1figure(2); % 设定显示窗口2[RGB2,map2]=gray2ind(RGB,16); % 指定灰度级16,进行灰度图像到索引图像转换imshow(RGB2,map2) ; % 显示索引图像2imwrite(RGB1,map1,'3.bmp'); % 将索引图像1保存为名为“3.bmp”的文件imwrite(RGB2,map2,'4.bmp'); % 将索引图像2 保存为名为“4.bmp”的文件info=imfinfo('3.bmp')info=imfinfo('4.bmp')运行并观察结果和现象。
计算机图像处理实验
位图文件信息的提取和二值化处理实验步骤:1.拷贝MinGW文件夹至C:(路径为C:\MinGW)2.编辑setc.bat文件,然后运行此批处理以设置路径。
3.编辑hdr.h 和hdr.c文件4.编辑bmphdr.c文件,然后在当前文件路径下,使用DOS命令:gcc -c hdr.c //编译,生成hdr.o目标文件gcc -c bmphdr.c //编译,生成bmphdr.o目标文件gcc -o bmphdr.exe hdr.o bmphdr.o //链接,生成bmphdr.exe执行文件使用bmphdr.exe来提取某一个bmp文件的头信息,例如:bmphdr test.bmp5.编辑 ez.c文件(用于图像的二值化处理),然后gcc -c ez.c //编译,生成ez.o目标文件gcc -o ez.exe hdr.o ez.o //链接,生成ez.exe执行文件使用 ez.exe文件来对某一个bmp文件进行二值化处理。
例如:ez test.bmp result.bmp 108 (对test.bmp文件进行二值化处理,阈值为108,处理的结果为result.bmp文件)hdr.h文件内容:#ifndef __HDR_H__#define __HDR_H__struct bmphdr {char signature[2];int size;short reserved[2];int offset;int hdr_size;int width;int height;short nr_planes;short bits_per_pixel;int compress_type;int data_size;int resol_hori;int resol_vert;int nr_colors;int important_color;char info[1024];};struct bmphdr *get_header(char filename[]);#endifhdr.c文件内容:#include <stdio.h>#include <memory.h>#include "hdr.h"struct bmphdr *get_header(char filename[]){FILE *fp;struct bmphdr *hdr;fp = fopen(filename, "rb");if (!fp) {printf("File open error or such file does not exist!\n");return NULL;}hdr = (struct bmphdr *)malloc(sizeof(struct bmphdr));fread(hdr->signature, 2, 1, fp);if (hdr->signature[0] != 'B' || hdr->signature[1] != 'M') { printf("Not a bmp file!\n");return NULL;}fread(&hdr->size, 4, 1, fp);fread(hdr->reserved, 4, 1, fp);fread(&hdr->offset, 4, 1, fp);fread(&hdr->hdr_size, 4, 1, fp);fread(&hdr->width, 4, 1, fp);fread(&hdr->height, 4, 1, fp);fread(&hdr->nr_planes, 2, 1, fp);fread(&hdr->bits_per_pixel, 2, 1, fp);fread(&hdr->compress_type, 4, 1, fp);fread(&hdr->data_size, 4, 1, fp);fread(&hdr->resol_hori, 4, 1, fp);fread(&hdr->resol_vert, 4, 1, fp);fread(&hdr->nr_colors, 4, 1, fp);fread(&hdr->important_color, 4, 1, fp);if (hdr->offset > 54)fread(&hdr->info, 1024, 1, fp);fclose(fp);return hdr;}bmphdr.c文件内容:#include <stdio.h>struct bmphdr {char signature[2];int size;short reserved[2];int offset;int hdr_size;int width;int height;short nr_planes;short bits_per_pixel;int compress_type;int data_size;int resol_hori;int resol_vert;int nr_colors;int important_color;} header;int main(int argc, char *argv[]){FILE *fp;if (argc != 2) {printf("Usage: %s <filename>\n", argv[0]);exit(1);}fp = fopen(argv[1], "r");if (!fp) {printf("File open error or such file does not exist!\n");exit(1);}fread(header.signature, 2, 1, fp);if (header.signature[0] != 'B' || header.signature[1] != 'M') {printf("Not a bmp file!\n");exit(1);}fread(&header.size, 4, 1, fp);fread(header.reserved, 4, 1, fp);fread(&header.offset, 4, 1, fp);fread(&header.hdr_size, 4, 1, fp);fread(&header.width, 4, 1, fp);fread(&header.height, 4, 1, fp);fread(&header.nr_planes, 2, 1, fp);fread(&header.bits_per_pixel, 2, 1, fp);fread(&press_type, 4, 1, fp);fread(&header.data_size, 4, 1, fp);fread(&header.resol_hori, 4, 1, fp);fread(&header.resol_vert, 4, 1, fp);fread(&header.nr_colors, 4, 1, fp);fread(&header.important_color, 4, 1, fp);fclose(fp);printf("signature %c%c\n", header.signature[0], header.signature[1]);printf("size %d\n", header.size);printf("offset %d\n", header.offset);printf("hdr_size %d\n", header.hdr_size);printf("width %d\n", header.width);printf("height %d\n", header.height);printf("nr_planes %d\n", header.nr_planes);printf("bits_per_pixel %d\n", header.bits_per_pixel);printf("compress_type %d\n", press_type);printf("data_size %d\n", header.data_size);printf("resol_hori %d\n", header.resol_hori);printf("resol_vert %d\n", header.resol_vert);printf("nr_colors %d\n", header.nr_colors);printf("important_color %d\n", header.important_color);printf("\n");return 0;}二值化程序ez.c 文件内容:#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"struct bmphdr *hdr;unsigned char *bitmap, *to;char buf[2048];int main(int argc, char *argv[]){int i, j, k, nr_pixels;FILE *fp, *fpnew;unsigned g;if (argc != 4) {printf("Usage: %s <file_from> <file_to> <threshold>\n", argv[0]);exit(1);}hdr = get_header(argv[1]);if (!hdr) exit(1);fp = fopen(argv[1], "rb");if (!fp) {printf("File open error!\n");exit(1);}fseek(fp, hdr->offset, SEEK_SET);nr_pixels = hdr->width * hdr->height;bitmap = malloc(nr_pixels);fread(bitmap, nr_pixels, 1, fp);fclose(fp);k = atoi(argv[3]);to = malloc(nr_pixels);memset(to, 0, nr_pixels);for (i = 0; i < nr_pixels; i++)to[i] = bitmap[i] > (unsigned char)k ? 255 : 0;fpnew = fopen(argv[2], "wb+");if (!fpnew) {printf("File create error!\n");exit(1);}fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, hdr->offset - 54, 1, fpnew);fwrite(to, nr_pixels, 1, fpnew);fclose(fpnew);free(hdr);free(bitmap);return 0;}直方图均衡化直方图均衡化实质上是减少图象的灰度级以换取对比度的加大例如:假设原图的灰度分布级为126(最大为256,也就是从0到255的级上的灰度都有或多或少的出现),经过直方图均衡化后,灰度分布级别将会小于126。
数字图像处理实验报告
图像处理实验名称:数字图像处理专业:测控技术与仪器*名:**学号: *********实验一一、实验内容:1.任选一幅图像,利用imread函数读入matlab中,存入矩阵I中。
2.利用whos命令提取该读图像的基本信息。
3.利用imshow()函数来显示矩阵I。
4.利用imfinfo函数来获取图像文件的压缩,颜色等等其他的详细信息。
5.利用imwrite()函数来压缩这幅图象,将其保存为一幅压缩后的jpg文件。
6.利用im2bw将图像转化为二值图像,并且用imshow显示原图像和二值图像,观察图像的特征。
7.利用rgb2gray将图像转化为灰度图像,并且用imshow显示原图像和灰度图像,观察图像的特征。
二、实验程序:I=imread('1.png');whos I;subplot(131);imshow(I);title('原图');info=imfinfo('1.png')imwrite(I,'2.JPG');A=im2bw(I);subplot(132);imshow(A);title('二值图像');B=rgb2gray(I);subplot(133);imshow(B);title('灰度图像');三、运行结果:实验二一、实验内容:1.将图2.1中的(a)、(b)两幅图像叠加在一起:图2.12.给图2.2的每一个像素加上一个常数图2.23.利用图像减法消除背景,给图像减去一个常数图2.3二、程序及运行结果:(1)将图2.1中的(a)、(b)两幅图像叠加在一起::A=imread('21.png');B=imread('22.png');C=imadd(A,B);imshow(C);结果:(2)给图2.2的每一个像素加上一个常数A = imread('23.png');B = imadd(A,20);subplot(1,2,1);imshow(A);title('原图');subplot(1,2,2);imshow(B);title('每个像素加常数');现象:增加了图像的亮度(3)利用图像减法消除背景,给图像减去一个常数A=imread('24.png');subplot(131);imshow(A);title('原始图像');background=imopen(A,strel('disk',15));B=imsubtract(A,background);subplot(132);imshow(background);title('输出背景');subplot(133);imshow(B,[]);title('减法运算结果');注:代数运算的结果很容易超出数据类型允许的范围,超出数据范围的整型数据将被截取为数据范围的极值,分数结果将被四舍五入。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字图像处理实验一(位图文件信息的提取和二值化处理)实验平台:MinGW(Mini Gnu for Windows),里面包含gcc for windows的编译器,将其拷贝值某目录,然后设置环境变量(这里我设为c:\MinGW,通过一个批处理命令setc.bat实现)设置完成后,即可通过gcc(g++)命令进行编译。
(附:使用VC++ 6.0 也可)相关实验文件下载地址:ftp://218.193.154.238 /课件/数字图像处理/实验步骤:拷贝MinGW文件夹至C: (路径为C:\MinGW)编辑setc.bat文件,然后运行此批处理以设置路径。
编辑hdr.h 和hdr.c文件编辑bmphdr.c文件,然后在当前文件路径下,使用DOS命令:gcc -c hdr.c //编译,生成hdr.o目标文件gcc -c bmphdr.c //编译,生成bmphdr.o目标文件gcc -o bmphdr.exe hdr.o bmphdr.o //链接,生成bmphdr.exe执行文件使用bmphdr.exe来提取某一个bmp文件的头信息,例如:bmphdr test.bmp编辑ez.c文件(用于图像的二值化处理),然后gcc -c ez.c //编译,生成ez.o目标文件gcc -o ez.exe hdr.o ez.o //链接,生成ez.exe执行文件使用ez.exe文件来对某一个bmp文件进行二值化处理。
例如:ez test.bmp result.bmp 108 (对test.bmp文件进行二值化处理,阈值为108,处理的结果为result.bmp文件)setc.bat内容:@echo offset msdir=C:\MinGWset PATH="%msdir%\bin";"%PATH%"set INCLUDE=%msdir%\Include;%msdir%\MFC\Include;%INCLUDE%set LIB=%msdir%\Lib;%LIB%补充:如果以上批处理命令无效的话,可以:我的电脑->属性->高级->环境变量编辑变量path 增加C:\ MinGW\bin hdr.h文件内容:#ifndef __HDR_H__#define __HDR_H__struct bmphdr {char signature[2];int size;short reserved[2];int offset;int hdr_size;int width;int height;short nr_planes;short bits_per_pixel;int compress_type;int data_size;int resol_hori;int resol_vert;int nr_colors;int important_color;char info[1024];};struct bmphdr *get_header(char filename[]);#endifhdr.c文件内容:#include <stdio.h>#include <memory.h>#include "hdr.h"struct bmphdr *get_header(char filename[]){FILE *fp;struct bmphdr *hdr;fp = fopen(filename, "rb");if (!fp) {printf("File open error or such file does not exist!\n");return NULL;}hdr = (struct bmphdr *)malloc(sizeof(struct bmphdr));fread(hdr->signature, 2, 1, fp);if (hdr->signature[0] != 'B' || hdr->signature[1] != 'M') { printf("Not a bmp file!\n");return NULL;}fread(&hdr->size, 4, 1, fp);fread(hdr->reserved, 4, 1, fp);fread(&hdr->offset, 4, 1, fp);fread(&hdr->hdr_size, 4, 1, fp);fread(&hdr->width, 4, 1, fp);fread(&hdr->height, 4, 1, fp);fread(&hdr->nr_planes, 2, 1, fp);fread(&hdr->bits_per_pixel, 2, 1, fp);fread(&hdr->compress_type, 4, 1, fp);fread(&hdr->data_size, 4, 1, fp);fread(&hdr->resol_hori, 4, 1, fp);fread(&hdr->resol_vert, 4, 1, fp);fread(&hdr->nr_colors, 4, 1, fp);fread(&hdr->important_color, 4, 1, fp);if (hdr->offset > 54)fread(&hdr->info, 1024, 1, fp);fclose(fp);return hdr;bmphdr.c文件内容:#include <stdio.h>struct bmphdr {char signature[2];int size;short reserved[2];int offset;int hdr_size;int width;int height;short nr_planes;short bits_per_pixel;int compress_type;int data_size;int resol_hori;int resol_vert;int nr_colors;int important_color;} header;int main(int argc, char *argv[]){FILE *fp;if (argc != 2) {printf("Usage: %s <filename>\n", argv[0]);exit(1);}fp = fopen(argv[1], "r");if (!fp) {printf("File open error or such file does not exist!\n");exit(1);}fread(header.signature, 2, 1, fp);if (header.signature[0] != 'B' || header.signature[1] != 'M') { printf("Not a bmp file!\n");exit(1);}fread(&header.size, 4, 1, fp);fread(header.reserved, 4, 1, fp);fread(&header.offset, 4, 1, fp);fread(&header.hdr_size, 4, 1, fp);fread(&header.width, 4, 1, fp);fread(&header.height, 4, 1, fp);fread(&header.nr_planes, 2, 1, fp);fread(&header.bits_per_pixel, 2, 1, fp);fread(&press_type, 4, 1, fp);fread(&header.data_size, 4, 1, fp);fread(&header.resol_hori, 4, 1, fp);fread(&header.resol_vert, 4, 1, fp);fread(&header.nr_colors, 4, 1, fp);fread(&header.important_color, 4, 1, fp);fclose(fp);printf("signature %c%c\n", header.signature[0], header.signature[1]);printf("size %d\n", header.size);printf("offset %d\n", header.offset);printf("hdr_size %d\n", header.hdr_size);printf("width %d\n", header.width);printf("height %d\n", header.height);printf("nr_planes %d\n", header.nr_planes);printf("bits_per_pixel %d\n", header.bits_per_pixel);printf("compress_type %d\n", press_type);printf("data_size %d\n", header.data_size);printf("resol_hori %d\n", header.resol_hori);printf("resol_vert %d\n", header.resol_vert);printf("nr_colors %d\n", header.nr_colors);printf("important_color %d\n", header.important_color);printf("\n");return 0;}二值化程序ez.c 文件内容:#include <stdio.h>#include <stdlib.h>#include <memory.h>#include "hdr.h"struct bmphdr *hdr;unsigned char *bitmap, *to;char buf[2048];int main(int argc, char *argv[]){int i, j, k, nr_pixels;FILE *fp, *fpnew;unsigned g;if (argc != 4) {printf("Usage: %s <file_from> <file_to> <threshold>\n", argv[0]);exit(1);}hdr = get_header(argv[1]);if (!hdr) exit(1);fp = fopen(argv[1], "rb");if (!fp) {printf("File open error!\n");exit(1);}fseek(fp, hdr->offset, SEEK_SET);nr_pixels = hdr->width * hdr->height;bitmap = malloc(nr_pixels);fread(bitmap, nr_pixels, 1, fp);fclose(fp);k = atoi(argv[3]);to = malloc(nr_pixels);memset(to, 0, nr_pixels);for (i = 0; i < nr_pixels; i++)to[i] = bitmap[i] > (unsigned char)k ? 255 : 0;fpnew = fopen(argv[2], "wb+");if (!fpnew) {printf("File create error!\n");exit(1);}fwrite(hdr->signature, 2, 1, fpnew);fwrite(&hdr->size, 4, 1, fpnew);fwrite(hdr->reserved, 4, 1, fpnew);fwrite(&hdr->offset, 4, 1, fpnew);fwrite(&hdr->hdr_size, 4, 1, fpnew);fwrite(&hdr->width, 4, 1, fpnew);fwrite(&hdr->height, 4, 1, fpnew);fwrite(&hdr->nr_planes, 2, 1, fpnew);fwrite(&hdr->bits_per_pixel, 2, 1, fpnew);fwrite(&hdr->compress_type, 4, 1, fpnew);fwrite(&hdr->data_size, 4, 1, fpnew);fwrite(&hdr->resol_hori, 4, 1, fpnew);fwrite(&hdr->resol_vert, 4, 1, fpnew);fwrite(&hdr->nr_colors, 4, 1, fpnew);fwrite(&hdr->important_color, 4, 1, fpnew);if (hdr->offset > 54)fwrite(hdr->info, hdr->offset - 54, 1, fpnew);fwrite(to, nr_pixels, 1, fpnew);fclose(fpnew);free(hdr);free(bitmap);return 0;}。