1. 图像的直方图均衡
1.1 实验目的与要求
(1)理解直方图均衡的原理与作用;
(2)掌握统计图像直方图的方法;
(3)掌握图像直方图均衡的方法。
1.2 实验原理及知识点
直方图均衡化是通过灰度变换将一幅图象转换为另一幅均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。直方图均衡的缺点是:1、变换后图像的灰度级减少,某些细节消失;2、某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
1.3 实验仪器与软件
(1) PC计算机
(2) MatLab或opencv
(3) 实验所需要的图片 (注意: 示例代码中的如 rice.png,pout.tif 等图片一般可以直接使用不需要准备,这些图片是安装matlab后就有的示例图片,如果读不了可以尝试修改一下文件名的后缀,如.png,.jpg或者.tif,也可以在本报告中另存图片在工作目录上)
1.4 实验报告要求
描述实验的基本步骤,用数据和图片给出各个步骤中取得的实验结果和源代码,并进行必要的讨论,必须包括原始图像及其计算/处理后的图像。
1.5 实验内容及步骤
(1) 直方图显示
读入图像‘rice.png’,在一个窗口中显示灰度级n=64,128和256的图像直方图。
% 读入图像
image = imread('rice.png');
% 显示灰度级为64的直方图
subplot(3,1,1);
imhist(image, 64);
title('Histogram with 64 Gray Levels');
% 显示灰度级为128的直方图
subplot(3,1,2);
imhist(image, 128);
title('Histogram with 128 Gray Levels');
% 显示灰度级为256的直方图
subplot(3,1,3);
imhist(image, 256);
title('Histogram with 256 Gray Levels');
(2)直方图灰度调节
利用函数imadjust调解图像灰度范围,观察变换后的图像及其直方图的变化。
% 读入图像
image = imread('rice.png');
% 对图像进行灰度范围调节
adjusted_image = imadjust(image);
% 显示原图像
subplot(2,2,1);
imshow(image);
title('Original Image');
% 显示原图像的直方图
subplot(2,2,2);
imhist(image);
title('Original Histogram');
% 显示调节后的图像
subplot(2,2,3);
imshow(adjusted_image);
title('Adjusted Image');
% 显示调节后的图像的直方图
subplot(2,2,4);
imhist(adjusted_image);
title('Adjusted Histogram');
(3)直方图均衡化
分别对图像‘pout.tif’和‘tire.tif’进行直方图均衡化处理,比较处理前后图像及直方图分布的变化。
% 读入图像1
image1 = imread('pout.tif');
% 读入图像2
image2 = imread('tire.tif');
% 对图像1进行直方图均衡化
equalized_image1 = histeq(image1);
% 对图像2进行直方图均衡化
equalized_image2 = histeq(image2);
% 显示处理前的图像和直方图
subplot(2,4,1);
imshow(image1);
title('Original Image 1');
subplot(2,4,2);
imhist(image1);
title('Original Histogram 1');
subplot(2,4,5);
imshow(image2);
title('Original Image 2');
subplot(2,4,6);
imhist(image2);
title('Original Histogram 2');
% 显示处理后的图像和直方图
subplot(2,4,3);
imshow(equalized_image1);
title('Equalized Image 1');
subplot(2,4,4);
imhist(equalized_image1);
title('Equalized Histogram 1');
subplot(2,4,7);
imshow(equalized_image2);
title('Equalized Image 2');
subplot(2,4,8);
imhist(equalized_image2);
title('Equalized Histogram 2');
(4)读取一幅彩色图像(图片自己准备),对RGB图像的每个通道进行直方图均衡化,对均衡化后进行重新合并成彩色图像,展示不同阶段的图像效果。另将RGB图像转换为HSV图像(rgb2hsv函数),分别对三分量的图像行直方图均衡化,最后合并成新的彩色图像,分析不同阶段的图像效果。
% 读入彩色图像
rgb_image = imread('你的图片文件路径');
% 对RGB图像的每个通道进行直方图均衡化
equalized_R = histeq(rgb_image(:,:,1));
equalized_G = histeq(rgb_image(:,:,2));
equalized_B = histeq(rgb_image(:,:,3));
% 合并三个通道成彩色图像
equalized_rgb_image = cat(3, equalized_R, equalized_G, equalized_B);
% 显示不同阶段的图像效果
subplot(2,3,1);
imshow(rgb_image);
title('Original RGB Image');
subplot(2,3,2);
imshow(equalized_R);
title('Equalized Red Channel');
subplot(2,3,3);
imshow(equalized_G);
title('Equalized Green Channel');
subplot(2,3,4);
imshow(equalized_B);
title('Equalized Blue Channel');
subplot(2,3,5);
imshow(equalized_rgb_image);
title('Equalized RGB Image');
% 将RGB图像转换为HSV图像
hsv_image = rgb2hsv(rgb_image);
% 分别对HSV图像的三分量进行直方图均衡化
equalized_h = histeq(hsv_image(:,:,1));
equalized_s = histeq(hsv_image(:,:,2));
equalized_v = histeq(hsv_image(:,:,3));
% 合并三个通道成新的彩色图像
equalized_hsv_image = cat(3, equalized_h, equalized_s, equalized_v);
% 转回RGB图像
equalized_rgb_from_hsv = hsv2rgb(equalized_hsv_image);
% 显示不同阶段的图像效果
figure;
subplot(1,2,1);
imshow(equalized_rgb_image);
title('Equalized RGB Image');
subplot(1,2,2);
imshow(equalized_rgb_from_hsv);
title('Equalized RGB Image from HSV');
(5)自行设计程序实现图像的直方图均衡(选做,即不使用matlab或其它库内的相关函数实现)。
选做就是不做
2. 图像的形态学操作
2.1 实验目的与要求
目的:学习常见的数学形态学运算基本方法,了解腐蚀、膨胀、开运算、闭运算取得的效果,培养处理实际图像的能力。
2.2 实验原理及知识点
数学形态学是一种基于形状的图像处理理论和方法,数学形态学图像处理的基本思想是选择具有一定尺寸和形状的结构元素,并提取图像中相关形状结构的图像分量,以达到对图像分析和识别的目的。
膨胀和腐蚀是数学形态学图像处理的两个基本运算,其他数学形态学运算或算法均是以这两种基本运算为基础。二值图像形态学的基本运算包括膨胀、腐蚀、开运算、闭运算和击中击不中运算。在基本运算的基础上设计了多种二值形态学的实用算法,例如,去噪、边界提取、孔洞填充、连通分量的提取、骨架、凸包、细化、粗化、剪枝。灰度形态学的基本运算包括灰度膨胀、灰度腐蚀、灰度的开运算和闭运算,在基本的运算的基础上,灰度图像形态学的主要算法有顶帽变换、底帽变换和灰度形态学重构。数学形态学算法具有利于并行实现的结构,适合于并行操作,且硬件上容易实现。
在二值图像形态学中,结构元素是一个由0值和1值组成的矩阵。每一个结构元素有一个原点,结构元素中的原点指定待处理像素的位置。结构元素中的1值定义了结构元素的邻域,输出图像中对应原点的值建立在输入图像中相应像素及其邻域像素比较的基础上。在以下操作中,设Α表示二值图像,B表示结构元素,使用结构元素B对二值图像A进行操作。
2.2.1 膨胀
膨胀是将与物体接触的所有背景点合并到该物体中,使边界外部向外扩张的过程。通过膨胀,可以填充图像中的小孔及在图像边缘外的小凹陷部分。
2.2.2 腐蚀
腐蚀和膨胀是对偶操作。腐蚀是移除图像中目标边界的像素,使边界向内部收缩的过程。利用腐蚀操作,可以消除小且无意义的物体。
2.2.3 开运算
2.2.4 闭运算
2.3 实验仪器与软件
(1) PC计算机
(2) MatLab或opencv
(3) 实验所需要的图片
2.4 实验报告要求
描述实验的基本步骤,用数据和图片给出各个步骤中取得的实验结果和源代码,并进行必要的讨论,必须包括原始图像及其计算/处理后的图像。
2.5 实验内容及步骤
(1)图像膨胀
a)对包含矩形对象的二进制图像进行膨胀操作。
BW=zeros(9,10);
BW(4:6,4:7)=1;
imshow(BW,'notruesize')
se=strel('square',3);
BW2=imdilate(BW,se);
figure,imshow(BW2,'notruesize')
b)改变上述结构元素类型(如:line, diamond, disk等),重新进行膨胀操作。
Line: BW=zeros(9,10);
BW(4:6,4:7)=1;
imshow(BW,'notruesize')
se=strel('line',3,3);
BW2=imdilate(BW,se);
figure,imshow(BW2,'notruesize')
(2)图像腐蚀
a) 对图像‘circbw.tif’(系统自带图像可以直接读取)进行腐蚀操作。
BW1=imread('circbw.tif');
se=strel('arbitrary',eye(5));
BW2=imerode(BW1,se);
imshow(BW1)
figure,imshow(BW2)
b) 对图像‘text.tif’进行腐蚀操作。我的MATLAB没有自带text.tif,我换成了其他
BW=imread('text.tif');
se=strel('line',11,90);
BW2=imerode(BW3,se);
imshow(BW)
figure,imshow(BW2)
(3)膨胀与腐蚀的综合使用
a) 从原始图像‘circbw.tif’中删除电流线,仅保留芯片对象。
方法一:先腐蚀(imerode),再膨胀(imdilate);
BW1=imread('circbw.tif');
imshow(BW1)
se=strel('rectangle',[40 30]); %选择适当大小的矩形结构元素
BW2=imerode(BW1,se); %先腐蚀,删除较细的直线
figure,imshow(BW2)
BW3=imdilate(BW2,se); %再膨胀,恢复矩形的大小
figure,imshow(BW3)
方法二:使用形态开启函数(imopen)。
BW1=imread('circbw.tif');
imshow(BW1)
se=strel('rectangle',[30,20]);
BW2=imopen(BW1,se); %开启操作
figure,imshow(BW2)
b)改变结构元素的大小,重新进行开启操作,观察处理结果。
se=strel(‘rectangle’,[20 10]);
se=strel(‘rectangle’,[50 40]);
c)置结构元素大小为[4 3],同时观察形态开启(imopen)与闭合(imclose)的效果,总结形态开启与闭合在图像处理中的作用。
I=imread('circbw.tif');
imshow(I)
se=strel('rectangle',[4 3]);
I1=imopen(I,se); %开启操作
I2=imclose(I,se); %闭合操作
figure,imshow(I1)
figure,imshow(I2)
(4)利用数学形态学函数bwmorph(BW,'skel',Inf),对下面二值图像的目标提取骨架,并分析骨架结构。其中,BW表示二值图像。
图片自提:计算机视觉实验一:图像基础处理资源-CSDN文库
% 读入二值图像(替换'your_binary_image.png'为实际图像文件名)
BW = imread('your_binary_image.png');
% 提取骨架
skeleton = bwmorph(BW, 'skel', Inf);
% 显示原始图像和骨架
figure;
subplot(1, 2, 1);
imshow(BW);
title('Original Binary Image');
subplot(1, 2, 2);
imshow(skeleton);
title('Skeleton');
% 分析骨架结构
% 可以进行一些骨架结构分析,如检测骨架中的交叉点和端点。
% 以下是一个示例来检测和可视化骨架的交叉点和端点:
% 检测骨架的交叉点
branchpoints = bwmorph(skeleton, 'branchpoints');
% 检测骨架的端点
endpoints = bwmorph(skeleton, 'endpoints');
% 可视化交叉点和端点
[r_branch, c_branch] = find(branchpoints);
[r_end, c_end] = find(endpoints);
% 显示骨架,交叉点和端点
figure;
imshow(skeleton);
hold on;
% 交叉点用红色表示
plot(c_branch, r_branch, 'ro', 'MarkerSize', 10);
% 端点用蓝色表示
plot(c_end, r_end, 'bo', 'MarkerSize', 10);
title('Skeleton with Branchpoints and Endpoints');