GUI与直方图均衡
利用matlab以及GUI基本使用,对图像的对比度进行了处理,使图像变得更加清晰,便有了下面的结果
如图所示为GUI界面,左上角为被处理灰度图像,下面两幅图像为处理之后的结果,右边的文本输入框用以输入图片的来源,选择框是选择图像的类型(灰度图像;彩色图像),下面对GUI基本设计实现与图像的基本处理说明。
GUI简单设计实现
通常情况下,一个GUI包含两个文件,m文件和FIG文件,m文件包含一个与m文件同名的主函数和与各个控件对应的响应函数,这些响应函数为主函数的子函数,响应函数与特定的GUI对象关联,或与GUI图形关联,当事件发生时,调用该事件所激发的响应函数,响应函数包含以下几个参数:
hObject: 对象句柄,如触发该函数的控件句柄event
event: 保留参数
handles: 一个结构体,里面包含图像中所有对象的句柄,使用GUI向导创建结构体,并且在整个函数的运行过程中保持不变,所有的响应函数使用该结构体作为输入参数
GUI的初始化函数包括Opening函数,Output函数,Opening函数是第一个被调用的函数
创建简单的GUI
点击“新建”,选择“图形用户界面”
点击“新建GUI”,选择第一个即可,点击确认进入到了GUI的设计界面
左侧为使用到的控件,有按钮,复选框,静态文本,可编辑文本,弹出式菜单等;
该GUI使用到的控件有:按钮(触发事件);静态文本(用于说明);可编辑文本(用于输入图片路径);坐标轴框(显示图像);弹出式菜单;添加完基本的控件,就是对控件的属性进行修改(双击控件进行修改);
对于多图显示,必须明确显示位置,修改每个坐标轴框的Tag属性,用以区分;
1axes(handles.axes1); %axes1为某个窗体的Tag属性;%确定画图区域
读取可编辑文本内容,修改Tag属性(起个名字)
1picture=(get(handles.picture,‘String’));
2%获取图片信息的来源;返回值为读取到的字符串
弹出式菜单(多种选择)同样修改Tag属性就可
1type=get( handles.type,‘Value’); %读取弹出式菜单的数据
type是从1开始的,即代表第一个选项,为2代表第二个选项;if(type==1)
图像的直方图均衡
灰度直方图是图象最基本的统计特征,反映了图象中每种灰度出现的相对频率,若一幅图象的灰度直方图表现为均匀分布,说明这幅图象其象素占有全部可能的灰度级并且分布均匀,这就是一幅高对比度的图象,灰度级丰富且动态范围大。直方图均衡就是把给定图象转变为具有均匀分布直方图的新图象,达到提高图象对比度的目的。
直方图的获取
matlab函数
1His = imhist(image); %获取原图像直方图
自定义函数
1%函数功能:获取数字图像的直方图
2%返回值: 图像的直方图,幅度为灰度级个数
3%入口参数:
4% 被处理图像
5function Y = Histogram(image)
6Y = zeros(1,256);
7X=0:255; %横坐标,灰度级
8
9[row,line] = size(image);%获取图像的大小
10
11%数组下标从1开始,i=灰度级+1;
12%输入图像为归一化double类型
13for i=1:row
14 for j=1:line
15 Y(uint8(image(i,j)*255)+1)=Y(uint8(image(i,j)*255)+1) + 1;
16 end
17end
18
图像的直方图均衡
matlab函数
image2= histeq(image,256);%原始图像直方图均衡化处理
自定义函数
1%函数功能:得到图像的直方图均衡;
2%返回值: 处理后的图像矩阵
3%入口参数:
4% image:归一化的double图像
5% gray_scale:灰度级
6function image_del = His_Average(image , gray_scale)
7
8ni = Histogram(image);%得到图像的原始直方图,此时幅度为灰度数
9[row,line]=size(image);
10image = uint8(image*255);%将图像取整,便于计算!
11image_del = image;
12%得到直方图概率分布
13p_i = zeros(1,gray_scale);
14len = row*line;
15
16for i=1:gray_scale
17 p_i(i) = ni(i)/len;
18end
19
20%累积直方图
21Pj = zeros(1,gray_scale);
22Pj(1)= p_i(1);
23
24for i=2:gray_scale %得到累积直方图 Pj
25 Pj(i) = p_i(i)+Pj(i-1);
26end
27
28%i->原始图像灰度级=i-1;
29%j->变换后的实际灰度值
30for i=1:gray_scale %计算变换后的灰度值j
31 j =uint8((gray_scale-1)*Pj(i)+0.5); %灰度级i-1映射到j,因为矩阵的下标是从1开始的
32 for k = 1:row %根据映射关系,更新处理图像,将灰度级为i-1的全部映射为j,
33 for m = 1:line
34 if(image(k,m)==(i-1))
35 image_del(k,m) = j;
36 end
37 end
38 end
39end
40image_del = im2double(image_del);
41
1%函数功能:局部直方图均匀化
2%入口参数:
3% image:被处理图像
4% num: 灰度级
5function B = Partial_Ave(image , num)
6 [row,line]=size(image);
7 size_num = 32;%块大小
8
9 %%%%%:方法一
10 %fun = @(x) His_Average(x,num);
11 %B = blkproc(image,[size_num size_num],fun)%将图像分为num*num的块;
12
13
14
15 %%%%方法二
16 buf = zeros(size_num,size_num);
17 B = image;
18 x=0;y=0;
19 a=0;b=0;
20 for i=1:size_num:row
21 x=i;
22 for j=1:size_num:line %对应的块
23 y=j;
24 for k=i:i+size_num-1
25 a = rem(k,size_num);
26 if(a ==0 )
27 a =size_num;
28 end
29 for m=j:j+size_num-1
30 b = rem(m,size_num);
31 if(b==0)
32 b=size_num;
33 end
34 buf(a,b) = image(k,m);%提取像素块
35 end
36 end %buf(k,m)获取好的块
37 buf = His_Average(buf,256);%对提取的块进行直方图均衡
38 for L = x:x+size_num-1%对块进行像素映射
39 a = rem(L,size_num);
40 if(a ==0 )
41 a =size_num;
42 end
43 for N = y:y+size_num-1
44 b = rem(N,size_num);
45 if(b==0)
46 b=size_num;
47 end
48 B(L,N) = buf(a,b);
49 end
50 end
51 end
52 end
53
更多精彩内容,完整代码,欢迎关注公众号“LLP学嵌入式